BINK API
One API for global money movement — payments, payouts, refunds, cards, customers, invoices, and the webhooks that keep your system in sync.
What the API does
The BINK REST API is the surface behind Hosted Checkout, Payment Links, card issuing, and settlement. Every resource below is backed by a real, currently-mounted route in the production service — nothing on this page describes a planned or aspirational capability.
Getting started
- Read Authentication — it explains which of your credentials actually authorizes which calls, since that differs by resource today (see the note below).
- Read Environments for how sandbox and production are separated.
- Send the request in Make your first request below.
- Wire up Webhooks so you don't have to poll.
Authentication
BINK has two separate authentication mechanisms in production today, and they do not cover the same endpoints. Mixing them up is the single most common integration mistake, so this is stated plainly rather than smoothed over:
| Mechanism | Covers | Credential |
|---|---|---|
| Dashboard session (JWT) | Payments, Payouts, Refunds, Cards, Customers, Invoices — every resource in this reference except the developer probe below | The bearer token issued when you sign in to the BINK dashboard |
API key (sk_/pk_) | GET /api/v1/developer/ping and POST /api/v1/developer/sandbox/:kind only | Authorization: Bearer sk_test_… / sk_live_… |
API-key access to the merchant resources is not live yet
The sk_test_/sk_live_ key format and its prefix-based sandbox/production split are real, working code (see Authentication). What isn't wired up yet is applying that guard to the Payments/Payouts/Refunds/Cards/Customers/Invoices routes — those currently require a signed-in dashboard session instead. If your integration calls these endpoints server-to-server today, it does so with a session token, not a long-lived API key. Expanding key-based auth to these resources is a known gap, not a documented feature — this page will be updated the day it ships.
Environments
Sandbox and production share the same base URL and the same endpoints. For the developer probe (the one place API keys work today), the key prefix — sk_test_/pk_test_ vs sk_live_/pk_live_ — decides the mode. See Environments for the full picture, including the Egypt/Global account split, which is independent of sandbox/production.
Base URL
Every route in this reference is served under one prefix, applied globally to the API:
https://binkpay.net/api/v1That's the public, browser-facing address — Next.js rewrites it to the backend service. If you call the backend directly instead of through the proxy, the same routes are reachable at the Railway-hosted origin. A path in this reference like POST /merchant/payments means POST https://binkpay.net/api/v1/merchant/payments in full; the resource pages omit the /api/v1 prefix for brevity everywhere it appears.
A machine-readable spec exists, but isn't public yet
A dynamically-generated OpenAPI 3.0 document is served at /api/v1/developer/openapi.json, and an interactive Swagger UI exists at /api/docs — but Swagger UI is intentionally disabled in production to avoid exposing the full schema for reconnaissance. Treat this reference, not a spec URL, as the current source of truth.
Versioning
The /api/v1 path prefix is the only versioning scheme currently in the codebase — there is no dated or SemVer release train, and no per-request version header. If that changes, it will be documented here rather than assumed.
Idempotency
Pass an Idempotency-Key header on POST /merchant/payments to make retries safe — a retried request with the same key returns the original response instead of creating a duplicate. Full details, including key scoping, are on Rate Limits & Idempotency.
Errors
Every error response — validation failure, auth rejection, or server fault — shares one envelope, including a requestId to reference when contacting support. See Errors for the full status-code table.
{
"ok": false,
"statusCode": 400,
"message": "amountMinor must be a positive integer string",
"requestId": "req_9f3a2b1c",
"timestamp": "2026-07-08T15:04:12.331Z"
}Rate limits
Requests are throttled per authenticated user at 600 requests per minute by default, with tighter limits on sensitive endpoints such as login. A throttled request returns 429 with a Retry-After header. See Rate Limits & Idempotency.
Webhooks
Configure an endpoint to receive real-time events instead of polling. Every delivery is signed with HMAC-SHA256 over {timestamp}.{raw body}, sent as X-Binkpay-Signature: t=…,v1=…. See Webhooks for the full event catalog and retry policy.
API resources
Create, list, retrieve, and cancel payments — the object behind Hosted Checkout and Payment Links.
Payouts & SettlementGETCheck available balance and request an off-cycle payout to your linked bank account.
RefundsPOSTIssue and list refunds against paid payments.
CardsPOSTIssue, list, fund, freeze and control cards.
CustomersGETCustomer records derived automatically from payment activity.
InvoicesPOSTLine-itemized bills for manual, out-of-band payment.
WebhooksGETSigned event delivery, retry policy, and the full event catalog.
ErrorsGETThe shared error envelope and HTTP status codes.
Rate Limits & IdempotencyGETRequest limits, the Idempotency-Key header, and 429 handling.
Make your first request
The one endpoint on this reference that genuinely accepts an API key today is the developer probe — it confirms the key works and reports which company and environment it belongs to. It requires the analytics:read scope.
curl https://binkpay.net/api/v1/developer/ping \
-H "Authorization: Bearer sk_test_51H..."A successful call returns your company ID, whether the key is live or test, and the scopes granted to it:
{
"ok": true,
"companyId": "co_4b7e21",
"livemode": false,
"scopes": ["analytics:read", "payments:read"]
}Was this page helpful?
