SETH on Ethereum Sepolia, and the API surface is otherwise identical to live.
1
Create an agent credential
Agent credentials are created in the dashboard under Agents. There is no API-key call that creates one; the endpoint behind that screen accepts dashboard sessions only.Choose:
- Mode.
testto start. The mode is baked into the token prefix and cannot be changed later. - Name and principal. Who the agent is, for your audit trail, for example
Support bot/[email protected]. - Scopes.
payments:readandpayments:writeare enough for this guide. Omitting scopes grants all eight. - Expiry. Optional, recommended.
spa_test_ followed by 48 hex characters. SouthPay stores only a SHA-256 digest and a 16-character display prefix, so a lost token cannot be recovered. Revoke it and create another.If you are connecting an MCP client and would rather not handle a key at all, skip this step and use browser login instead, which mints the credential for you.2
Connect a client
Over MCP, point the client at the hosted server and pass the credential as a bearer token:Confirm the connection by having the agent call
get_account. It returns the store, the mode, the credential’s scopes, and which authorization provider is in effect.Over plain HTTP, send the same token to the REST API and skip MCP entirely:3
Create a payment
reference is always 16 uppercase alphanumeric characters and is what appears in webhooks and on the hosted page; id is a bare UUID. crypto_amount_atomic is a string of base units, so divide by 10 ** atomic_decimals for a human amount. exchange_rate_snapshot is a plain numeric string, not an object.Give the customer the hosted_url, or the deposit address and the exact crypto amount.The amount is a decimal string in major units, with at most two decimal places and a ceiling of 100000000.00. Idempotency-Key is optional here but not on refunds, payouts or settlements, where it is required.4
Wait for it to complete
Intents expire 60 minutes after creation. Send
expires_in on create to choose a different window, in seconds, between 300 and 86400.Over MCP, wait_for_payment takes the payment id or its reference and polls server-side until the payment is completed, expired, failed or refunded, returning {done: true, status, polls, payment}. If the budget runs out first it returns {done: false, timed_out: true, status, polls, hint, payment}. A timeout is not a failed payment, so call it again.Over REST, poll GET /api/v2/agentic/payments/{id}, or configure a webhook for push delivery, which is the better choice for anything long-running.There are six payment statuses: pending, processing, completed, expired, failed, refunded. An overpayment lands as completed with state_reason: "completed_overpaid". There is no overpaid status. An agent cancel lands as expired with state_reason: "canceled_by_agent".5
Expect the money-movement denials
Reads, payment creation and cancellation work with nothing further configured. Refunds, token changes, mandates and payouts do not:These are configuration states, not bugs in your integration. Payouts unlock when the merchant sets a per-asset spend limit on the credential. Refunds, token changes and mandate issuance need an authorization provider, which SouthPay support enables per store. See agent authorization for the full picture.
Response 403
Next steps
MCP tool reference
All 19 tools, their parameters, defaults and return shapes.
Authorization model
What is blocked by default, what unblocks it, and every error code.

