Skip to main content
POST
Attach a receipt or invoice

Authorizations

Authorization
string
header
required

Server API key, scoped. pk_test_ keys hit the sandbox tenant.

Headers

X-Request-Id
string

Optional client correlation id, up to 128 characters. It is not echoed: the response's X-Request-Id is always our own req_… id. We log your value with the request as client_request_id, so support can find a request by either id. A longer value is refused with 400 parameter_invalid.

Maximum string length: 128
Idempotency-Key
string

Optional on non-money POSTs; honoured when sent.

Required string length: 1 - 255

Path Parameters

transaction_id
string
required

Transaction.

Pattern: ^txn_[0-9A-HJKMNP-TV-Z]{26}$

Body

application/json

"Attach it so your accountant sees why this was paid."

document_id
string
required

An uploaded doc_… with purpose transaction_attachment.

Pattern: ^doc_[0-9A-HJKMNP-TV-Z]{26}$

Response

OK.

One movement on the business's accounts, as customers see it (Transactions, account Activity). Read-only view of payments, collections and other account movements. Carries the ISO 8583 outcome of the underlying movement: 09 while pending_approval/scheduled/processing, 01 while a status query is unresolved, 00 when completed, the bank's NIP code (or ours) when failed or rejected.

response_code
enum<string>
required

Two-character ISO 8583 response code, using the NIBSS NIP meanings (CONVENTIONS §7a). 00 is success. Carried on every error (mapped from error.code, see errors.yaml x-codes) and on every money-movement object (the bank's final code, or our own while it is in flight). Clients must tolerate codes added later.

Available options:
00,
01,
03,
05,
06,
07,
08,
09,
12,
13,
14,
15,
16,
17,
21,
25,
26,
30,
34,
35,
51,
57,
58,
61,
63,
65,
68,
91,
92,
94,
96,
97
Pattern: ^[0-9A-Z]{2}$
response_message
string
required

Standard meaning of the code (the x-codes text), not customer copy. Customer-safe wording is in status_reason / error.message.

Example:

"Approved or completed successfully"

id
string
required

Transaction id.

Pattern: ^txn_[0-9A-HJKMNP-TV-Z]{26}$
object
string
required

Always transaction.

Allowed value: "transaction"
created_at
string<date-time>
required

When it was created.

Example:

"2026-10-27T08:41:00Z"

updated_at
string<date-time>
required

When it was created.

Example:

"2026-10-27T08:41:00Z"

type
enum<string>
required

payout: money out to another bank (single or part of a batch, pay run or agent payment).

Available options:
payout,
collection,
transfer,
fee,
reversal,
conversion,
card
status
enum<string>
required

Lifecycle (CONVENTIONS §8). UI labels: completed → "Settled", processing → "Processing", pending_approval → "Pending approval".

Available options:
draft,
pending_approval,
scheduled,
processing,
completed,
failed,
rejected,
canceled,
reversed
direction
enum<string>
required

in: money into account_id. out: money out of account_id. internal: from account_id to counterparty.account_id, both the business's own.

Available options:
in,
out,
internal
amount
object
required

Always positive; sign comes from direction and the account viewed. A failed payout shows its original amount; its money is back ("Failed, money returned").

account_id
string
required

Account debited (out, internal) or credited (in).

Pattern: ^acc_[0-9A-HJKMNP-TV-Z]{26}$
account_display_name
string
required

"Naira · Main".

counterparty
object
required

The other side of a transaction.

description
string
required

Main line in lists, e.g. "Kano Freight Services" or "Naira · Main to Naira · Payroll".

reference
string | null
required

Second line and "Narration": invoice number, payment reference or note sent with the payment, e.g. "INV-0142", "Diesel supply".

source
object
required

Where the transaction came from.

attachment_document_ids
string[]
required

"Receipt or invoice" files attached.

A doc_… with purpose transaction_attachment.

Pattern: ^doc_[0-9A-HJKMNP-TV-Z]{26}$
events
object[]
required

Progress timeline, oldest first.

livemode
boolean
required

False for sandbox (TEST) transactions.

fee
object | null

Fee charged on top, if any.

initiated_by
object | null

"Created by".

approved_by
object | null

Second approver, when the payment needed one.

category
string | null

Spending or income category, e.g. "Fuel", "Sales".

Maximum string length: 40
note
string | null

"Note" added by the team.

Maximum string length: 500
failure
object | null

Why it failed, safe to show. Null unless failed.

nip_session_id
string | null

NIP session id (30 digits) for NIP transfers.

Pattern: ^\d{30}$
completed_at
string<date-time> | null

When it settled.