What you can do
Accounts and transactions
Read accounts and balances, open sub-accounts, list transactions and generate statements.
Payments
Confirm account names, save recipients, and send single, batch and scheduled payments.
Collections
Get paid with invoices, payment links and static virtual accounts, and track every inbound credit.
Payroll
Manage people and deductions, prepare and run monthly pay runs, and issue payslips.
Webhooks and events
Receive signed events when payments settle, money arrives or invoices are paid.
Agents and MCP
Let an AI agent use one agent account through the PanoFlow MCP server.
Base URL
Send every request to:Sandbox and live
Sandbox uses the same URLs as live. The credential decides which one you reach:
Objects carry
livemode so you can tell them apart. Webhook endpoints are per mode: sandbox and live endpoints are separate and have separate signing secrets. Using a pk_test_ key on an operation that only exists in live mode returns 403 test_key_on_live.
Conventions
These rules hold for every endpoint, so you can rely on them in your client code.JSON
- Every field, query parameter and enum value is
snake_case(created_at,account_number,pending_approval). - Every resource has
idandobject(its type, for example"object": "transfer"), thencreated_at. Resources that can change also carryupdated_at. - Timestamps are RFC 3339 in UTC with
Z, for example2026-10-27T08:41:00Z. Dates without a time areYYYY-MM-DDand are interpreted in Africa/Lagos time. - Unknown optional fields are left out rather than sent as
null, unless a field documents whatnullmeans. metadata, where offered, is a flat object of up to 20 string keys (40 characters or fewer) with string values (500 characters or fewer).- Money is always a
Moneyobject in minor units. See Money and amounts.
IDs
IDs are opaque strings with a type prefix, an underscore and a 26-character body, for exampletrf_01JC8Z4M9Q2X7H3N5B6V8D0K1R for a transfer or acc_... for an account. Don’t parse them; store and compare them as strings.
Some human-facing numbers are not IDs and keep their own formats, such as invoice numbers (INV-0152) and NIP session ids (30 digits).
Writes
POSTcreates something or performs an action.PATCHpartially updates. There is noPUT.- Actions are sub-resources named with a verb, for example
POST /v1/transfers/{transfer_id}/cancel. - Anything with history is never deleted. You archive or close it instead, for example
POST /v1/recipients/{recipient_id}/archive.
Request ids
Every response carries anX-Request-Id header (req_...). You can also send your own X-Request-Id and it is echoed back. Quote the request id when you contact support.
Next steps
Authenticate
Use API keys and scopes, or OAuth for apps and agents.
Handle errors
Read the error shape, codes and ISO 8583 response codes.