SinglePayment
POST
https://test.api.neotek.sa/b2b-unified/v1/payments/singleSandbox URL · in Production call https://api.neotek.sa
Sends one payment from one account to one beneficiary.
Body — the payment itself:
| Parameter | Required | Description |
|---|---|---|
bankCode | Required | which bank executes the payment, by BIC: RJHISARI or ARNBSARI |
transactionReference | Required | your own reference, up to 16 characters |
paymentDate | Required | the date the payment is made |
currency | Required | for example SAR |
amount | Required | the amount as a string, for example 1000.00 |
purposeCode | Required | why the payment is being made |
transactionDescription | Optional | up to 35 characters |
chargeOption | Optional | who bears the charges: SHA (the default), OUR or BEN |
Who pays:
| Parameter | Required | Description |
|---|---|---|
debtorName | Required | up to 35 characters |
debtorAccountIban | Required | the account the money leaves |
debtorAddressLine1, debtorAddressLine2, debtorAddressLine3 | Required | up to 35 characters each |
Who is paid:
| Parameter | Required | Description |
|---|---|---|
beneficiaryName | Required | up to 35 characters |
beneficiaryAccountIban | Required | the account the money arrives in |
beneficiaryBankBic | Required | the receiving bank's BIC, 8 or 11 characters |
beneficiaryAddressLine1, beneficiaryAddressLine2, beneficiaryAddressLine3 | Required | up to 35 characters each |
Headers:
| Parameter | Required | Description |
|---|---|---|
authorization | Required | Bearer <ACCESS_TOKEN> |
content-type | Required | application/json |
cURL
curl -X POST 'https://test.api.neotek.sa/b2b-unified/v1/payments/single' \ --header 'authorization: Bearer <ACCESS_TOKEN>' \ --header 'content-type: application/json' \ --data '{ "bankCode": "ARNBSARI", "transactionReference": "TXN04540615001", "paymentDate": "2026-02-11", "currency": "SAR", "amount": "1000.00", "debtorName": "Neotek Trading Co", "debtorAccountIban": "SA1030000012345678901004", "debtorAddressLine1": "Building 123, King Fahd Road", "debtorAddressLine2": "Al Olaya District", "debtorAddressLine3": "Riyadh, Saudi Arabia", "beneficiaryName": "Ahmed Hassan Trading", "beneficiaryAccountIban": "SA1080000012345678901003", "beneficiaryBankBic": "RJHISARI", "beneficiaryAddressLine1": "Office 456", "beneficiaryAddressLine2": "Al Malaz District", "beneficiaryAddressLine3": "Riyadh, Saudi Arabia", "purposeCode": "Payroll and Benefits", "transactionDescription": "Invoice #INV-2026-001 payment" }'Response
JSON
{ "success": true, "code": "PAYMENT_ACCEPTED", "message": "Payment accepted and processing", "transactionId": "OB20260115123456", "paymentStatus": "PAYMENT_STATUS_ACCEPTED", "statusMessage": "INITIATED"}Errors — each failure carries an error category and a specific code
| Status | Codes | Typical cause |
|---|---|---|
400 ERROR_CATEGORY_VALIDATION_FAILED | INVALID_IBAN, INVALID_AMOUNT, INVALID_ACCOUNT, INVALID_CURRENCY, INVALID_BANK_CODE, INVALID_REFERENCE, ACCOUNT_NOT_FOUND, BENEFICIARY_NOT_FOUND | Bad or missing field — wrong IBAN format, unknown bankCode, reference over 16 characters |
401 ERROR_CATEGORY_AUTH_FAILED | AUTH_FAILED, CREDENTIALS_NOT_FOUND, UNAUTHORIZED | Token missing or expired, or no vault credentials for your app with that bank |
404 ERROR_CATEGORY_NOT_FOUND | NOT_FOUND | Resource not found |
409 ERROR_CATEGORY_DUPLICATE | DUPLICATE_TRANSACTION, DUPLICATE_REFERENCE, DUPLICATE_PAYMENT | You reused a transactionReference |
422 ERROR_CATEGORY_BANK_REJECTED | INSUFFICIENT_FUNDS, AMOUNT_LIMIT_EXCEEDED, DAILY_LIMIT_EXCEEDED, INVALID_PAYMENT_DATE, ACCOUNT_BLOCKED, ACCOUNT_CLOSED, PAYMENT_NOT_ALLOWED | The request was valid; the bank declined it |
500 ERROR_CATEGORY_SYSTEM_FAILURE | SYSTEM_ERROR, INTERNAL_ERROR | Gateway-side failure |
503 ERROR_CATEGORY_TEMPORARY_FAILURE | SERVICE_UNAVAILABLE, BANK_UNAVAILABLE, NETWORK_ERROR, NETWORK_TIMEOUT, CONNECTION_REFUSED, REQUEST_TIMEOUT | Transient — retry with backoff |