Back to neotek ↗Get Sandbox Access

BulkPayment

POSThttps://test.api.neotek.sa/b2b-unified/v1/payments/bulk

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

Sends a batch of payments in one call. Every item runs against the same bank, so bankCode sits at batch level rather than on each payment.

Body:

ParameterRequiredDescription
bankCodeRequiredwhich bank executes the batch, by BIC: RJHISARI or ARNBSARI
paymentsRequiredthe payment items, as an array

Each item takes the same fields as a single payment apart from bankCode.

The payment:

ParameterRequiredDescription
transactionReferenceRequiredyour own reference, up to 16 characters
paymentDateRequiredthe date the payment is made
currencyRequiredfor example SAR
amountRequiredthe amount as a string, for example 5000.00
purposeCodeRequiredwhy the payment is being made
transactionDescriptionOptionalup to 35 characters
chargeOptionOptionalwho bears the charges: SHA (the default), OUR or BEN

Who pays:

ParameterRequiredDescription
debtorNameRequiredup to 35 characters
debtorAccountIbanRequiredthe account the money leaves
debtorAddressLine1, debtorAddressLine2, debtorAddressLine3Requiredup to 35 characters each

Who is paid:

ParameterRequiredDescription
beneficiaryNameRequiredup to 35 characters
beneficiaryAccountIbanRequiredthe account the money arrives in
beneficiaryBankBicRequiredthe receiving bank's BIC, 8 or 11 characters
beneficiaryAddressLine1, beneficiaryAddressLine2, beneficiaryAddressLine3Requiredup to 35 characters each

Headers:

ParameterRequiredDescription
authorizationRequiredBearer <ACCESS_TOKEN>
content-typeRequiredapplication/json
cURL
curl -X POST 'https://test.api.neotek.sa/b2b-unified/v1/payments/bulk' \  --header 'authorization: Bearer <ACCESS_TOKEN>' \  --header 'content-type: application/json' \  --data '{    "bankCode": "ARNBSARI",    "payments": [      {        "transactionReference": "BULK6701A",        "paymentDate": "2026-02-11",        "currency": "SAR",        "amount": "5000.00",        "debtorName": "Neotek Trading Co",        "debtorAccountIban": "SA1030000012345678901004",        "debtorAddressLine1": "Building 123, King Fahd Road",        "debtorAddressLine2": "Al Olaya District",        "debtorAddressLine3": "Riyadh, Saudi Arabia",        "beneficiaryName": "Mohammed Ali",        "beneficiaryAccountIban": "SA1080000012345678901003",        "beneficiaryBankBic": "RJHISARI",        "beneficiaryAddressLine1": "Apartment 101",        "beneficiaryAddressLine2": "Al Rawdah District",        "beneficiaryAddressLine3": "Jeddah, Saudi Arabia",        "purposeCode": "Payroll and Benefits",        "transactionDescription": "January 2026 Salary"      }    ]  }'

Response — the batch is identified by batchReference, not a per-payment id, and cannot be enquired about for 30 minutes

JSON
{  "success": true,  "code": "PAYMENT_ACCEPTED",  "message": "Batch accepted for processing",  "batchReference": "BATCH-20260211-001",  "statusMessage": "Your payment is being processed and can be enquired after 30 minutes"}

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

StatusCodesTypical cause
400 ERROR_CATEGORY_VALIDATION_FAILEDINVALID_IBAN, INVALID_AMOUNT, INVALID_ACCOUNT, INVALID_CURRENCY, INVALID_BANK_CODE, INVALID_REFERENCE, ACCOUNT_NOT_FOUND, BENEFICIARY_NOT_FOUNDBad or missing field — wrong IBAN format, unknown bankCode, reference over 16 characters
401 ERROR_CATEGORY_AUTH_FAILEDAUTH_FAILED, CREDENTIALS_NOT_FOUND, UNAUTHORIZEDToken missing or expired, or no vault credentials for your app with that bank
404 ERROR_CATEGORY_NOT_FOUNDNOT_FOUNDResource not found
409 ERROR_CATEGORY_DUPLICATEDUPLICATE_TRANSACTION, DUPLICATE_REFERENCE, DUPLICATE_PAYMENTYou reused a transactionReference
422 ERROR_CATEGORY_BANK_REJECTEDINSUFFICIENT_FUNDS, AMOUNT_LIMIT_EXCEEDED, DAILY_LIMIT_EXCEEDED, INVALID_PAYMENT_DATE, ACCOUNT_BLOCKED, ACCOUNT_CLOSED, PAYMENT_NOT_ALLOWEDThe request was valid; the bank declined it
500 ERROR_CATEGORY_SYSTEM_FAILURESYSTEM_ERROR, INTERNAL_ERRORGateway-side failure
503 ERROR_CATEGORY_TEMPORARY_FAILURESERVICE_UNAVAILABLE, BANK_UNAVAILABLE, NETWORK_ERROR, NETWORK_TIMEOUT, CONNECTION_REFUSED, REQUEST_TIMEOUTTransient — retry with backoff