403 and keep returning 403 until a human configures a control. There is no request you can send, and no header you can add, that changes this from the agent side.
The denials are the system working as designed. Treat them as a configuration state to report, not an error to retry.
What happens by default
SouthPay resolves an authorization provider per store. No provider is configured by default, so every store gets a permissive stub that approves every verification it is asked for. Each endpoint then checks whether the approval came from a real provider, and refuses if it did not.
Payment creation is the deliberate exception. Charging a customer creates a receivable rather than an outflow, so it needs no mandate.
Check which provider you are on with
GET /api/v2/agentic/account (the get_account MCP tool). authorization.provider identifies the authorization provider in force and authorization.mandates is a boolean:
Response 200
"mandates": false means you are on the defaults described above.
Unblocking payouts with spend limits
Spend limits are per-credential, per-asset payout caps. They are the only control a merchant can configure without SouthPay staff involvement, and they are what makes agent payouts possible at all. A spend limit does two things:- It unlocks the asset. With the default provider, a payout in an asset that has no spend limit is refused with
payout_controls_requiredbefore any balance check happens. - It caps the payout. Every payout is checked against a per-transaction cap and against a daily counter that resets at midnight UTC. Breaching either returns
403withper_tx_cap_exceededordaily_cap_exceeded.
GET /api/v2/agentic/payout_limits (or get_payout_limits over MCP), which returns per_tx_cap_atomic, daily_cap_atomic, daily_spent_atomic, daily_remaining_atomic and controls_configured per asset, plus the utc_day the counter belongs to. controls_configured: false on an asset is a reliable predictor that a payout in it will be denied. Size the payout from this endpoint rather than discovering the cap through a 403.
Unblocking refunds, token changes and mandates
Refunds, token toggles and mandate issuance need a real authorization provider. Spend limits do not help here; the check is specifically “is this store’s provider something other than the default”. A provider is configured per store. There is no API for this. It is not exposed on any merchant endpoint and it is not a dashboard toggle. SouthPay support enables it for your store. Until then, the three actions stay at403 mandate_required regardless of credential scopes.
If you are building an agent for merchants generally, assume the provider is absent. Discover it at runtime from
GET /agentic/account and gate your own tool exposure on authorization.mandates, rather than offering the agent a refund capability that will always fail.With a provider enabled
Once a provider is configured, the model changes in both directions. The three blocked actions become available, and payment creation stops being unconditional. It is verified per call like everything else, and can now be denied withauthorization_denied.
The agent presents a mandate on gated requests in the X-Mandate header, base64-encoded JSON:
- The header is capped at 32768 bytes, and a value that is missing, oversized or not valid base64 JSON is treated as no mandate at all. On a gated action that produces a denial rather than a parse error, so a malformed header and an absent one look identical from the outside.
- Spend limits still apply. A payout must pass provider verification and stay inside any configured per-transaction and daily caps.
Error codes
Every agentic endpoint uses the structured envelope, withcode populated:
Response 403

