Back to neotek ↗Get Sandbox Access

BillPayment

POSThttps://test.api.neotek.sa/b2b-unified/v1/sadad/payment

Sandbox URL · in Production call https://api.neotek.sa

Pays the bill. The payment settles within the call, so the response comes back PAYMENT_COMPLETED and there is nothing to poll afterwards.

Body:

ParameterRequiredDescription
bankCodeRequiredwhich bank makes the payment: RJHISARI or ARNBSARI
billerCodeRequiredthe biller, as a 3-digit zero-padded code
subscriberNumberRequiredthe account with that biller, up to 30 characters
amountRequireddecimal with 2 places. See the warning below on when it is used
debitAccountIbanRequiredthe account the money leaves, SA plus 22 digits
transactionReferenceOptionalyour own reference, up to 16 characters. Generated if omitted
payExactDueOptionalboolean, defaulting to true

amount is ignored by default. payExactDue defaults to true, which tells the bank to pay whatever is actually due rather than the figure you sent. If the bill changed between your inquiry and your payment, you are debited the new amount. Reconcile against paidAmount in the response, never against the amount you requested.

Headers:

ParameterRequiredDescription
authorizationRequiredBearer <ACCESS_TOKEN>
content-typeRequiredapplication/json
cURL
curl -X POST 'https://test.api.neotek.sa/b2b-unified/v1/sadad/payment' \  --header 'authorization: Bearer <ACCESS_TOKEN>' \  --header 'content-type: application/json' \  --data '{    "bankCode": "ARNBSARI",    "billerCode": "002",    "subscriberNumber": "4210056076",    "amount": "2708.20",    "debitAccountIban": "SA1030000012345678901004"  }'

ResponsepaidAmount is what was actually debited

JSON
{  "success": true,  "code": "PAYMENT_COMPLETED",  "message": "SADAD payment completed successfully",  "billerCode": "002",  "subscriberNumber": "4210056076",  "paidAmount": "2708.20",  "paidDate": "2026-05-01",  "sadadReference": "DE1234567890",  "transactionReference": "a1b2c3d4e5f6g7h8",  "paymentStatus": "PAYMENT_STATUS_COMPLETED"}

Errors — each failure carries an error category and a specific code

StatusCodesCause
400 ERROR_CATEGORY_VALIDATION_FAILEDINVALID_ACCOUNT, INVALID_AMOUNT, INVALID_BANK_CODE, ACCOUNT_NOT_FOUNDUnknown biller code, bad subscriber number, malformed IBAN
401 ERROR_CATEGORY_AUTH_FAILEDAUTH_FAILED, CREDENTIALS_NOT_FOUNDToken expired, or missing ANB SADAD account configuration
404 ERROR_CATEGORY_NOT_FOUNDNOT_FOUNDNo bill for that biller and subscriber pair
409 ERROR_CATEGORY_DUPLICATEDUPLICATE_TRANSACTIONYou reused a transactionReference
422 ERROR_CATEGORY_BANK_REJECTEDINSUFFICIENT_FUNDS, ACCOUNT_BLOCKED, PAYMENT_NOT_ALLOWEDThe bank declined it
503 ERROR_CATEGORY_TEMPORARY_FAILUREBANK_UNAVAILABLE, NETWORK_TIMEOUTRetry with backoff