Retrieve a payment
Fetch a single payment by its transaction id.
Autorisations
API key in format sp_sk_test_... or sp_sk_live_....
Paramètres de chemin
Transaction id, e.g. TX_8K3M9F.
^TX_[A-Z0-9]+$Réponse
Payment found.
Transaction id.
"TX_8K3M9F"
Transaction direction (B119): collection (pay-in, customer →
merchant), refund (payout reversing a collection), or
disbursement (free-form payout, merchant → an msisdn).
collection, refund, disbursement For a refund, the id of the original collection it reverses.
null for collections and disbursements (B119).
null
App order id grouping related transactions (collection + refunds +
recurring charges). Falls back to reference when not supplied (B126).
"ORDER-2026-A1"
Public URL to the order in the consuming app; null when not set (B126).
null
Whether orderUrl requires a specific permission on the consuming
app to open (admin-only, not public). The dashboard shows a
"protected URL" hint accordingly. Defaults to false (B130).
false
Gross amount in minor units the customer was debited (e.g. CFA centimes are not used; FCFA uses whole units).
x >= 125000
Operator commission kept from the gross amount (B112). Defaults
to 1% (1.5% for Moov). 0 when no settlement / commission applies.
x >= 0250
Net the merchant received. Reconcile your merchant ledger against
this, not amount. In customer mode this equals amount (the
merchant gets the full amount); in merchant mode it is
amount − commission.
x >= 025000
Total the client was charged (netAmount + commission). In
customer mode this is amount + commission; in merchant mode
it equals amount (B113).
x >= 025250
Percentage (0–100) of the operator commission the merchant absorbed
for this payment (B114). 100 = merchant absorbs the full fee
(default); 0 = customer absorbs all. null for legacy rows.
0 <= x <= 100100
Portion of the commission borne by the merchant
(amount − netAmount). B114.
x >= 0250
Portion of the commission borne by the customer
(commission − merchantShare). B114.
x >= 00
Who absorbed the operator commission for this payment (B113):
customer (default) — client pays amount + commission, merchant
receives the full amount; merchant — client pays amount,
merchant receives amount − commission. null for legacy rows.
customer, merchant "customer"
ISO-4217-style currency code (FCFA, XOF, XAF).
3 - 4"FCFA"
Mobile Money operator code.
mtn, orange, moov, airtel ISO-3166 2-letter country code.
2"CI"
E.164-formatted phone number.
^\+[1-9][0-9]{6,14}$"+22507123456"
Caller-supplied idempotency reference (unique per org). Recommended canonical shape ORIGIN-OP-TS-CODE (e.g. ZANA-PAY-20260531221015-8E2884A47B1C): ORIGIN = your app slug (SP for SandPay), OP ∈ PAY/REF/DIS/ABO, TS = compact UTC datetime YYYYMMDDHHMMSS, CODE = 12-char uppercase hex. Any string is accepted — this is a recommended convention, not enforced. Distinct from order_ref.
1 - 80"ZANA-PAY-20260531221015-8E2884A47B1C"
Final settlement status.
SUCCESS, PIN_INVALID, INSUFFICIENT_FUNDS, TIMEOUT, ACCOUNT_BLOCKED, USER_CANCELLED, UNKNOWN_MSISDN, LIMIT_EXCEEDED, SERVICE_UNAVAILABLE, DUPLICATE_REFERENCE, PENDING Total time spent processing the payment, in milliseconds.
x >= 01240
ISO-8601 timestamp when the payment was created.
Native operator response payload. In sandbox this is synthesized
to mirror the real operator shape (MTN MoMo, Orange Money, Moov
Africa, Airtel Money) — with _simulated: true set on the
top level so consumers can detect sandbox payloads. In production
this is the verbatim payload returned by the upstream operator
API.
This field lets you write integration code (e.g.
tx.raw.financialTransactionId for MTN, tx.raw.responseCode
for Moov) against sandbox transactions and have the same code
work in production without changes.
null for legacy rows persisted before raw passthrough shipped.
{
"_simulated": true,
"amount": "25000",
"currency": "FCFA",
"externalId": "ORDER-2026-A1",
"payer": {
"partyIdType": "MSISDN",
"partyId": "22507123456"
},
"payerMessage": "Payment",
"payeeNote": "ORDER-2026-A1",
"status": "SUCCESSFUL",
"financialTransactionId": "SIM_A1B2C3D4"
}Scenario used to drive the outcome, if explicit.
success, pin_invalid, low_balance, timeout, blocked, cancelled, unknown_msisdn, limit_exceeded, maintenance, duplicate