Appearance
Operations
List your operations, newest first
GET
/api/v1/tenant/operationsScope operations:read
Paginated. Every operation you created, in any state. customerUid and walletUid narrow within your own operations; a value outside your account matches nothing.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
customerUid | string | no | Customer the operation belongs to |
walletUid | string | no | Wallet the operation touches (source or destination) |
type | string | no | Operation type code |
state | string | no | Operation state |
from | string | no | ISO-8601 instant, inclusive lower bound on createdAt |
to | string | no | ISO-8601 instant, inclusive upper bound on createdAt |
page | number | no | Page to retrieve, 1-based. Example: 1 Default Value: 1 |
limit | number | no | Records per page. Values above the maximum are clamped, not rejected. Default Value: 20 Max Value: 100 |
sortBy | enum[] | no | Sort key. Repeat the param to sort by several fields; URL order sets precedence. Format: fieldName:DIRECTION Example: sortBy=createdAt:DESC&sortBy=id:ASC Default Value: createdAt:DESC,id:DESC Available Fields createdAt id Any other field is rejected with 400. |
Response · 200
| Field | Type | Description |
|---|---|---|
data | object[] | |
data[].uid | string | |
data[].type | string | Operation type, e.g. wallet_credit, wallet_debit, payout_b2c or topup_c2b. |
data[].state | string | Operation state: created, awaiting_authorization, authorized, held, processing, pending_provider, confirmed, failed, reversed or completed. |
data[].amountMinor | number | Integer minor units (e.g. 250000 = ETB 2,500.00). |
data[].feeMinor | number | Minor units. |
data[].taxMinor | number | Minor units. |
data[].currency | string | ISO-4217. |
data[].clientReference | string | null | Your reference, exactly as you supplied it. |
data[].createdAt | string | |
data[].completedAt | string | null | When the operation first reached a final state. |
data[].links | object | |
data[].links.self | string | API-relative path of this operation (GET /tenant/operations/{uid}). |
data[].links.receipt | string | API-relative path of its receipt (GET /tenant/operations/{uid}/receipt). |
meta | object | |
meta.total | number | |
meta.page | number | |
meta.limit | number | |
meta.totalPages | number |
Example (generated from the schema)
json
{
"data": [
{
"uid": "01J9Z3K5X8QW2R4T6V8Y0B1C3D",
"type": "string",
"state": "string",
"amountMinor": 0,
"feeMinor": 0,
"taxMinor": 0,
"currency": "ETB",
"clientReference": "string",
"createdAt": "2026-09-03T10:15:30.000Z",
"completedAt": "2026-09-03T10:15:30.000Z",
"links": {
"self": "string",
"receipt": "string"
}
}
],
"meta": {
"total": 42,
"page": 1,
"limit": 20,
"totalPages": 3
}
}Errors
400 401 403 404 429 500 503 — one body shape for all of them, see Errors.
Get one operation's status and state timeline
GET
/api/v1/tenant/operations/{uid}Scope operations:read
The operation as it appears in the list, plus timeline (every state change in order) and, for an operation that went through a payment provider, provider (null for internal operations).
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
uid | string | yes |
Response · 200
| Field | Type | Description |
|---|---|---|
uid | string | |
type | string | Operation type, e.g. wallet_credit, wallet_debit, payout_b2c or topup_c2b. |
state | string | Operation state: created, awaiting_authorization, authorized, held, processing, pending_provider, confirmed, failed, reversed or completed. |
amountMinor | number | Integer minor units (e.g. 250000 = ETB 2,500.00). |
feeMinor | number | Minor units. |
taxMinor | number | Minor units. |
currency | string | ISO-4217. |
clientReference | string | null | Your reference, exactly as you supplied it. |
createdAt | string | |
completedAt | string | null | When the operation first reached a final state. |
links | object | |
links.self | string | API-relative path of this operation (GET /tenant/operations/{uid}). |
links.receipt | string | API-relative path of its receipt (GET /tenant/operations/{uid}/receipt). |
timeline | object[] | State transitions of the operation, in sequenceNo order. |
timeline[].sequenceNo | number | 0 for the creation event, then monotonically increasing. |
timeline[].fromState | string | null | State the operation moved from; null on the creation event. |
timeline[].toState | string | null | State the operation moved to. |
timeline[].occurredAt | string | |
timeline[].actorType | enum | null | Kind of actor that drove the transition; the actor's identity is never included. One of api_client, admin, system, provider, customer. |
provider | object | null | Payment provider status of a top-up or payout; null for operations that involve no payment provider. |
provider.state | string | Status at the payment provider: created, initiated, pending, confirmed, failed, reversed, uncertain or reconciled. |
provider.reference | string | null | The provider's own reference, when known. |
provider.lastUpdatedAt | string | Last provider-side change Neo Wallet recorded. |
Example (generated from the schema)
json
{
"uid": "01J9Z3K5X8QW2R4T6V8Y0B1C3D",
"type": "string",
"state": "string",
"amountMinor": 0,
"feeMinor": 0,
"taxMinor": 0,
"currency": "ETB",
"clientReference": "string",
"createdAt": "2026-09-03T10:15:30.000Z",
"completedAt": "2026-09-03T10:15:30.000Z",
"links": {
"self": "string",
"receipt": "string"
},
"timeline": [
{
"sequenceNo": 0,
"fromState": "string",
"toState": "string",
"occurredAt": "2026-09-03T10:15:30.000Z",
"actorType": "api_client"
}
],
"provider": {
"state": "string",
"reference": "string",
"lastUpdatedAt": "2026-09-03T10:15:30.000Z"
}
}Errors
400 401 403 404 429 500 503 — one body shape for all of them, see Errors.
Get the receipt of one operation
GET
/api/v1/tenant/operations/{uid}/receiptScope operations:read
Amounts, fee breakdown, masked counterparty and references, plus receiptHash over the canonical receipt so any copy can be verified. 404 until the operation has moved funds.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
uid | string | yes |
Response · 200
| Field | Type | Description |
|---|---|---|
operationUid | string | |
type | string | Operation type, e.g. wallet_credit, wallet_debit, payout_b2c or topup_c2b. |
occurredAt | string | When the operation completed, otherwise when its money movement was first recorded. |
amountMinor | number | Integer minor units (e.g. 250000 = ETB 2,500.00). |
feeMinor | number | Minor units. |
taxMinor | number | Minor units. |
totalDebitedMinor | number | amountMinor + feeMinor + taxMinor, minor units. |
currency | string | ISO-4217. |
counterparty | object | |
counterparty.hint | string | null | Masked counterparty; never the raw value. |
references | object | |
references.clientReference | string | null | Your reference, exactly as you supplied it. |
references.providerReference | string | null | The provider's own reference, when known. |
references.journalUids | string[] | References of the accounting entries the receipt is computed from. |
feeBreakdown | object[] | |
feeBreakdown[].label | string | |
feeBreakdown[].amountMinor | number | Minor units. |
state | string | Operation state: created, awaiting_authorization, authorized, held, processing, pending_provider, confirmed, failed, reversed or completed. |
receiptHash | string | SHA-256 (hex) of the canonical receipt; identical on every read. |
Example (generated from the schema)
json
{
"operationUid": "01J9Z3K5X8QW2R4T6V8Y0B1C3D",
"type": "string",
"occurredAt": "2026-09-03T10:15:30.000Z",
"amountMinor": 0,
"feeMinor": 0,
"taxMinor": 0,
"totalDebitedMinor": 0,
"currency": "ETB",
"counterparty": {
"hint": "string"
},
"references": {
"clientReference": "string",
"providerReference": "string",
"journalUids": [
"string"
]
},
"feeBreakdown": [
{
"label": "string",
"amountMinor": 0
}
],
"state": "string",
"receiptHash": "string"
}Errors
400 401 403 404 429 500 503 — one body shape for all of them, see Errors.