FinaDOCS

Initiate Checkout

POST/fina/v1/checkout/initiate

Initiates a BNPL checkout session for the buyer's chosen repayment plan, creates the order, and triggers an OTP SMS to the buyer.

Plan selection & consistency

payment.repayment_config_id drives plan selection. When commission_config.use_config is true, commission_config.tenure_in_days must match the selected plan's length and merchant_share must match the value sent to Repayment Plan Options — otherwise the order is rejected with error 877. If repayment_config_id is omitted, FINA falls back to the default plan for commission_config.tenure_in_days.

Down-payment plans

If the chosen plan returned requires_prepaid_collection: true, the buyer owes the day-zero prepaid_amount upfront. Indicate how it is collected via payment.prepaid_payment.collection_method: "FINA" (FINA collects it from the buyer on a hosted payment page) or "MERCHANT" (you collect it and pass the reference in payment.prepaid_utr). For FINA collection, also send success_redirection_url and failure_redirection_url (always as a pair, both on the domain whitelisted with FINA for embedded onboarding) — the buyer lands on one of them after the hosted payment — and optionally webhook_url + webhook_secret for a signed server-to-server confirmation. The amount is echoed back in the response.

Request

objectrequired

The checkout payload.

platformenumrequired

Integration channel. Always "MERCHANT_DIRECT" for this guide.MERCHANT_DIRECT

currency_codestringlocked to "SAR"

Order currency. Optional — SAR is the only supported currency.

country_codestringlocked to "SA"

Order country. Optional — SA is the only supported country.

repayment_config_idnumber

The buyer's chosen plan from Repayment Plan Options. Falls back to the default plan when omitted.

descriptionstring

Free-text order description.

objectrequired

The buyer placing the order.

object

Your merchant details. Optional — FINA resolves the seller from your bearer token and overwrites anything you send here.

objectrequired

Order contents and totals.

objectrequired

Billing address.

objectrequired

Shipping address.

object

Commission arrangement for the order.

object

Required when the selected plan has requires_prepaid_collection: true.

prepaid_utrstring

Your payment reference for the collected down payment — required when collection_method is MERCHANT.

Response

error_codestring

Numeric code as a string; "0" on success.

errorsarray

Failure details, empty on success.

messagestring

Human-readable status.

object

The created order.

order_idstring

FINA's order identifier — used by all subsequent order operations.

order_reference_idstring

Echo of your reference.

order_statusstring

Always "CREATED" on success. OTP has been sent to the buyer.

payment_urlstring

Payment link for FINA-collected down payments; empty otherwise.

prepaid_amountnumber

Day-zero down payment owed by the buyer (0 if none).

transaction_idstring

Down-payment transaction reference, when applicable.

repayment_config_idstring

The plan actually applied to the order — echoes your selection, or the default plan when you omitted one.

Errors

Returned as HTTP 200 with a non-zero error_code — see Error Handling.

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.
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.
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.
500INTERNAL_ERRORAn unexpected failure occurred on FINA's side.Retry with backoff; contact FINA support if it persists.
Sandbox
POST /fina/v1/checkout/initiate
curl -X POST "https://apibe.silqfi.xyz/fina/v1/checkout/initiate" \
  -H "Authorization: bearer FINA_BEARER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "payment": {
      "currency_code": "SAR",
      "country_code": "SA",
      "description": "Wholesale coffee order",
      "platform": "MERCHANT_DIRECT",
      "repayment_config_id": 4,
      "buyer": {
        "phone_number": "966500000001"
      },
      "order": {
        "order_reference_id": "ORD-2026-0001",
        "source_order_number": "SRC-ORD-2026-0001",
        "total_amount": 100,
        "sub_total": 80,
        "tax_amount": 12,
        "shipping_amount": 8,
        "discount_amount": 0,
        "items": [
          {
            "title": "Arabica Coffee Beans 1kg",
            "reference_id": "SKU-CFE-1KG",
            "sku": "SKU-CFE-1KG",
            "quantity": 2,
            "unit_price": 40,
            "tax_amount": 12,
            "tax_percentage": 15,
            "total_amount": 92,
            "size": "1kg"
          }
        ]
      },
      "billing_address": {
        "first_name": "Mohammed",
        "last_name": "Al-Rashid",
        "phone_number": "966500000001",
        "address": "King Fahd Road, Al Olaya",
        "city": "Riyadh",
        "region": "Riyadh",
        "zip": "12211",
        "country_code": "SA",
        "country_name": "Saudi Arabia"
      },
      "shipping_address": {
        "first_name": "Mohammed",
        "last_name": "Al-Rashid",
        "phone_number": "966500000001",
        "address": "King Fahd Road, Al Olaya",
        "city": "Riyadh",
        "region": "Riyadh",
        "zip": "12211",
        "country_code": "SA",
        "country_name": "Saudi Arabia"
      },
      "commission_config": {
        "use_config": true,
        "tenure_in_days": 30,
        "merchant_share": 50
      },
      "prepaid_payment": {
        "collection_method": "FINA",
        "success_redirection_url": "https://merchant.example/checkout/fina/success",
        "failure_redirection_url": "https://merchant.example/checkout/fina/failure",
        "webhook_url": "https://api.merchant.example/webhooks/fina/prepaid",
        "webhook_secret": "whsec_9f2c1b4e"
      }
    }
  }'

FINA_BEARER_TOKEN is provided by the FINA team, per environment. Contact the FINA team for the production base URL.

Response · 200 · Success
{
  "error_code": "0",
  "errors": [],
  "message": "Order created successfully",
  "data": {
    "order_id": "F26070910AB3XKQ70",
    "order_reference_id": "ORD-2026-0001",
    "order_status": "CREATED",
    "payment_url": "",
    "prepaid_amount": 26.25,
    "transaction_id": "",
    "repayment_config_id": "4"
  }
}