Paystack ships as a Model Context Protocol server plus a REST API. Everything is typed. Every call carries a ReasoningLog. Every state change is signed.
Nothing to install or self-host. Paystack runs a hosted MCP server on the current Streamable HTTP transport — add the config below to your MCP client (Claude Desktop, Cursor, Continue, or any A2A agent) and paste an API key as the Bearer token. The session is scoped to your workspace; every tool call passes the safety switch.
{
"mcpServers": {
"paystack": {
"url": "https://api.getpaystack.com/mcp",
"headers": { "Authorization": "Bearer pk_live_..." }
}
}
}Mint a key in Dashboard → Integrations → API keys (POST /auth/api-keys). Older clients that only speak the deprecated HTTP+SSE transport can use https://api.getpaystack.com/mcp/sse. Verify a connection by calling tools/list — it returns the full tool catalog with JSON Schemas.
The API is small on purpose. Each verb has a clear posture, clear scope, and a documented risk level. Most agents only need two: initiate_escrow_payout and check_payout_status.
| Tool | Purpose | Risk |
|---|---|---|
| initiate_escrow_payout | Open an escrow: charge/hold + scheduled payout. Returns escrowId + VFP. | medium · reasoningLog |
| release_escrow | Release held funds. Verifier checks proof before the outbound leg fires. | high · reasoningLog |
| pause_escrow / cancel_escrow | Dispute gate (halts auto-release) and full unwind (refund inbound). | medium · reasoningLog |
| check_payout_status | Status, settlement timeline, reversibility window, fee breakdown. | read |
| quote_fees / explain_routing | Preview fees + the router decision. No side effects. | read |
| get_spending_limit | Agent’s workspace auto-transfer caps + current usage. | read |
| attach_bank_account / verify_bank_account / list_bank_accounts | Onboard + verify bank accounts (micro-deposit flow). | medium · reasoningLog |
| redeem_vfp | Verify a VFP token signature and return its payload. | public |
{
"name": "initiate_escrow_payout",
"description": "Open an escrow: charge/hold the payer, then pay out on release. Router picks strategy + rails. Returns escrowId + VFP.",
"inputSchema": {
"payer": { "type": {"enum": ["tenant","landlord","pm","agent","system"]}, "id": "string" },
"payerCaps": { "hasCard": "boolean", "hasVerifiedBank": "boolean" },
"payee": { "type": "...", "id": "string" },
"payeeBankAccountId": "string",
"amountCents": "string | number",
"tier": "'standard' | 'priority' | 'instant'",
"category": "'vendor' | 'maintenance' | 'payroll' | 'rent' | 'other'",
"condition": "{ kind: 'manual' | 'deadline' | 'webhook' | 'api_trigger' }",
"maxHoldDays": "number",
"reasoningLog": "object // required, non-empty"
}
}Every agent-triggered payment includes a ReasoningEnvelope. It travels with the ledger entry and through webhooks. Finance, compliance, and engineering all read the same field — no after-the-fact reconstruction.
type ReasoningEnvelope = {
// Why the agent chose to act
policy: string // dotted policy path (e.g. 'maintenance.repair')
confidence: number // [0, 1]
agent_id: string // stable id for the acting agent
model: string // model version that authorized
// Evidence
inputs_hash: sha256 // hash of the prompt/context that produced this
citations: string[]? // source ids the agent grounded on
tool_trace: string[]? // upstream tool calls that led here
// Operator overrides
approved_by: string? // operator id if human-in-the-loop fired
override: boolean? // true if policy would have blocked
}// POST to your endpoint · headers:
// x-paystack-signature: sha256=<hex> (HMAC-SHA256 of the raw body)
// x-paystack-event: escrow.released
// x-paystack-delivery: 01J8... (unique id; use to dedupe)
{
"id": "01J8...", // delivery id
"type": "escrow.released",
"createdAt": "2026-07-09T12:00:00.000Z",
"data": { // event-specific payload
"escrowId": "esc_01J...",
"amountCents": 120000
}
}Bring the system you need to wire up and we will tell you what the integration actually looks like — including if the honest answer is that you do not need us yet.
Rates, in full: inbound ACH pull $0.75 flat, same-day ACH $1.50, instant / push-to-card 0.95% capped at $10, and card acceptance interchange + 2.00% + $0.30 with interchange passed straight through. A fixed $250/mo platform fee applies and is not offset by usage.