Skip to main content

What do SekaliPay API error codes mean?

Errors are identified by HTTP status and code. The code is in error_code for authentication and rate-limit errors, and in message for endpoint errors. Field validation errors use status 422 with an errors list per field and no code.

This page was checked against the API code as of October 16, 2026.

How many error response shapes are there?#

ShapeAppears whenCode is in
Authentication and limitsThe API key, IP, signature, or rate limit is the problemerror_code
EndpointAn endpoint's business rules reject the requestmessage
Validation (422)A request field is invalidNo code; see errors
{
  "success": false,
  "message": "Access denied. Your IP address is not whitelisted.",
  "your_ip": "203.0.113.10",
  "error_code": "IP_NOT_WHITELISTED"
}

Always send Accept: application/json

Without this header, validation errors come back as a 302 redirect to the SekaliPay home page instead of a JSON 422. A wrong URL returns an HTML 404 page.

Which error codes exist?#

HTTPCodeMeaning
401MISSING_API_KEYThe X-API-Key header was not sent.
401INVALID_API_KEYThe API key is wrong, has been replaced, or the account is not active.
403IP_WHITELIST_NOT_CONFIGUREDIP Whitelist mode is on but no IP is registered. Add an IP, or turn the whitelist off to use Enhanced HMAC.
403IP_WHITELIST_INVALIDThe account's whitelist configuration is broken. Contact support.
403IP_NOT_WHITELISTEDThe sender IP is not registered. Register the IP shown in your_ip.
401MISSING_SIGNATUREA POST request in IP Whitelist mode without an X-Signature header.
401INVALID_SIGNATUREThe body signature does not match. Sign exactly the bytes you send.
401MISSING_HMAC_SIGNATUREEnhanced HMAC mode is on but X-Signature or X-Timestamp was not sent.
401TIMESTAMP_EXPIREDX-Timestamp is more than 300 seconds away from server time. Compare it with data.server_time.
401INVALID_HMAC_SIGNATUREThe Enhanced HMAC signature does not match. Check PATH, the order and encoding of PARAMS, and the timestamp.
429RATE_LIMIT_EXCEEDEDThe per-minute limit was exceeded. Wait retry_after seconds.
403MERCHANT_KYC_INCOMPLETEMerchant verification is incomplete. data.onboarding_url points to the page to complete it.
400PAYMENT_METHOD_NOT_AVAILABLEUnknown method code, or the method is currently disabled.
403PAYMENT_METHOD_NOT_ENABLEDThe method exists but is not enabled on your account.
400AMOUNT_OUT_OF_RANGEThe amount is outside the method's range; data holds min_amount and max_amount.
409PAYMENT_ALREADY_EXISTSThis merchant_ref_id already has a payment; data contains it.
409DUPLICATE_REF_IDTwo requests with the same ref arrived at the same time and this one lost. Check that ref's status.
500PAYMENT_GATEWAY_ERRORThe payment partner rejected the request or did not answer. Nothing was stored; retry with the same ref or another method.
404PAYMENT_NOT_FOUNDNo payment with that merchant_ref_id exists on this account.
400BANK_NOT_VERIFIEDThe payout account has not been verified in the dashboard.
400BANK_DETAILS_INCOMPLETEThe payout account details are incomplete.
400INSUFFICIENT_BALANCEThe available balance is less than amount plus the fee; data.shortage is the difference.
400PENDING_SETTLEMENT_EXISTSAnother withdrawal is still in progress. Wait for it to finish.
400WITHDRAWAL_REJECTEDThe withdrawal was refused because the account changed while it was being processed. Check your balance and payout account, then try again.
503PAYOUT_UNAVAILABLEThe transfer service cannot process withdrawals right now (on our side, not your balance). Try again in a few minutes.
500INTERNAL_SERVER_ERRORAn error on our side; details are not sent. Retry, or contact support with the time and merchant_ref_id.
503SERVICE_UNAVAILABLEThe service is temporarily unavailable. Retry after Retry-After seconds.

How do I read validation errors?#

Status 422 means one or more fields are invalid. errors maps each field name to a list of messages. Messages may be in English or Indonesian, so log them for your team rather than branching on them.

422 Unprocessable Content
{
  "message": "Amount must be an integer",
  "errors": {
    "amount": [
      "Amount must be an integer"
    ]
  }
}

Which errors are safe to retry?#

StatusRetry?Notes
400, 401, 403, 404, 409, 422NoFix the request, keys, or configuration first.
429YesWait for the Retry-After header.
503YesA temporary problem on our side. Wait for Retry-After.
500 and timeoutsCarefullyPOST /payment: retry with the same merchant_ref_id, which is safe (idempotency). POST /withdrawal: never retry automatically; check your balance and history first.

Ready to use your own keys?

Sign in to the merchant dashboard to copy your API key and secret key, set the access mode and webhook URL, and download a Postman collection with your account's keys.

Sign in to the dashboard