API reference

The machine-readable spec is at /api/v1/openapi.json. Load it into any OpenAPI viewer (Swagger UI, Stoplight, Postman, Insomnia) to explore it.

In sandbox today

SorenPay is in private beta. Every workspace runs in sandbox, and no route moves real money yet.

Conventions

  • Base URL: https://sorenpay.com
  • Authenticated requests carry Authorization: Bearer apk_…
  • Idempotency: routes marked idempotent take an Idempotency-Key header (some require it). A replay within 24 hours returns the first response.
  • Live mode (not switched on yet): money-movement routes (payouts, international payments, USDC, multi-currency, cards, cardholders, physical cards and agents) require the workspace's business verification to be approved, else 403 kyb_required. Sandbox skips this check.
  • Inbound webhooks from our partners are checked (signature or shared secret) before we act on them.

Resources

ResourceRoutesStatus
WorkspacesPOST /api/workspaces, GET /api/workspacesIn sandbox
API keysPOST/GET/DELETE /api/auth/keysIn sandbox
CardsPOST/GET /api/cards, GET/PATCH /api/cards/{id}In sandbox
CardholdersPOST/GET /api/cardholdersIn sandbox
Physical cardsPOST/GET /api/physical-cardsIn sandbox
Ledger and payoutsGET /api/treasury, recipients, payouts, FX quotesIn sandbox
Multi-currencycurrency balances, details, quotes, conversionsIn sandbox (converting and paying from a balance: Coming soon)
USDC rampquotes, orders, withdrawals, walletsIn sandbox
Intl payments (USDC)quote + originate + lookupComing soon (answers 422)
Agentsregister + submit intent + intent logIn sandbox
MCPJSON-RPC 2.0 endpoint, read-onlyIn sandbox
Checkoutmerchant sessions + customer flowIn sandbox
Webhooksthe webhook we send and how it's signedIn sandbox

Errors

Errors are JSON with a machine-readable error code, and often a human-readable message:

{
"error": "<short_machine_code>",
"message": "Optional human-readable message"
}
StatusWhen
400Bad request body, or a required Idempotency-Key is missing
401Missing or invalid apk_ key
403The key is missing the scope (missing_scope:<scope>), or business verification isn't approved on a live request (kyb_required)
404Not found, or not in your workspace
409State conflict (for example cardholder_required)
422Same Idempotency-Key with a different body (idempotency_key_mismatch), or the feature isn't available (capability_unavailable)
429Rate limit hit (rate_limited). Retry after Retry-After seconds
500Server error. Retry with the same Idempotency-Key
501Not implemented
503rate_limit_unavailable: limits couldn't be checked and nothing changed. Retry after Retry-After seconds

Versioning

The OpenAPI spec at /api/v1/openapi.json describes the current surface. While SorenPay is in private beta, routes can still change.