OnLink

Changelog

What changed, and what counts as a breaking change.

API stability

We version the API in the path (/v1). Within a version:

Breaking changes — we will not make these without notice and a migration path:

  • removing or renaming a field, an endpoint or an error code;
  • changing the meaning or type of an existing field;
  • adding a required request field;
  • changing the signing algorithm or the string to sign;
  • removing an order status or a webhook event type.

Additive changes — we make these without notice, and your integration must tolerate them:

  • new optional request fields;
  • new response fields;
  • new webhook event types;
  • new endpoints;
  • new error codes.

Two obligations this puts on you

Ignore fields you do not recognise, and ignore webhook type values you do not recognise. A client that rejects an unknown field or event breaks on a change that is not supposed to break anything.

Changes are announced here and by email to your registered contact.

Changes

2026-09-15

  • Fees are itemised. POST /v1/quotes, both order create routes and GET /v1/orders/{id} now return a fee object and a kesTotalAmount beside the existing kesAmount. kesAmount keeps its meaning — the trade principal — and kesTotalAmount is the figure that moves: principal plus the fee on a buy, less the fee on a sell. See Fees.
  • On a buy, kesTotalAmount is what we debit. The buy leg takes the KES from your own balance, so there is nothing for you to send — but the total is the figure that leaves the account and the one to reconcile against. Size your balance against it too: one that covers only kesAmount is refused with INSUFFICIENT_KES_BALANCE.
  • On a sell, kesTotalAmount is what we pay into your account, so it is the figure to reconcile a bank statement against.
  • Webhook payloads carry feeKesAmount and kesTotalAmount. Both are additive; the pricing terms themselves are not published in the payload.
  • usdtAmount and rate are unchanged by any of this. The fee is charged in KES, on the KES side, on both legs — it is a separate named component and it does not move the rate.
  • Two new errors: 422 FEE_EXCEEDS_PROCEEDS when a sell's fee would consume the whole payout, and 503 FEE_PRICING_INVALID. See the error catalogue.

2026-09-04

  • Documentation: a plain-language Overview section — what the API is, how an order works, use cases, a glossary and an FAQ — for product, finance and compliance readers, and a rewritten welcome page.
  • Documentation: webhooks, signature verification, authentication and the error catalogue are documented. The reference is ordered by integration workflow and the OpenAPI spec is downloadable.

2026-09-02

  • POST /v1/orders/buy — create a buy order against a quote. Both legs now have a create route.

2026-09-01

  • Outbound webhooks: order.funds_confirmed, order.settled, order.rejected and order.expired, signed with HMAC-SHA256 and retried.
  • Partner API documentation published.

On this page