FeePayment
POST
https://test.api.neotek.sa/b2b-unified/v1/moi/paymentSandbox URL · in Production call https://api.neotek.sa
Pays the fee. The payment settles within the call, so the response comes back PAYMENT_COMPLETED and there is nothing to poll afterwards.
Body — everything FeeInquiry takes, including the same conditional fields, plus:
| Parameter | Required | Description |
|---|---|---|
amount | Required | must match totalFee from the inquiry |
debitAccountIban | Required | the account the money leaves, SA plus 22 digits |
transactionReference | Optional | your own reference, up to 16 characters. Generated if omitted |
amount is authoritative here, unlike SADAD. SADAD ignores the amount you send and pays the actual due; MOI requires yours to match totalFee from the inquiry. Do not carry an assumption from one to the other.
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/moi/payment' \ --header 'authorization: Bearer <ACCESS_TOKEN>' \ --header 'content-type: application/json' \ --data '{ "bankCode": "RJHISARI", "billerCode": "090", "serviceCode": "003", "beneficiaryId": "2036108050", "duration": 1, "amount": "2500.00", "debitAccountIban": "SA1030000012345678901004" }'Response
JSON
{ "success": true, "code": "PAYMENT_COMPLETED", "message": "MOI payment completed successfully", "billerCode": "090", "serviceCode": "003", "beneficiaryId": "2036108050", "beneficiaryName": "أحمد محمد", "paidAmount": "2500.00", "bankReference": "BNK123456", "sadadReference": "DE1234567890", "paymentStatus": "PAYMENT_STATUS_COMPLETED", "transactionReference": "a1b2c3d4e5f6g7h8"}Errors — each failure carries an error category and a specific code
| Status | Codes | Cause |
|---|---|---|
400 ERROR_CATEGORY_VALIDATION_FAILED | INVALID_ACCOUNT, INVALID_AMOUNT, INVALID_BANK_CODE, ACCOUNT_NOT_FOUND | Unknown biller or service code, a missing conditional field, amount not matching totalFee |
401 ERROR_CATEGORY_AUTH_FAILED | AUTH_FAILED, CREDENTIALS_NOT_FOUND | Token expired, or missing account configuration for that bank |
404 ERROR_CATEGORY_NOT_FOUND | NOT_FOUND | No fee for that service and beneficiary |
409 ERROR_CATEGORY_DUPLICATE | DUPLICATE_TRANSACTION | You reused a transactionReference |
422 ERROR_CATEGORY_BANK_REJECTED | INSUFFICIENT_FUNDS, ACCOUNT_BLOCKED, PAYMENT_NOT_ALLOWED | The bank declined it |
503 ERROR_CATEGORY_TEMPORARY_FAILURE | BANK_UNAVAILABLE, NETWORK_TIMEOUT | Retry with backoff |