Errors
Error format, the full list of codes and rate limits
Every response uses the same envelope. An error:
{
"success": false,
"error": {
"code": -1007,
"type": "validation",
"message": "Request validation failed",
"details": [{ "field": "recipients.0.share", "message": "share must not be less than 1" }]
},
"meta": { "requestId": "8d0c…", "timestamp": "2026-09-25T10:00:00.000Z", "processingTimeMs": 3 }
}messagecomes in the language fromAccept-Language(uz,ru,en) and is safe to show to the user.codeis a stable numeric code. Branch your logic on it, never on the message text.meta.requestIdis what support needs. You can pass your ownx-request-idwith the request.
Ranges
Each module owns its own hundred. A whole range belongs to one topic, so you can group handling by range instead of listing codes one by one.
| Range | Topic |
|---|---|
-1001 … -1009 | Shared validation: amount, shares, UUID, PINFL, TIN, name, email, pagination |
-2001 … -2009 | Fees and shares: fee below minimum, duplicate recipients, shares not totalling 10000 |
-3001 … -3007 | Charge: status, reversal, externalId conflict, concurrent modification |
-4001 … -4004 | Business: status, not active, not found, TIN already taken |
-5001 … -5006 | Merchant: status, not active, foreign recipient, no default recipient |
-6001 … -6007 | Recipient: not found, cannot receive money, no provider account |
-7001 … -7002 | Customer: invalid externalUserId, not found |
-8001 … -8008 | Card: not active, expired, not available to the merchant, invalid mask |
-9001 … -9009 | Payment provider: declined, wrong code, unavailable, split rejected |
-10001 … -10003 | Key and token: wrong credentials, invalid token, key revoked |
-11001 … -11005 | Request: idempotency, authentication, rate limit |
-12001 … -12004 | Fiscal profile: IKPU, package code, VAT rate |
-14001 … -14005 | Webhooks: invalid URL, not configured, delivery not found |
Two more ranges never appear in the Partner API: -13001 … -13016 are admin panel accounts and
-15001 … -15005 are onboarding applications from the website.
The codes you will actually meet
| Code | HTTP | When |
|---|---|---|
-1007 | 422 | Validation failed, per-field breakdown in details |
-10001 | 401 | Wrong clientId or clientSecret |
-10002 | 401 | Token invalid or expired, fetch a new one |
-10003 | 401 | The API key was revoked in the admin panel |
-11001 | 400 | Idempotency-Key missing where it is required |
-11002 | 422 | Same Idempotency-Key with a different request body |
-11003 | 409 | A request with this key is still running, retry later |
-11005 | 429 | Rate limit, retry after Retry-After seconds |
-2006 | 422 | Shares do not add up to 10000 basis points |
-3004 | 409 | externalId already used, no second charge was created |
-3006 | 422 | The operating day is closed, reversal is no longer possible |
-3007 | 409 | The charge changed concurrently, reload it and retry |
-6004 | 422 | The recipient is not approved and cannot receive money |
-8004 | 422 | Card is not active, the binding was never confirmed |
-8006 | 403 | The card belongs to a different merchant |
-9002 | 422 | The bank rejected the card |
-9004 | 422 | The bank declined the payment, reason in failureReason |
-12004 | 422 | The merchant has no fiscal profile, no receipt can be issued |
5xx responses are safe to retry with the same Idempotency-Key.
Rate limits
| What | Limit |
|---|---|
POST /v1/auth/token | 30 per minute per clientId and 60 per minute per IP |
POST /v1/cards/{id}/confirm | 10 attempts per card per 15 minutes, on top of the shared limit |
| Everything else | 600 per minute per API key |
Over the limit you get 429 with code -11005 and a Retry-After header telling you how many
seconds to wait. Cache the token: it lives for an hour, there is no need to fetch one per request.