Omni Way developer docs v1.0.0
Reference

API Reference

Base URL https://omniway.online. Authenticate every call with Authorization: Bearer sk_test_… | sk_live_…. Amounts are integer cents; currencies USD | ZWG. Money-moving POSTs require Idempotency-Key.

Payments

POST /v1/payments ⚿ idempotent

Create a payment. Body: amount_cents*, currency, narration, merchant_ref, metadata, success_url, cancel_url. Returns the payment with code, qr_png_data_url, deep_link, ussd, checkout_url, expires_at. Guide

GET /v1/payments/:id

Retrieve one payment; refreshes live status while pending (upstream inquiry throttling handled by the platform).

GET /v1/payments

List. Query: status, merchant_ref, from, to, limit≤100, cursor. Returns { data, has_more }.

type Payment = { id, object:"payment", livemode, status, amount_cents, currency, fee_cents, narration, merchant_ref, metadata, reference, code, qr_png_data_url, deep_link, ussd, checkout_url, expires_at, paid_at, created_at }

Hosted checkout (public, unauthenticated)

GET /checkout/:payment_id

The hosted payment page. Safe to share — the unguessable id is the capability. Guide

GET /checkout/:payment_id/status

Lightweight poll the page itself uses: { status, expires_at, success_url, cancel_url }.

POST /checkout/:payment_id/mockpay · test only

Instantly settle (or expire with {"outcome":"expired"}) a sandbox payment. 403 on live payments. Guide

GET /static/pos.js

The popup snippet: POS.pay({ checkoutUrl, onSuccess, onCancel }).

Balance & reporting

GET /v1/balance

Available balance per currency for the key's mode.

GET /v1/ledger

Ledger entries. Query: entry_type, from, to, limit, cursor. Entry types

GET /v1/statement.csv

CSV with running balance. Query: from, to.

GET /v1/me

Your merchant profile: name, type, status, fee_bps, fee_fixed_cents, payout destination + verification state.

GET /v1/account/lookup?msisdn=263…&currency=USD

Resolve a phone number to InnBucks account holder name + account numbers.

Catalog (products)

POST /v1/products

Create a product. Body: name*, price_cents (null = price-at-sale), currency, barcode (unique per merchant), sku, category, track_stock, stock_qty, low_stock_at. Guide

GET /v1/products

List/search. Query: q (name/sku/barcode), barcode (exact — the scanner lookup), category, active=true|false|all, limit≤500.

GET /v1/products/:id · PATCH /v1/products/:id

Retrieve / update (name, price, barcode, tracking, active for soft-delete).

type Product = { id, object:"product", name, sku, barcode, category, price_cents, currency, track_stock, stock_qty, low_stock_at, low_stock, active, created_at }

Stock

POST /v1/stock/receive

Goods in. Body: product_id*, qty* (positive), note.

POST /v1/stock/adjust

Correction by delta (±). Body: product_id*, qty* (signed), note.

POST /v1/stock/count

Stocktake: set the absolute counted quantity; the delta is computed and journaled.

GET /v1/stock/moves

The append-only movement journal. Query: product_id, limit.

GET /v1/stock/report

On-hand units + valuation per product, totals, and the low_stock list.

Sales

POST /v1/sales ⚿ idempotent

Body: items* (array of {product_id, qty} or ad-hoc {name, qty, unit_cents}), tender*: cash | innbucks, currency, cashier, note. Cash completes instantly; innbucks returns an embedded payment (code/QR) and completes on settlement. Guide

GET /v1/sales/:id

Retrieve; pending innbucks sales refresh their payment live and finalize when paid.

GET /v1/sales

List. Query: status (pending|completed|cancelled), from, to, limit.

GET /v1/sales/report

Takings by tender + currency, top products, totals. Query: from, to.

type Sale = { id, object:"sale", livemode, status, tender, total_cents, currency, items[], cashier, note, payment_id, payment?, completed_at, created_at } · event sale.completed

Payouts

POST /v1/payouts ⚿ idempotent

Body: amount_cents*, currency. Destination is always your verified wallet. 402 if it exceeds your balance. Guide

GET /v1/payouts/:id · GET /v1/payouts

Track requested → submitted → confirmed | failed | reversed; failure_reason on failures.

type Payout = { id, object:"payout", livemode, status, amount_cents, currency, destination_account, destination_name, reference, failure_reason, submitted_at, confirmed_at, created_at }

Agent operations

POST /v1/agent/withdrawal_codes ⚿ idempotent

Body: amount_cents*, currency. Returns a claimable code + QR; balance credited on redemption. Guide

GET /v1/agent/withdrawal_codes/:id

Status: pending → redeemed | expired.

POST /v1/agent/bank_changes ⚿ idempotent

Body: amount_cents* (≤500 USD cents), currency, destination_msisdn* (263…), narration. Instant; debits your balance. Guide

Utilities

POST /v1/utilities/payments ⚿ idempotent

Body: provider*, provider_product*, amount_cents*, currency, destination_account*, narration, additional_data. Returns fees + commissions; commission auto-credited. Guide

Webhooks & events

POST /v1/webhook_endpoints

Body: url* (https; http allowed in test mode), event_types (default ["*"]). Returns the whsec_ secret — shown once. Guide

GET /v1/webhook_endpoints · DELETE /v1/webhook_endpoints/:id

List / deactivate.

GET /v1/events?since=<event_id>&limit=100

Polling fallback; oldest-first after since. Guide

type Event = { id, type, livemode, created_at, data } · header X-Pos-Event-Id · signature X-Pos-Signature: t=<unix>,v1=<hmac-sha256>

Conventions

ConventionRule
AuthAuthorization: Bearer sk_… on every /v1/* call. The key's prefix selects test vs live world.
IdempotencyRows marked ⚿ require Idempotency-Key. Same key + same body replays the stored response; same key + different body → 409. Details
MoneyInteger cents everywhere. USD | ZWG.
Paginationlimit (≤100) + cursor keyset; responses are { data, has_more }.
ErrorsOne envelope: { "error": { type, code, message } }. Reference
Rate limits60 requests / 10 s per merchant on /v1; 429 with rate_limited beyond.

Omni Way is the financial core; your storefront or till is the surface it powers. Integrate once and the same ledger, payouts and reporting work across every product you adopt.

omniway.online · InnBucksPowered by InnBucks (MicroBank Limited) · USD & ZWG.