Errors ​

When an API request cannot be completed successfully, the response body describes the failure and the HTTP status code tells you how to handle it.

Every error response includes a correlationId. Send this value to Bui support when you need help with a failed request. If the request contains request-id, x-request-id, or x-idempotence-key, that value is reused as the correlationId; otherwise the API generates one.

Business errors can also include a causationId, which identifies the exact internal error occurrence.

Error response ​

json
{
  "error": "Conflict",
  "statusCode": 409,
  "correlationId": "d84caf0f-0941-4998-8376-68c7c9ab7913",
  "causationId": "de0c0e48-b9bb-46d6-9b6e-341b7b687473",
  "message": "payment can not processed, recipient not match with selected service PAYIN_ORANGE_CI"
}
FieldDescription
statusCodeHTTP status code returned by the API.
errorShort HTTP error label, for example Unauthorized, Forbidden, Not Found, Conflict, or Unprocessable Entity.
messageHuman-readable explanation. The language can change with the Accept-Language header when translation is available.
correlationIdRequest tracking identifier. Keep it in your logs.
causationIdBusiness error tracking identifier. It is present only on domain/business errors.
subErrorsValidation details. It is present only on validation errors.

HTTP status codes ​

StatusErrorWhen it can happen
400Bad RequestThe request is syntactically valid JSON but cannot be accepted for the requested action.
401UnauthorizedMissing token, invalid token format, expired/unknown token, invalid internal API key, or environment mismatch.
403ForbiddenThe company, wallet, payment intent, payment, transfer, or transaction state does not authorize the operation.
404Not FoundThe requested resource or referenced business object does not exist.
409ConflictDuplicate reference/idempotence key, amount outside allowed limits, already existing subscription, or payment/transfer that cannot be processed.
422Unprocessable EntityRequest body validation failed.
429Too Many RequestsToo many requests were sent in a short period of time. Retry later.
500Internal Server ErrorUnexpected internal failure. Retry only if the operation is safe to repeat, and contact support with the correlationId if it persists.

Authentication errors ​

Requests protected with Bearer authentication return 401 when the Authorization header is missing, not using Bearer, using an invalid token prefix, or when the token does not match an active company.

json
{
  "statusCode": 401,
  "message": "unauthenticated",
  "error": "Unauthorized",
  "correlationId": "dd2d2d17-4ea3-4e45-bd3e-994b949ccb5c"
}

Validation errors ​

Validation errors return 422 with subErrors. These errors are usually caused by missing required fields, invalid service identifiers, invalid URLs, invalid phone numbers, non-positive amounts, or invalid enum values such as paymentMethod or transferMethod.

json
{
  "statusCode": 422,
  "message": "Validation error",
  "error": "Unprocessable Entity",
  "subErrors": [
    "mobileMoney.amount must be a positive number",
    "mobileMoney.recipient must be a valid phone number"
  ],
  "correlationId": "7a00d969-c5dd-4d80-a445-5939ed13c03d"
}

Business error catalogue ​

The table below lists the business error codes currently mapped by the public API error handler. Some API responses expose only the HTTP statusCode, error, message, correlationId, and causationId; keep the correlationId and the request payload in your logs so support can match the response to the internal code.

HTTP statusReference codeMeaning
400PAYMENT.NOT_MATCHThe payment does not match the expected transaction or provider context.
401GENERIC.UNAUTHENTICATEDThe request is not authenticated.
403WALLET.BALANCE_REACH_LIMITThe wallet balance limit has been reached.
403WALLET.NOT_ENOUGH_FUNDThe wallet does not have enough available funds.
403TRANSACTION.NOT_PENDINGThe transaction is no longer pending, so the operation is not allowed.
403TRANSACTION.NOT_MATCHThe transaction does not match the expected payment or transfer.
403PAYMENT.INVALID_STATUSThe payment is not in the status required for the operation.
403PAYMENT_INTENT.NOT_INITIATEDThe payment intent has not been initiated.
403PAYMENT_INTENT.EXPIREDThe payment intent has expired.
404SERVICE.NOT_EXISTThe selected service does not exist or is not available.
404WALLET.NOT_EXISTThe wallet does not exist.
404TRANSFER.NOT_EXISTThe transfer does not exist.
404PAYMENT.NOT_EXISTThe payment does not exist.
404TRANSACTION.NOT_EXISTThe transaction does not exist.
404WEBHOOK_SUBSCRIPTION.NOT_EXISTThe webhook subscription does not exist.
404PAYMENT_INTENT.NOT_EXISTThe payment intent does not exist.
409TRANSFER.DUPLICATEA transfer already exists for the same idempotence key or reference.
409PAYMENT.DUPLICATEA payment already exists for the same idempotence key or reference.
409TRANSFER.AMOUNT_NOT_CORRECTThe transfer amount is outside the allowed service limits.
409PAYMENT.AMOUNT_NOT_CORRECTThe payment amount is outside the allowed service limits.
409WEBHOOK_SUBSCRIPTION.ALREADY_EXISTA webhook subscription already exists for the same company and environment.
409PAYMENT_INTENT.EXISTA payment intent already exists for the same reference.
409PAYMENT.CAN_NOT_PROCESSThe payment cannot be processed with the selected service, provider, market, phone number, or payment method.
409TRANSFER.CAN_NOT_PROCESSThe transfer cannot be processed with the selected service, provider, market, phone number, wallet, or transfer method.
409GENERIC.CONFLICTThe request conflicts with the current state of the resource.

Integration guidance ​

Use the HTTP status code first when deciding how to react:

Status familyRecommended handling
400 / 422Fix the request payload before retrying.
401Regenerate or correct the API token, then retry.
403Do not retry automatically. The account, wallet, transaction, payment, or payment intent state must change first.
404Verify the identifier, environment, service, or resource ownership.
409Check idempotency, duplicate references, service limits, selected provider, and current transaction state before retrying.
429Retry after a delay with backoff.
500Retry only when the operation is idempotent, then contact support with the correlationId if the error continues.