Accounts
Open an account for a new customer
Section titled “Open an account for a new customer”Request
POST https://api-dev.spay.ng/api/v1/accountsAuthorization: Bearer <access-token>Accept: application/jsonContent-Type: application/json{ "reference": "acct-pos-0001", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "customer": { "type": "BUSINESS", "businessName": "Adunni Foods", "registrationType": "BN", "registrationNumber": "BN1234567", "email": "merchant@example.com", "phoneNumber": "+2348012345678", "owner": { "firstName": "Ada", "lastName": "Obi", "dateOfBirth": "1990-01-15", "gender": "FEMALE", "bvn": "12345678901", "nin": "98765432109" } }}curl -X POST 'https://api-dev.spay.ng/api/v1/accounts' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "reference": "acct-pos-0001", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "customer": { "type": "BUSINESS", "businessName": "Adunni Foods", "registrationType": "BN", "registrationNumber": "BN1234567", "email": "merchant@example.com", "phoneNumber": "+2348012345678", "owner": { "firstName": "Ada", "lastName": "Obi", "dateOfBirth": "1990-01-15", "gender": "FEMALE", "bvn": "12345678901", "nin": "98765432109" } }}'Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| reference | string, 1 to 100 characters | Yes | Your unique reference for this opening. |
| accountTypeId | string, UUID | Yes | An account type id whose customerType is BUSINESS. An unknown one returns 404, code 25. |
| parentAccountNumber | null | No | Absent or null for a new customer. |
| accountName | string, max 70 characters | No | The account’s name. Defaults to customer.businessName. |
| customer.type | string, BUSINESS | Yes | The customer type. |
| customer.businessName | string, 1 to 70 characters | Yes | The business’s registered name. |
| customer.registrationType | enum: BN, RC | Yes | The CAC registration type: business name or limited company. |
| customer.registrationNumber | string, 1 to 40 characters | Yes | The CAC registration number. |
| customer.email | string, email address | Yes | The business’s email address. |
| customer.phoneNumber | string | Yes | The business’s phone number. |
| customer.owner.firstName | string | Yes | The owner’s first name, as on the BVN. |
| customer.owner.lastName | string | Yes | The owner’s last name, as on the BVN. |
| customer.owner.dateOfBirth | date, YYYY-MM-DD | Yes | The owner’s date of birth. |
| customer.owner.gender | enum: MALE, FEMALE | Yes | The owner’s gender. |
| customer.owner.bvn | string, 11 digits | Yes | The owner’s BVN. |
| customer.owner.nin | string, 11 digits | Yes | The owner’s NIN. |
Response: 201 Created
{ "accountId": "11111111-1111-4111-8111-111111111111", "customerId": "22222222-2222-4222-8222-222222222222", "reference": "acct-pos-0001", "accountNumber": "8880000001", "accountName": "Adunni Foods", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "currency": "NGN", "status": "ACTIVE", "kyc": { "status": "PENDING", "tier": 1 }, "restrictions": { "debitBlocked": false, "creditBlocked": false }, "limits": { "singleTransferLimit": 50000.0, "dailyTransferLimit": 300000.0 }, "createdAt": "2026-10-25T09:00:00+01:00"}Response fields
| Field | Type | Description |
|---|---|---|
| accountId | string, UUID | The account’s id. |
| customerId | string, UUID | The customer’s id. Use it to open further accounts for this customer. |
| reference | string | The opening reference. |
| accountNumber | string, 10 digits | The account number. |
| accountName | string | The account’s name. |
| accountTypeId | string, UUID | The account type. |
| parentAccountNumber | string or null | The main account’s number for a sub-account; null for a main account. |
| currency | string, NGN | The account currency. |
| status | string | The account’s status: ACTIVE once opened. |
| kyc.status | enum: PENDING, IN_REVIEW, REJECTED, VERIFIED | PENDING until KYC is submitted with Submit the KYC pack; VERIFIED at tier 3. |
| kyc.tier | integer, 1 to 3 | The customer’s KYC tier: 1 on opening. |
| restrictions.debitBlocked | boolean | Whether debits are blocked. |
| restrictions.creditBlocked | boolean | Whether credits are blocked. |
| limits.singleTransferLimit | number or null, naira, at most 2 decimal places | The most one transfer can move. |
| limits.dailyTransferLimit | number or null, naira, at most 2 decimal places | The most the account can transfer in a day. |
| createdAt | timestamp | When the account was opened. |
- Send either
customer(a new customer) orcustomerId(an existing one, as in Open a sub-account), never both. - A refused opening opens nothing; its
referencestays unused.
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 400 | {"error":{"code":"30","message":"Account type does not match the customer"}} |
| 400 | {"error":{"code":"25","message":"BVN not found"}} |
| 400 | {"error":{"code":"25","message":"NIN not found"}} |
| 400 | {"error":{"code":"25","message":"Business registration not found"}} |
| 400 | {"error":{"code":"06","message":"The name does not match the BVN"}} |
| 400 | {"error":{"code":"06","message":"The date of birth does not match the BVN"}} |
| 400 | {"error":{"code":"06","message":"The name does not match the NIN"}} |
| 400 | {"error":{"code":"06","message":"The date of birth does not match the NIN"}} |
| 400 | {"error":{"code":"06","message":"The business name does not match its registration"}} |
| 400 | {"error":{"code":"06","message":"The business registration is not active"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 404 | {"error":{"code":"25","message":"Resource not found"}} |
| 409 | {"error":{"code":"94","message":"Reference has already been used; query the existing operation"}} |
| 409 | {"error":{"code":"26","message":"Customer already exists; open the account under the existing customer"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
Open a sub-account under the main account
Section titled “Open a sub-account under the main account”Request
POST https://api-dev.spay.ng/api/v1/accountsAuthorization: Bearer <access-token>Accept: application/jsonContent-Type: application/json{ "reference": "acct-pos-0002", "accountTypeId": "33333333-3333-4333-8333-333333333333", "customerId": "22222222-2222-4222-8222-222222222222", "parentAccountNumber": "8880000001", "accountName": "Adunni Foods - Terminal 02"}curl -X POST 'https://api-dev.spay.ng/api/v1/accounts' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "reference": "acct-pos-0002", "accountTypeId": "33333333-3333-4333-8333-333333333333", "customerId": "22222222-2222-4222-8222-222222222222", "parentAccountNumber": "8880000001", "accountName": "Adunni Foods - Terminal 02"}'Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| reference | string, 1 to 100 characters | Yes | Your unique reference for this opening. |
| accountTypeId | string, UUID | Yes | An account type id that matches the customer. |
| customerId | string, UUID | Yes | The existing customer, from an earlier opening. |
| parentAccountNumber | string, 10 digits | Yes | The customer’s main account, which must be a business account. A customer has one main account; every further account is a sub-account under it. |
| accountName | string, max 70 characters | Yes | The sub-account’s name. |
Response: 201 Created
{ "accountId": "55555555-5555-4555-8555-555555555555", "customerId": "22222222-2222-4222-8222-222222222222", "reference": "acct-pos-0002", "accountNumber": "8880000002", "accountName": "Adunni Foods - Terminal 02", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": "8880000001", "currency": "NGN", "status": "ACTIVE", "kyc": { "status": "PENDING", "tier": 1 }, "restrictions": { "debitBlocked": false, "creditBlocked": false }, "limits": { "singleTransferLimit": 50000.0, "dailyTransferLimit": 300000.0 }, "createdAt": "2026-10-25T09:00:00+01:00"}Response fields
| Field | Type | Description |
|---|---|---|
| accountId | string, UUID | The account’s id. |
| customerId | string, UUID | The customer’s id. |
| reference | string | The opening reference. |
| accountNumber | string, 10 digits | The account number. |
| accountName | string | The account’s name. A sub-account’s may differ from the accountName sent. |
| accountTypeId | string, UUID | The account type. |
| parentAccountNumber | string | The main account’s number. |
| currency | string, NGN | The account currency. |
| status | string | The account’s status: ACTIVE once opened. |
| kyc.status | enum: PENDING, IN_REVIEW, REJECTED, VERIFIED | The customer’s KYC status: PENDING until KYC is submitted, VERIFIED at tier 3. A sub-account has its main account’s. |
| kyc.tier | integer, 1 to 3 | The customer’s KYC tier. A sub-account has its main account’s. |
| restrictions.debitBlocked | boolean | Whether debits are blocked. |
| restrictions.creditBlocked | boolean | Whether credits are blocked. |
| limits.singleTransferLimit | number or null, naira, at most 2 decimal places | The most one transfer can move. |
| limits.dailyTransferLimit | number or null, naira, at most 2 decimal places | The most the account can transfer in a day. |
| createdAt | timestamp | When the account was opened. |
- A reused
referencereturns 409, code94. Find the earlier opening with Search accounts byreference.
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 400 | {"error":{"code":"30","message":"Account type does not match the customer"}} |
| 400 | {"error":{"code":"30","message":"Only a business account can have sub-accounts"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 404 | {"error":{"code":"25","message":"Resource not found"}} |
| 409 | {"error":{"code":"94","message":"Reference has already been used; query the existing operation"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
Search accounts
Section titled “Search accounts”Request
POST https://api-dev.spay.ng/api/v1/accounts/search?offset=0&limit=20Authorization: Bearer <access-token>Accept: application/jsonContent-Type: application/json{ "email": "merchant@example.com"}curl -X POST 'https://api-dev.spay.ng/api/v1/accounts/search?offset=0&limit=20' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "email": "merchant@example.com"}'Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| offset (query) | integer, at least 0 | No | How many matching accounts to skip. Default 0. Out of range returns 400, code 30. |
| limit (query) | integer, 1 to 100 | No | How many accounts to return. Default 20. Out of range returns 400, code 30. |
| string | At least one criterion | The customer’s email address. | |
| mobileNo | string | At least one criterion | The customer’s phone number. |
| bvn | string | At least one criterion | The owner’s BVN. |
| nin | string | At least one criterion | The owner’s NIN. |
| reference | string | At least one criterion | The opening reference. |
Response: 200 OK
{ "content": [ { "accountId": "11111111-1111-4111-8111-111111111111", "customerId": "22222222-2222-4222-8222-222222222222", "reference": "acct-pos-0001", "accountNumber": "8880000001", "accountName": "Adunni Foods", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "currency": "NGN", "status": "ACTIVE", "kyc": { "status": "VERIFIED", "tier": 3 }, "restrictions": { "debitBlocked": false, "creditBlocked": false }, "limits": { "singleTransferLimit": 10000000.0, "dailyTransferLimit": 10000000.0 }, "createdAt": "2026-10-25T09:00:00+01:00" } ], "count": 1, "total": 1, "last": true}Response fields
| Field | Type | Description |
|---|---|---|
| content[].accountId | string, UUID | The account’s id. |
| content[].customerId | string, UUID | The customer’s id. |
| content[].reference | string | The opening reference. |
| content[].accountNumber | string, 10 digits | The account number. |
| content[].accountName | string | The account’s name. |
| content[].accountTypeId | string, UUID | The account type. |
| content[].parentAccountNumber | string or null | The main account’s number for a sub-account; null for a main account. |
| content[].currency | string, NGN | The account currency. |
| content[].status | string | The account’s status: ACTIVE once opened. |
| content[].kyc.status | enum: PENDING, IN_REVIEW, REJECTED, VERIFIED | The customer’s KYC status: PENDING until KYC is submitted, VERIFIED at tier 3. |
| content[].kyc.tier | integer, 1 to 3 | The customer’s KYC tier. |
| content[].restrictions.debitBlocked | boolean | Whether debits are blocked. |
| content[].restrictions.creditBlocked | boolean | Whether credits are blocked. |
| content[].limits.singleTransferLimit | number or null, naira, at most 2 decimal places | The most one transfer can move. |
| content[].limits.dailyTransferLimit | number or null, naira, at most 2 decimal places | The most the account can transfer in a day. |
| content[].createdAt | timestamp | When the account was opened. |
| count | integer | The number of accounts on this page. |
| total | integer | The number of matching accounts. |
| last | boolean | Whether this is the last page. |
- At least one criterion is required. An account matching any one of them is returned.
- Only
referencefinds sub-accounts. - Accounts are listed newest first.
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
List accounts
Section titled “List accounts”Request
GET https://api-dev.spay.ng/api/v1/accounts?offset=0&limit=20Authorization: Bearer <access-token>Accept: application/jsoncurl 'https://api-dev.spay.ng/api/v1/accounts?offset=0&limit=20' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json"No request body.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| offset (query) | integer, at least 0 | No | How many accounts to skip. Default 0. Out of range returns 400, code 30. |
| limit (query) | integer, 1 to 100 | No | How many accounts to return. Default 20. Out of range returns 400, code 30. |
Response: 200 OK
{ "content": [ { "accountId": "11111111-1111-4111-8111-111111111111", "customerId": "22222222-2222-4222-8222-222222222222", "reference": "acct-pos-0001", "accountNumber": "8880000001", "accountName": "Adunni Foods", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "currency": "NGN", "status": "ACTIVE", "kyc": { "status": "VERIFIED", "tier": 3 }, "restrictions": { "debitBlocked": false, "creditBlocked": false }, "limits": { "singleTransferLimit": 10000000.0, "dailyTransferLimit": 10000000.0 }, "createdAt": "2026-10-25T09:00:00+01:00" } ], "count": 1, "total": 1, "last": true}Response fields
| Field | Type | Description |
|---|---|---|
| content[].accountId | string, UUID | The account’s id. |
| content[].customerId | string, UUID | The customer’s id. |
| content[].reference | string | The opening reference. |
| content[].accountNumber | string, 10 digits | The account number. |
| content[].accountName | string | The account’s name. |
| content[].accountTypeId | string, UUID | The account type. |
| content[].parentAccountNumber | string or null | The main account’s number for a sub-account; null for a main account. |
| content[].currency | string, NGN | The account currency. |
| content[].status | string | The account’s status: ACTIVE once opened. |
| content[].kyc.status | enum: PENDING, IN_REVIEW, REJECTED, VERIFIED | The customer’s KYC status: PENDING until KYC is submitted, VERIFIED at tier 3. |
| content[].kyc.tier | integer, 1 to 3 | The customer’s KYC tier. |
| content[].restrictions.debitBlocked | boolean | Whether debits are blocked. |
| content[].restrictions.creditBlocked | boolean | Whether credits are blocked. |
| content[].limits.singleTransferLimit | number or null, naira, at most 2 decimal places | The most one transfer can move. |
| content[].limits.dailyTransferLimit | number or null, naira, at most 2 decimal places | The most the account can transfer in a day. |
| content[].createdAt | timestamp | When the account was opened. |
| count | integer | The number of accounts on this page. |
| total | integer | The number of your accounts. |
| last | boolean | Whether this is the last page. |
- Accounts are listed newest first.
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
Get account details
Section titled “Get account details”Request
GET https://api-dev.spay.ng/api/v1/accounts/8880000001Authorization: Bearer <access-token>Accept: application/jsoncurl 'https://api-dev.spay.ng/api/v1/accounts/8880000001' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json"No request body.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber (path) | string, 10 digits | Yes | One of your accounts. A malformed number returns 400, code 30. |
Response: 200 OK
{ "accountId": "11111111-1111-4111-8111-111111111111", "customerId": "22222222-2222-4222-8222-222222222222", "reference": "acct-pos-0001", "accountNumber": "8880000001", "accountName": "Adunni Foods", "accountTypeId": "33333333-3333-4333-8333-333333333333", "parentAccountNumber": null, "currency": "NGN", "status": "ACTIVE", "kyc": { "status": "VERIFIED", "tier": 3 }, "restrictions": { "debitBlocked": false, "creditBlocked": false }, "limits": { "singleTransferLimit": 10000000.0, "dailyTransferLimit": 10000000.0 }, "createdAt": "2026-10-25T09:00:00+01:00"}Response fields
| Field | Type | Description |
|---|---|---|
| accountId | string, UUID | The account’s id. |
| customerId | string, UUID | The customer’s id. |
| reference | string | The opening reference. |
| accountNumber | string, 10 digits | The account number. |
| accountName | string | The account’s name. |
| accountTypeId | string, UUID | The account type. |
| parentAccountNumber | string or null | The main account’s number for a sub-account; null for a main account. |
| currency | string, NGN | The account currency. |
| status | string | The account’s status: ACTIVE once opened. |
| kyc.status | enum: PENDING, IN_REVIEW, REJECTED, VERIFIED | The customer’s KYC status: PENDING until KYC is submitted, VERIFIED at tier 3. |
| kyc.tier | integer, 1 to 3 | The customer’s KYC tier. |
| restrictions.debitBlocked | boolean | Whether debits are blocked. |
| restrictions.creditBlocked | boolean | Whether credits are blocked. |
| limits.singleTransferLimit | number or null, naira, at most 2 decimal places | The most one transfer can move. |
| limits.dailyTransferLimit | number or null, naira, at most 2 decimal places | The most the account can transfer in a day. |
| createdAt | timestamp | When the account was opened. |
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 404 | {"error":{"code":"25","message":"Resource not found"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
Get account balances
Section titled “Get account balances”Request
GET https://api-dev.spay.ng/api/v1/accounts/8880000001/balancesAuthorization: Bearer <access-token>Accept: application/jsoncurl 'https://api-dev.spay.ng/api/v1/accounts/8880000001/balances' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json"No request body.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber (path) | string, 10 digits | Yes | One of your accounts. A malformed number returns 400, code 30. |
Response: 200 OK
{ "accountNumber": "8880000001", "currency": "NGN", "availableBalance": 10000.0, "pendingSettlementBalance": 2500.0, "heldBalance": 1000.0, "nextExpectedSettlementDate": "2026-10-26", "asOf": "2026-10-25T09:20:00+01:00"}Response fields
| Field | Type | Description |
|---|---|---|
| accountNumber | string, 10 digits | The account number. |
| currency | string, NGN | The balance currency. |
| availableBalance | number, naira, at most 2 decimal places | What the account can spend now. Excludes held money and accepted transfers. |
| pendingSettlementBalance | number or null, naira, at most 2 decimal places | Card proceeds not yet settled. Null while card settlement isn’t available. |
| heldBalance | number, naira, at most 2 decimal places | Money held against pending debits. 0 when nothing is held. |
| nextExpectedSettlementDate | date, YYYY-MM-DD, or null | When the next card settlement is expected. Null while card settlement isn’t available. |
| asOf | timestamp | When the figures were taken. |
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 404 | {"error":{"code":"25","message":"Resource not found"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |
Get account transactions
Section titled “Get account transactions”Request
GET https://api-dev.spay.ng/api/v1/accounts/8880000001/transactions?from=2026-10-01&to=2026-10-25&offset=0&limit=20Authorization: Bearer <access-token>Accept: application/jsoncurl 'https://api-dev.spay.ng/api/v1/accounts/8880000001/transactions?from=2026-10-01&to=2026-10-25&offset=0&limit=20' \ -H "Authorization: Bearer $SPAY_ACCESS_TOKEN" \ -H "Accept: application/json"No request body.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
| accountNumber (path) | string, 10 digits | Yes | One of your accounts. A malformed number returns 400, code 30. |
| from (query) | date, YYYY-MM-DD | No | The first day to include, inclusive, in Africa/Lagos time, by when the transaction was recorded. Omit it for the full history. |
| to (query) | date, YYYY-MM-DD | No | The last day to include, inclusive, in Africa/Lagos time. Omit it for up to today. |
| offset (query) | integer, at least 0 | No | How many transactions to skip. Default 0. Out of range returns 400, code 30. |
| limit (query) | integer, 1 to 100 | No | How many transactions to return. Default 20. Out of range returns 400, code 30. |
Response: 200 OK
{ "content": [ { "reference": "pay-pos-0001", "originalReference": null, "ownerAccountNumber": "8880000001", "type": "INTERBANK_TRANSFER", "mode": "DEBIT", "status": "SUCCESSFUL", "reviewRequired": false, "amount": 1000.0, "feeAmount": 1.25, "currency": "NGN", "source": { "accountNumber": "8880000001", "accountName": "Adunni Foods" }, "beneficiary": { "accountNumber": "0123456789", "accountName": "Example Beneficiary", "institutionCode": "000013", "institutionName": "Example Bank" }, "narration": "POS payment", "failureReason": null, "transactionDate": "2026-10-25T09:15:00+01:00", "updatedAt": "2026-10-25T09:15:30+01:00" } ], "count": 1, "total": 1, "last": true}Response fields
| Field | Type | Description |
|---|---|---|
| content[].reference | string | The transaction’s reference: yours for a transfer you made. |
| content[].originalReference | string or null | Set on a reversal: the reference of the transaction it reverses. |
| content[].ownerAccountNumber | string, 10 digits | The account the transaction belongs to. |
| content[].type | enum: INTERBANK_TRANSFER, INTRABANK_TRANSFER, BILL_PAYMENT_DEBIT, BILL_PAYMENT_REVERSAL | What kind of transaction it is. |
| content[].mode | enum: DEBIT, CREDIT | Whether money left or reached the account. |
| content[].status | enum: PENDING, SUCCESSFUL, FAILED, REVERSED | The transaction’s status. |
| content[].reviewRequired | boolean | true while Spay establishes the outcome of a PENDING transaction. |
| content[].amount | number, naira, at most 2 decimal places | The amount. |
| content[].feeAmount | number, naira, at most 2 decimal places | The fee charged on the transaction, net of any refund. 0 when no fee was charged. |
| content[].currency | string, NGN | The currency. |
| content[].source.accountNumber | string or null | The account the money came from. |
| content[].source.accountName | string or null | That account’s name. |
| content[].source.institutionCode | string, omitted for the owner account | The sending institution’s code. |
| content[].source.institutionName | string, omitted for the owner account | The sending institution’s name. |
| content[].beneficiary.accountNumber | string or null | The account the money went to. |
| content[].beneficiary.accountName | string or null | That account’s name. |
| content[].beneficiary.institutionCode | string, omitted for the owner account | The receiving institution’s code. |
| content[].beneficiary.institutionName | string, omitted for the owner account | The receiving institution’s name. |
| content[].narration | string, may be empty | The transaction’s narration. |
| content[].failureReason | enum: INSUFFICIENT_FUNDS, SOURCE_ACCOUNT_UNAVAILABLE, BENEFICIARY_UNAVAILABLE, CANCELLED, PROCESSING_ERROR, or null | Why a FAILED transaction failed; null otherwise. |
| content[].transactionDate | timestamp | When the transaction happened. |
| content[].updatedAt | timestamp | When the transaction last changed. |
| count | integer | The number of transactions on this page. |
| total | integer | The number of matching transactions. |
| last | boolean | Whether this is the last page. |
- Transactions are listed newest first.
Errors
| HTTP status | Body |
|---|---|
| 400 | {"error":{"code":"30","message":"Invalid request"}} |
| 401 | {"error":{"code":"63","message":"Missing, invalid or expired access token"}} |
| 403 | {"error":{"code":"63","message":"Operation not permitted"}} |
| 404 | {"error":{"code":"25","message":"Resource not found"}} |
| 503 | {"error":{"code":"91","message":"Service unavailable"}} |