Introduction
The Zuba Payment Platform API is organized around REST principles: predictable, resource-oriented URLs; JSON-encoded requests and responses; and standard HTTP response codes, authentication, and verbs.Base URL
Production:Authentication
The Zuba API uses the OAuth 2.0 Client Credentials flow for authentication. You can generate your credentials in the Zuba Dashboard (Sandbox) or Production Dashboard. See our Authentication Guide for detailed instructions on obtaining access tokens. Include your access token in theAuthorization header:
Request Format
All POST requests should include theContent-Type header:
Response Format
All responses are returned in JSON format:Example Success Response
The example below is the response body ofGET /v1/ledger/balances. Monetary values are always decimal strings, never JSON numbers:
Error Response
Most errors use a JSON envelope withstatusCode, message, and error fields. Validation errors also carry a details array identifying the offending fields:
Idempotency-Key errors and all unexpected 500s, are returned as RFC 9457 problem details instead, with Content-Type: application/problem+json and a different body shape:
Content-Type header and handle both shapes: a parser keyed exclusively on message and statusCode will break on application/problem+json responses. On problem responses, branch on type or code, and use retryable to decide whether a retry can succeed.
HTTP Status Codes
The Zuba API uses conventional HTTP response codes:Rate Limits
Requests are rate limited across three windows:
Exceeding any window returns HTTP
429 Too Many Requests. Back off and retry with exponentially increasing delays.
Pagination
List endpoints use cursor pagination. Results are ordered newest first. Pass thenextCursor returned by the previous page as cursor to fetch the
next page.
Request Parameters
cursor- Opaque cursor returned by the previous pagelimit- Number of items per page (minimum 1, maximum 100, default 20)
Example Response Format
hasMore is true, pass nextCursor as cursor on the next request.
When hasMore is false, nextCursor is null.
Idempotency
Two mechanisms prevent duplicate payouts:clientRef deduplication
Every payout must carry a uniqueclientRef. A request that reuses an existing clientRef is rejected with HTTP 400, so a resubmission can never create a duplicate payout.
Idempotency-Key header
POST /v1/payouts also accepts an optional Idempotency-Key header, a client-generated key scoped to your workspace:
- Same key, same body: the original response is replayed; no second payout is created.
- Same key, different body: rejected with HTTP
422(IDEMPOTENCY_KEY_REUSED). - Repeat while the first request is still in flight: HTTP
409(retryable); retry the identical request to receive the stored response. - Keys expire 24 hours after the original request completes; a repeat after expiry is treated as a new request.
Webhooks
The Zuba API sends webhook notifications for events such as payout status changes. Every delivery is a JSON POST with this envelope:API Versioning
The API version is specified in the URL path. All endpoints are served under/v1:
FX and ledger endpoints were historically served at unversioned paths
(
/fx/..., /ledger/...). Those legacy URLs continue to work as aliases of
the canonical /v1/fx/... and /v1/ledger/... paths, but are deprecated:
use the /v1 form in new integrations.Testing
Use Sandbox credentials for development:- Sandbox Dashboard:
https://sandbox.zuba.com - Sandbox Base URL:
https://api.sandbox.zuba.com - Sandbox Token URL:
https://zuba-test.us.auth0.com/oauth/token
- Simulated payment processing
- No real money movement
- Access to test data and scenarios
- Webhook testing capabilities
Support
Need help with integration? Contact our team:- Email: support@zuba.com
- Documentation: Browse the complete API reference below
Next Steps
Quickstart Guide
Send your first payout in minutes
Payouts
Send money globally to beneficiaries
Ledger System
Double-entry accounting and transaction tracking
Webhooks
Receive real-time event notifications