API Reference

API Reference

MethodEndpointAuthPurpose
POST/session/depositoperator keyCreate a deposit session → widget URL. Body: externalUserId, lang, platformFiatCurrency, userBalance, amount (+ optional email, operatorReference)
POST/session/withdrawoperator keyCreate a withdraw session → widget URL. Same body as /session/deposit; amount is the operator-set withdrawal amount
POST/session/:uuid/test-webhookoperator keySelf-service test: fire a real, signed completion webhook for one of your sessions at your own webhookUrl — no funds move. See note
POST/depositor/addresssession (sid)Get the deposit address — body: sid, currency, chainId
GET/chainpublicList networks + token contracts/decimals
POST/withdraw/direct-transfersession (sid)Initiate a withdrawal
POST/withdraw/:id/decisionoperator keyApprove / reject a withdrawal (external-approval mode)
GET/admin/withdrawalsadmin (dashboard-only)List withdrawals (management panel)
PATCH/admin/withdrawals/:id/statusadmin (dashboard-only)Approve / reject a withdrawal

POST /depositor/address is session-scoped: it is authenticated by the sid in the request body (called by the hosted widget), and takes no Bearer key. It requires the body fields sid, currency, and chainId.

POST /withdraw/:id/decision is operator-authenticated with your OPERATOR_SECRET_KEY (Bearer) — used only when your operator is on external-approval mode. :id is the withdrawal UUID from the async WITHDRAW_REQUEST webhook; body: { "decision": "APPROVE" | "REJECT", "reason"?: string }. See Withdrawals → External approval. Unlike the /admin/* endpoints, this one is partner-callable with your operator key.

POST /session/:uuid/test-webhook fires a real, signed webhook at your own webhookUrl without moving funds, so you can verify your integration end-to-end. Authenticate with your OPERATOR_SECRET_KEY (Bearer); :uuid is the session UUID (the sid returned when you created the session). The payload is identical to a production DEPOSIT / WITHDRAW_COMPLETE event apart from an extra test: "true" field, and delivery is synchronous, so the response carries your endpoint's real result:

{ "status": "success", "data": { "delivered": true, "status": 200, "event": "DEPOSIT" } }

Optional body overrides: { "amount", "currency", "chainId", "address" }. Scoped to your own operator (and sub-operators); rate-limited to 5/minute. Your handler must check test === "true" and skip all real ledger side effects. Full guide: Webhooks → Testing Your Integration.

The /admin/* endpoints are dashboard/admin-only — used internally by the management panel under a separate admin login. They are not partner-callable with your OPERATOR_SECRET_KEY.