FinaDOCS

Error Handling

Checkout and order endpoints signal business failures inside the response body, not through HTTP status codes. The error envelope and codes are identical to the Direct Merchant integration.

Error envelope

Branch on error_code, not HTTP status

Business failures return HTTP 200 with a non-zero error_code — a numeric code serialized as a JSON string ("0" is success). HTTP 4xx/5xx appears only for malformed requests or infrastructure problems.

Error response
{
  "error_code": "801",
  "errors": [
    "an order with this order_reference_id already exists"
  ],
  "message": "Order already exists",
  "data": null
}

Two endpoints use different envelopes: Check Eligibility returns HTTP 400 with { is_error: true, message } for business failures, and Get Customer Invoices signals failures with success: false and a message, with no numeric code. Each endpoint page documents its own envelope.

Error code reference

CodeNameDescriptionResolution
400INVALID_PARAMSA required field is missing or a value failed validation (e.g. totals don't reconcile, invalid phone format, unknown field value).Check errors[] for the failing field. Ensure order.total_amount equals the sum of items[].total_amount plus shipping_amount minus discount_amount.
500INTERNAL_ERRORAn unexpected failure occurred on FINA's side.Retry with backoff; contact FINA support if it persists.
801ORDER_ALREADY_EXISTSAn order with the same order_reference_id already exists. order_reference_id is the idempotency anchor.Use a fresh order_reference_id for new orders; reuse the existing order for retries.
802SELLER_NOT_VALIDThe merchant resolved from the bearer token is not recognised for this operation.Verify the bearer token belongs to the correct merchant account.
803SELLER_INACTIVEThe merchant account exists but is not active.Contact the FINA team to activate the merchant account.
804ANOTHER_CHECKOUT_IN_PROGRESSA concurrent checkout for the same buyer is already in flight.Wait for the in-flight checkout to finish, then retry.
805CUSTOMER_NOT_ONBOARDEDThe buyer has not completed FINA onboarding.Run Check Eligibility and take the buyer through the signup_url onboarding flow.
806CUSTOMER_CREDIT_LIMIT_EXCEEDEDThe buyer's available credit does not cover this order.Offer a plan with a down payment, reduce the order amount, or hide FINA for this purchase.
808INVALID_ORDERNo order was found for the given order_id / order_number.Use the order_id returned by Initiate Checkout.
809OTP_VERIFICATION_FAILEDThe OTP is wrong or has expired. Buyers get 3 verification attempts.Ask the buyer to re-enter the code, or call Resend OTP and retry Authorise Checkout.
810ANOTHER_ACTION_IN_PROGRESSA concurrent action on the same order is already in flight.Wait for the in-flight action to finish, then retry.
811INVALID_ORDER_STATEThe order is not in a state that allows this operation (e.g. authorising an expired order, confirming delivery on an unauthorised order).Check the order lifecycle; only perform operations valid for the order's current status.
812NOTIFICATION_FAILEDThe OTP SMS could not be sent to the buyer.Retry Resend OTP; verify the buyer's phone number.
813INVALID_FILEThe invoice file could not be downloaded or is not a valid PDF.Ensure invoice_url is publicly reachable and points to a valid PDF.
876MISSING_PLAN_SELECTIONNo repayment plan could be resolved for the order.Pass a repayment_config_id returned by Repayment Plan Options.
877INVALID_PLAN_SELECTIONThe repayment_config_id is invalid, or commission_config.tenure_in_days / merchant_share do not match the selected plan.Send a repayment_config_id from Repayment Plan Options and keep commission_config consistent with that plan.
878PLAN_NOT_CONFIGUREDNo repayment plan is configured for the requested tenure_in_days / channel.Only offer plans returned by Repayment Plan Options; contact FINA to configure more.
881BG_DOC_EXPIREDThe buyer's credit agreement document has expired.Send the buyer through onboarding again via Check Eligibility's signup_url.