Dashboard · 1.0.0 · 71 endpoints
Dashboard session API
The calls the dashboard makes for itself, plus the few public and OAuth endpoints. They are documented for completeness; an integration should use the merchant API.
Not for API keys
403 session_required to an API key. To build an integration, use the merchant integration API.status
Platform status messages staff publish for customers. Public.
/v1/statusCurrent platform status messages
What staff have told customers about incidents and maintenance. status is operational when no message is open and every component is operational, otherwise the worst of the open messages and the components. recent holds messages resolved in the last 14 days. The text is exactly what staff published; it never carries internal identifiers. components and incidents are derived by the platform itself (payments per network, payouts, refunds) and open and close without anyone writing a message; they never include a provider, a staff reason or a tenant-specific pause.
- Auth
- none
Response 200 · PlatformStatus
The status.
- statusrequired"operational" | "notice" | "maintenance" | "degraded" | "outage"
The worst of the service components and the open staff messages; a paused component counts as
outage. - activerequiredStatusMessage[]
- recentrequiredStatusMessage[]
- componentsrequiredStatusComponent[]
One entry per payments network, plus payouts and refunds, derived from what the platform is doing.
- incidentsrequiredStatusIncident[]
Automatic incidents, open ones and those closed in the last 14 days, newest first. Staff cannot hide or resolve them.
Errors: 429 · 500
payments
Payment requests (intents) a customer pays, with their state, fundings and fulfilment.
/v1/checkout/{token}What a payer needs to pay one intent (hosted checkout)
Public and unauthenticated: the unguessable checkout token in the path, taken from instructions.checkout_url, is the credential. It returns only what the payer acts on (amount, fee, network, address, memo, expiry and progress) and nothing about the merchant. address, memo and hosted_url are empty once the intent is final. A held or blocked intent reads as processing. Any origin may read it (no credentials); it is rate limited per client (429 rate_limited). Responses are not cacheable.
- Auth
- none
Parameters
- tokenpathrequiredstring
Response 200 · CheckoutView
The payer's view.
- statusrequired"requires_payment" | "processing" | "partially_funded" | "succeeded" | "expired" | "cancelled"
- livemoderequiredboolean
False for a test-mode payment, whose address is synthetic.
- assetrequiredobject
- networkrequiredobject
- amountrequiredunknown
The price.
- feerequiredunknown
Added on top of the price.
- amount_duerequiredunknown
Price plus fee: what the payer sends.
- amount_seenrequiredunknown
Deposits seen, still confirming included.
- amount_receivedrequiredunknown
Deposits verified.
- amount_remainingrequiredunknown
amount_dueless what is verified; zero when covered. - pricerequiredobject | null
- descriptionrequiredstring
- staterequired"ready" | "pending" | "unavailable"
As
instructions.stateof the intent. - addressrequiredstring
Empty while pending, when the intent is final, or when only
hosted_urlpays. - memorequiredstring | null
Must be sent with the payment when present.
- hosted_urlrequiredstring (uri) | null
The provider's checkout page; when set the payer is sent there.
- expires_atrequiredISODate
- server_timerequiredunknown
The server's clock, for a countdown that does not trust the device's.
Errors: 404 · 429 · 500
/v1/checkout/{token}/eventsRecord an anonymous payer funnel step on hosted checkout
Public and unauthenticated: records one deduplicated funnel step per (intent, step) for live payment intents without storing IP addresses, session identifiers or account IDs. Test-mode intents answer 204 without writing to live analytics. Any origin may send it (no credentials); it is rate limited per client (429 rate_limited).
- Auth
- none
Parameters
- tokenpathrequiredstring
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CheckoutEventInput
- steprequired"viewed" | "instructions_ready" | "copy_address" | "copy_memo" | "reveal_qr" | "open_hosted"
Response 204
Recorded (or ignored for a test-mode intent or duplicate step).
Errors: 400 · 404 · 429 · 500
/v1/checkout/{token}/ton-connectTON Connect transaction payload for a hosted checkout
Builds the authoritative TON Connect v2 signing payload for a TON payment intent (gram-ton or usdt-ton) that is awaiting payment (requires_payment or partially_funded). Native gram-ton payloads include a BOC text-comment cell when memo is present; usdt-ton payloads include the TEP-74 transfer cell BOC, jetton_master and ton_for_gas, plus a ready-to-send messages entry when payer_jetton_wallet is supplied.
- Auth
- none
Parameters
- tokenpathrequiredstring
- payer_addressquerystring
Optional TON address of the payer wallet, encoded as
response_destinationfor excess gas on Jetton transfers. - payer_jetton_walletquerystring
Optional Jetton wallet contract address of the payer; when supplied for
usdt-ton,messagescarries the ready-to-sign Jetton transfer message.
Response 200 · TonConnectPayload
The TON Connect transaction payload.
- networkrequired"-239" | "-3"
-239on TON mainnet (livemode: true),-3in test mode. - valid_untilrequiredinteger
Unix timestamp after which wallets refuse to sign.
- kindrequired"native" | "jetton"
- asset_idrequiredstring
- destination_addressrequiredstring
Merchant payment deposit address on TON.
- amountrequiredunknown
Remaining amount due in asset base units.
- memorequiredstring | null
- messagesrequiredTonConnectMessage[]
- jetton_masterrequiredstring | null
Jetton master contract address when
kindisjetton, otherwise null. - ton_for_gasrequiredstring | null
NanoTON attached to the Jetton wallet call (
50000000= 0.05 TON) whenkindisjetton, otherwise null. - jetton_transfer_payloadrequiredstring | null
Base64-encoded TEP-74
transferBOC cell whenkindisjetton, otherwise null.
Errors: 400 · 404 · 409 · 422 · 429 · 500
/v1/checkout/widget/{token}Payer view for an embedded checkout widget
Public browser read authenticated by a short-lived wcs_ token from POST /v1/payment-intents/{id}/widget-token. The Origin request header must exact-match both the origin signed into the token and an active row in the merchant's checkout_origins allowlist (403 origin_not_approved otherwise, so deleting an origin cuts off active widget sessions at once). Sets Access-Control-Allow-Origin to that exact origin with Vary: Origin and Cache-Control: no-store. Expired tokens return 401 widget_token_expired.
- Auth
- none
Parameters
- tokenpathrequiredstring
Response 200 · CheckoutView
The payer's view.
- statusrequired"requires_payment" | "processing" | "partially_funded" | "succeeded" | "expired" | "cancelled"
- livemoderequiredboolean
False for a test-mode payment, whose address is synthetic.
- assetrequiredobject
- networkrequiredobject
- amountrequiredunknown
The price.
- feerequiredunknown
Added on top of the price.
- amount_duerequiredunknown
Price plus fee: what the payer sends.
- amount_seenrequiredunknown
Deposits seen, still confirming included.
- amount_receivedrequiredunknown
Deposits verified.
- amount_remainingrequiredunknown
amount_dueless what is verified; zero when covered. - pricerequiredobject | null
- descriptionrequiredstring
- staterequired"ready" | "pending" | "unavailable"
As
instructions.stateof the intent. - addressrequiredstring
Empty while pending, when the intent is final, or when only
hosted_urlpays. - memorequiredstring | null
Must be sent with the payment when present.
- hosted_urlrequiredstring (uri) | null
The provider's checkout page; when set the payer is sent there.
- expires_atrequiredISODate
- server_timerequiredunknown
The server's clock, for a countdown that does not trust the device's.
Errors: 401 · 403 · 404 · 429 · 500
/v1/checkout/widget/{token}/ton-connectTON Connect transaction payload for an embedded checkout widget
Same payload as GET /v1/checkout/{token}/ton-connect, authenticated by a wcs_ widget token and enforcing exact-match Origin allowlisting against checkout_origins.
- Auth
- none
Parameters
- tokenpathrequiredstring
- payer_addressquerystring
- payer_jetton_walletquerystring
Response 200 · TonConnectPayload
The TON Connect transaction payload.
- networkrequired"-239" | "-3"
-239on TON mainnet (livemode: true),-3in test mode. - valid_untilrequiredinteger
Unix timestamp after which wallets refuse to sign.
- kindrequired"native" | "jetton"
- asset_idrequiredstring
- destination_addressrequiredstring
Merchant payment deposit address on TON.
- amountrequiredunknown
Remaining amount due in asset base units.
- memorequiredstring | null
- messagesrequiredTonConnectMessage[]
- jetton_masterrequiredstring | null
Jetton master contract address when
kindisjetton, otherwise null. - ton_for_gasrequiredstring | null
NanoTON attached to the Jetton wallet call (
50000000= 0.05 TON) whenkindisjetton, otherwise null. - jetton_transfer_payloadrequiredstring | null
Base64-encoded TEP-74
transferBOC cell whenkindisjetton, otherwise null.
Errors: 400 · 401 · 403 · 404 · 409 · 422 · 429 · 500
api keys
Create, rotate and revoke API keys, test keys included. Dashboard session with step-up MFA only.
/v1/api-keysDashboard session onlyAPI keys of the account (never the secrets)
- Auth
- Dashboard session
Response 200 · object
Newest first, revoked ones included.
/v1/api-keysDashboard session onlyCreate an API key (owner, admin or developer; step-up MFA)
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · ApiKeyInput
- namerequiredstring
- scopesrequiredScope[]
- expires_atISODate
- coderequiredstring
Step-up TOTP code or passkey step-up token.
- mode"live" | "test"
A
testkey (rvk_test_...) acts on the account's separate sandbox.503 test_mode_unavailablewhere the deployment has no sandbox.
Response 201 · CreatedApiKey
The key with its secret, shown once.
- secretrequiredstring
The full credential
rvk_<prefix>_<secret>. Shown once; store it hashed.
Errors: 400 · 403 · 409 · 422
/v1/api-keys/{id}Dashboard session onlyRevoke a key immediately
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Response 204
Revoked.
Errors: 404
/v1/api-keys/{id}/rotateDashboard session onlyMint a replacement; the old key stays valid for 24 hours
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- coderequiredstring
Step-up TOTP code or passkey step-up token.
Response 201 · CreatedApiKey
The new key with its secret, shown once.
- secretrequiredstring
The full credential
rvk_<prefix>_<secret>. Shown once; store it hashed.
Errors: 404 · 409
team
Members and their roles. Dashboard session only.
/v1/teamDashboard session onlyTeam members of the account, invited ones included
- Auth
- Dashboard session
Response 200 · object
Members ordered by join date.
/v1/teamDashboard session onlyInvite a team member by email (owner or admin)
Saves a pending membership and sends the invitee a link that expires in 7 days. The answer is the same whether or not the address already has a login, so an invitation never reveals one: the member has status: invited, no user_id or username, and an invitation that says whether the email went out. Limited to 20 invitations an hour per account (429 with Retry-After).
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · InviteInput
- emailrequiredstring (email)
- rolerequiredRole
Team role. owner > admin > developer / finance > viewer.
Response 201 · Member
The invited membership. The invitee receives a signed link.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - user_idrequiredID | null
- emailrequiredstring (email)
- usernamerequiredstring | null
- rolerequiredRole
Team role. owner > admin > developer / finance > viewer.
- statusrequired"invited" | "active"
- accepted_atrequiredISODate | null
- invitationrequiredMemberInvitation | null
- created_atrequiredISODate
Errors: 400 · 403 · 409 · 429
/v1/team/acceptAccept an invitation with a username and password
For an address that has no login: the invitee chooses a username and password, which creates the login and the seat in one step. If the address has gained a login since the invitation was sent, this answers 409 login_exists and the invitee signs in and uses POST /v1/team/invitations/accept. Limited per caller address and per link (429 with Retry-After).
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · AcceptInviteInput
- tokenrequiredstring
- usernamerequiredstring
- passwordrequiredstring
Response 204
Membership active; sign in normally.
Errors: 400 · 409 · 422 · 429
/v1/team/invitationSay what an invitation link is for, before anyone signs in
Returns the state of the link and, unless it is invalid, the account, the role and the masked address it was sent to. mode is create when the invitee must choose a username and password and sign_in when the address already has a login. A link that was replaced by a resend, whose seat was withdrawn, or that never existed is invalid. Limited per caller address and per link.
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · InvitationTokenInput
- tokenrequiredstring
Response 200 · InvitationPreview
The state of the link.
- staterequired"valid" | "expired" | "used" | "invalid"
- account_namestring
- roleRole
Team role. owner > admin > developer / finance > viewer.
- masked_emailstring
The invited address with all but its first letter and its domain hidden.
- mode"create" | "sign_in"
Errors: 429
/v1/team/invitations/acceptDashboard session onlyAccept an invitation as the signed-in person
For an address that already has a login. The signed-in person's email must equal the address the invitation was sent to; otherwise 403 invitation_wrong_user names the masked address and the link is not spent, so the right person can still use it. Accepting also confirms the login's email address, since the link reached its mailbox. Cookie sessions only: an API key or connected app is refused with 403 session_required.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · InvitationTokenInput
- tokenrequiredstring
Response 200 · AcceptedInvitation
The seat is active; the account is listed in `Me.accounts` from now on.
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - account_namerequiredstring
Errors: 403 · 409 · 422 · 429
/v1/team/{id}/resendDashboard session onlySend a pending member a new invitation link (owner or admin)
Replaces every unused link of the pending member with a new one and sends it; the old links stop working. Limited to 1 a minute and 5 a day per member and 30 an hour per account (429 with Retry-After).
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200 · Member
The pending member with its new invitation.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - user_idrequiredID | null
- emailrequiredstring (email)
- usernamerequiredstring | null
- rolerequiredRole
Team role. owner > admin > developer / finance > viewer.
- statusrequired"invited" | "active"
- accepted_atrequiredISODate | null
- invitationrequiredMemberInvitation | null
- created_atrequiredISODate
Errors: 403 · 404 · 409 · 429
/v1/team/{id}Dashboard session onlyChange a member's role (owner or admin; only owners grant or remove owner)
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Request body · object
- rolerequiredRole
Team role. owner > admin > developer / finance > viewer.
Response 200 · Member
The updated membership.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - user_idrequiredID | null
- emailrequiredstring (email)
- usernamerequiredstring | null
- rolerequiredRole
Team role. owner > admin > developer / finance > viewer.
- statusrequired"invited" | "active"
- accepted_atrequiredISODate | null
- invitationrequiredMemberInvitation | null
- created_atrequiredISODate
Errors: 404 · 409
/v1/team/{id}Dashboard session onlyRemove a member and end their sessions
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Response 204
Removed.
Errors: 404 · 409
identity
Sign-up, email verification, sign-in and sign-out (session cookie).
/v1/signupCreate a merchant account with its owner and send the verification email
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · SignUpRequest
- emailrequiredstring (email)
- usernamerequiredstring
- passwordrequiredstring
- account_namestring
The merchant's display name; defaults to the username.
- countrystring
The country the business is registered in (ISO 3166-1 alpha-2). Required in practice: a sign-up without it is refused with
400 invalid_country. The schema keeps it optional so the 1.x contract stays additive. It decides which activities the platform offers; staff confirm it during verification and the confirmed value governs. - subdivisionstring
An ISO 3166-2 code inside
country, needed only where a rule targets a region.
Response 201 · object
Account created; the address a verification link was sent to.
- verification_sent_torequiredstring (email)
Errors: 400 · 403 · 409 · 429 · 500
/v1/email/verifyConsume an email verification token
Tokens are single use and expire 30 minutes after they were sent.
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- tokenrequiredstring
Response 200 · object
Email verified.
- verifiedrequiredboolean
Errors: 400 · 422 · 500
/v1/email/verify/resendSend a new verification link
Mails a new link (valid 30 minutes) when the address is registered and not yet verified. The answer is the same for every address, so it never reveals whether an account exists. Rate limited per IP and per address.
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- emailrequiredstring (email)
Response 202 · object
Accepted; a link is on its way if the address needs one.
- acceptedrequiredboolean
Errors: 400 · 429 · 500
/v1/sessionSign in with email and password (plus TOTP when enabled)
Verifies the password and, when an authenticator app is enabled, code (a 6-digit TOTP or a passkey step-up code). Issues a new session every time (rotation): an existing wp_session sent with the request is revoked. Sets the wp_session and wp_csrf cookies and returns Me. Sign-in is rate limited per IP and per email (429 rate_limited).
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · SignInRequest
- emailrequiredstring (email)
- passwordrequiredstring
- codestring
6-digit TOTP, or a
passkey:step-up code. Required when the account has an authenticator app enabled.
Response 200 · Me
Signed in.
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - livemoderequiredboolean
False for objects created with a test-mode key (
rvk_test_); they live in the sandbox and never touch real funds. - account_namerequiredstring
The merchant's display name.
- rolerequiredunknown
The caller's role; for an API key, the role of the member who created it.
- emailrequiredstring (email)
- usernamerequiredstring
- localerequiredstring
BCP-47 tag, e.g.
en,pt-BR,ar. Defaulten. - display_currencyrequiredunknown
Currency balances are shown in. Default
USD. - time_zonerequiredstring | null
IANA zone dates are shown in, e.g.
Europe/Lisbon; null follows the browser. Timestamps in the API are always UTC. - mfarequiredobject
- withdrawals_frozen_untilrequiredISODate | null
Present while a security freeze is active (48 h after password/MFA/email change).
- notifications_seen_atrequiredISODate | null
When this member last marked the notification bell read (
POST /v1/me/notifications/seen); null until they first do. Items newer than this are unread. - limitsrequiredobject
The active limits of the account (the platform default unless an admin set an override; UTC day and month windows) with the usage reserved so far.
- created_atrequiredISODate
- accountsrequiredobject[]
The accounts the signed-in person can work in, for the account switcher. Empty for an API key.
- account_choice_requiredrequiredboolean
True while the person has several accounts and has never picked one; the dashboard asks which to open. Becomes false once they do (
POST /v1/session/account).
Errors: 400 · 401 · 403 · 422 · 429 · 500
/v1/sessionDashboard session onlySign out (revoke the current session)
- Auth
- Dashboard session
Response 204
Session revoked and cookies cleared.
Errors: 401 · 403 · 500
/v1/session/accountDashboard session onlyMove the session to another of the person's accounts
Changes the account the signed-in session works in and remembers it as the person's last account, so the next sign-in lands there. The target must be a live account the person is an active member of and must not be suspended or closed; any other account, including a test-mode twin, is refused with 403 forbidden, and a suspended or closed one with 403 account_inactive. Returns Me for the new account. Cookie sessions only: an API key or connected app is refused with 403 session_required. Limited to 30 switches a minute per session. No step-up: it grants nothing the person does not already hold.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron.
Response 200 · Me
Switched; the body describes the new current account.
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - livemoderequiredboolean
False for objects created with a test-mode key (
rvk_test_); they live in the sandbox and never touch real funds. - account_namerequiredstring
The merchant's display name.
- rolerequiredunknown
The caller's role; for an API key, the role of the member who created it.
- emailrequiredstring (email)
- usernamerequiredstring
- localerequiredstring
BCP-47 tag, e.g.
en,pt-BR,ar. Defaulten. - display_currencyrequiredunknown
Currency balances are shown in. Default
USD. - time_zonerequiredstring | null
IANA zone dates are shown in, e.g.
Europe/Lisbon; null follows the browser. Timestamps in the API are always UTC. - mfarequiredobject
- withdrawals_frozen_untilrequiredISODate | null
Present while a security freeze is active (48 h after password/MFA/email change).
- notifications_seen_atrequiredISODate | null
When this member last marked the notification bell read (
POST /v1/me/notifications/seen); null until they first do. Items newer than this are unread. - limitsrequiredobject
The active limits of the account (the platform default unless an admin set an override; UTC day and month windows) with the usage reserved so far.
- created_atrequiredISODate
- accountsrequiredobject[]
The accounts the signed-in person can work in, for the account switcher. Empty for an API key.
- account_choice_requiredrequiredboolean
True while the person has several accounts and has never picked one; the dashboard asks which to open. Becomes false once they do (
POST /v1/session/account).
Errors: 400 · 401 · 403 · 409 · 429 · 500
/v1/passkeys/login/beginStart a usernameless passkey sign-in
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200 · CeremonyStart
Options for the browser WebAuthn call plus the sealed ceremony token.
- ceremonyrequiredstring
Opaque, sealed server state; send it back unchanged in the finish call. Valid 5 minutes.
- optionsrequiredobject
{publicKey: PublicKeyCredentialCreationOptions | PublicKeyCredentialRequestOptions}in go-webauthn's JSON encoding (base64url binary fields).
Errors: 401 · 500
/v1/passkeys/login/finishSign in with a passkey assertion
Sets the session cookies and returns Me, like POST /v1/session.
- Auth
- none
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CeremonyFinish
- ceremonyrequiredstring
- credentialrequiredobject
The
PublicKeyCredentialreturned by the browser, serialised withtoJSON()(base64url fields). - namestring
Label for a new passkey (registration only).
Response 200 · Me
Signed in.
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - livemoderequiredboolean
False for objects created with a test-mode key (
rvk_test_); they live in the sandbox and never touch real funds. - account_namerequiredstring
The merchant's display name.
- rolerequiredunknown
The caller's role; for an API key, the role of the member who created it.
- emailrequiredstring (email)
- usernamerequiredstring
- localerequiredstring
BCP-47 tag, e.g.
en,pt-BR,ar. Defaulten. - display_currencyrequiredunknown
Currency balances are shown in. Default
USD. - time_zonerequiredstring | null
IANA zone dates are shown in, e.g.
Europe/Lisbon; null follows the browser. Timestamps in the API are always UTC. - mfarequiredobject
- withdrawals_frozen_untilrequiredISODate | null
Present while a security freeze is active (48 h after password/MFA/email change).
- notifications_seen_atrequiredISODate | null
When this member last marked the notification bell read (
POST /v1/me/notifications/seen); null until they first do. Items newer than this are unread. - limitsrequiredobject
The active limits of the account (the platform default unless an admin set an override; UTC day and month windows) with the usage reserved so far.
- created_atrequiredISODate
- accountsrequiredobject[]
The accounts the signed-in person can work in, for the account switcher. Empty for an API key.
- account_choice_requiredrequiredboolean
True while the person has several accounts and has never picked one; the dashboard asks which to open. Becomes false once they do (
POST /v1/session/account).
Errors: 400 · 401 · 403 · 422 · 429 · 500
privacy
The signed-in member asks for their personal data to be deleted and sees what that does.
/v1/privacy/deletion-requestDashboard session onlyWhat a deletion request would do, and the member's latest request
The plan lists every personal field with what happens to it: anonymised, restricted until the retention period of the account ends, or kept, each with a reason code. blocked is owner_of_open_account when the member is the only owner of an account that is still open.
- Auth
- Dashboard session
Response 200 · DeletionStatus
The plan and the latest request, if any.
- planrequiredDeletionPlanItem[]
- requestrequiredDeletionRequest | null
- blockedrequired"owner_of_open_account" | null
Errors: 401 · 429 · 500
/v1/privacy/deletion-requestDashboard session onlyAsk for the signed-in member's personal data to be deleted
Records the request; compliance staff process it. Processing anonymises personal fields, ends the member's sessions and keeps ids and financial rows. A tenant or member under a legal hold is not processed until the hold is released. One open request per member: deletion_request_exists (409). The only owner of an open account gets deletion_owner_blocked (409).
- Auth
- Dashboard session
Response 201 · DeletionRequest
Recorded.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - statusrequired"requested" | "completed" | "rejected" | "cancelled"
- requested_atrequiredISODate
- planrequiredDeletionPlanItem[]
- processed_atrequiredISODate | null
- outcomerequiredDeletionPlanItem[]
What processing did, same shape as the plan. Empty until completed.
Errors: 401 · 409 · 429 · 500
/v1/privacy/deletion-request/cancelDashboard session onlyWithdraw the open deletion request
- Auth
- Dashboard session
Response 200 · DeletionRequest
Withdrawn.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - statusrequired"requested" | "completed" | "rejected" | "cancelled"
- requested_atrequiredISODate
- planrequiredDeletionPlanItem[]
- processed_atrequiredISODate | null
- outcomerequiredDeletionPlanItem[]
What processing did, same shape as the plan. Empty until completed.
Errors: 401 · 404 · 429 · 500
security
Sessions, devices, password, TOTP and passkeys of the signed-in user.
/v1/sessionsDashboard session onlyLive sessions of the account
- Auth
- Dashboard session
Response 200 · object
Newest activity first; `current` marks the caller's session.
Errors: 401 · 500
/v1/sessions/{id}Dashboard session onlyRevoke a session
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Response 204
Revoked (cookies are cleared when it was the current session).
Errors: 401 · 403 · 404 · 500
/v1/devicesDashboard session onlyKnown devices (browser installations) of the account
- Auth
- Dashboard session
Response 200 · object
Most recently seen first.
Errors: 401 · 500
/v1/devices/{id}Dashboard session onlyForget a device and end all its sessions
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Response 204
Device and its sessions revoked.
Errors: 401 · 403 · 404 · 500
/v1/password/changeDashboard session onlyChange the password
Starts the 48-hour withdrawal freeze and signs out every other session. A new password found in a known data breach is refused with password_breached (400).
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- current_passwordrequiredstring
- new_passwordrequiredstring
- codestring
TOTP or
passkey:step-up code; required once the user has a second factor.
Response 204
Password changed.
Errors: 400 · 401 · 403 · 500
/v1/totp/enrolDashboard session onlyStart enrolling an authenticator app
Returns the seed once. Nothing counts as MFA until POST /v1/totp/confirm succeeds. When the user already has a passkey, code (a passkey: step-up code) is required.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · StepUpCode
- codestring
TOTP or
passkey:step-up code; required once the user has a second factor.
Response 201 · TotpEnrolment
Pending authenticator.
- credential_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - secretrequiredstring
Base32 seed, shown once.
- otpauth_urirequiredstring (uri)
otpauth://totp/...for a QR code.
Errors: 401 · 403 · 409 · 500
/v1/totp/confirmDashboard session onlyActivate the pending authenticator with a first valid code
Starts the 48-hour withdrawal freeze.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CodeRequest
- coderequiredstring
Step-up code (6-digit TOTP or
passkey:code from/v1/passkeys/assert/finish).
Response 204
Done.
Errors: 401 · 403 · 409 · 422 · 500
/v1/totp/disableDashboard session onlyRemove the authenticator app (step-up required)
Starts the 48-hour withdrawal freeze.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CodeRequest
- coderequiredstring
Step-up code (6-digit TOTP or
passkey:code from/v1/passkeys/assert/finish).
Response 204
Done.
Errors: 401 · 403 · 404 · 422 · 500
/v1/passkeysDashboard session onlyRegistered passkeys
- Auth
- Dashboard session
Response 200 · object
Oldest first.
Errors: 401 · 500
/v1/passkeys/register/beginDashboard session onlyStart registering a passkey
Returns creation options for navigator.credentials.create() and an opaque ceremony token to send back to the finish call (valid 5 minutes). Once the user has a second factor, code (TOTP or passkey: step-up) is required.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · StepUpCode
- codestring
TOTP or
passkey:step-up code; required once the user has a second factor.
Response 200 · CeremonyStart
Options for the browser WebAuthn call plus the sealed ceremony token.
- ceremonyrequiredstring
Opaque, sealed server state; send it back unchanged in the finish call. Valid 5 minutes.
- optionsrequiredobject
{publicKey: PublicKeyCredentialCreationOptions | PublicKeyCredentialRequestOptions}in go-webauthn's JSON encoding (base64url binary fields).
Errors: 401 · 500
/v1/passkeys/register/finishDashboard session onlyStore the new passkey
Starts the 48-hour withdrawal freeze.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CeremonyFinish
- ceremonyrequiredstring
- credentialrequiredobject
The
PublicKeyCredentialreturned by the browser, serialised withtoJSON()(base64url fields). - namestring
Label for a new passkey (registration only).
Response 201 · Passkey
The passkey.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - namerequiredstring
- created_atrequiredISODate
- last_used_atrequiredISODate | null
Errors: 400 · 401 · 403 · 422 · 500
/v1/passkeys/assert/beginDashboard session onlyStart a passkey step-up for the signed-in user
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200 · CeremonyStart
Options for the browser WebAuthn call plus the sealed ceremony token.
- ceremonyrequiredstring
Opaque, sealed server state; send it back unchanged in the finish call. Valid 5 minutes.
- optionsrequiredobject
{publicKey: PublicKeyCredentialCreationOptions | PublicKeyCredentialRequestOptions}in go-webauthn's JSON encoding (base64url binary fields).
Errors: 401 · 500
/v1/passkeys/assert/finishDashboard session onlyExchange a passkey assertion for a step-up code
The returned code (prefixed passkey:) is valid for 5 minutes wherever a TOTP code is accepted.
- Auth
- Dashboard session
Parameters
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CeremonyFinish
- ceremonyrequiredstring
- credentialrequiredobject
The
PublicKeyCredentialreturned by the browser, serialised withtoJSON()(base64url fields). - namestring
Label for a new passkey (registration only).
Response 200 · object
Step-up code.
- coderequiredstring
Errors: 400 · 401 · 403 · 422 · 500
/v1/passkeys/{id}/removeDashboard session onlyRemove a passkey (step-up required)
Starts the 48-hour withdrawal freeze.
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · CodeRequest
- coderequiredstring
Step-up code (6-digit TOTP or
passkey:code from/v1/passkeys/assert/finish).
Response 204
Done.
Errors: 401 · 403 · 404 · 422 · 500
account
/v1/me/preferencesDashboard session onlyUpdate display preferences
Partial update of locale (BCP-47, canonicalised), display_currency (one of the codes in GET /v1/rates) and time_zone (IANA name, or empty for the browser's zone).
- Auth
- Dashboard session
Request body · PreferencesPatch
- localestring
BCP-47 tag; canonicalised on save.
- display_currencyCurrencyCode
ISO 4217 code of a supported display currency (see
GET /v1/rates). - time_zonestring
IANA name, e.g.
America/Sao_Paulo; an empty string goes back to the browser's zone.
Response 200 · Me
The updated account.
- account_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - livemoderequiredboolean
False for objects created with a test-mode key (
rvk_test_); they live in the sandbox and never touch real funds. - account_namerequiredstring
The merchant's display name.
- rolerequiredunknown
The caller's role; for an API key, the role of the member who created it.
- emailrequiredstring (email)
- usernamerequiredstring
- localerequiredstring
BCP-47 tag, e.g.
en,pt-BR,ar. Defaulten. - display_currencyrequiredunknown
Currency balances are shown in. Default
USD. - time_zonerequiredstring | null
IANA zone dates are shown in, e.g.
Europe/Lisbon; null follows the browser. Timestamps in the API are always UTC. - mfarequiredobject
- withdrawals_frozen_untilrequiredISODate | null
Present while a security freeze is active (48 h after password/MFA/email change).
- notifications_seen_atrequiredISODate | null
When this member last marked the notification bell read (
POST /v1/me/notifications/seen); null until they first do. Items newer than this are unread. - limitsrequiredobject
The active limits of the account (the platform default unless an admin set an override; UTC day and month windows) with the usage reserved so far.
- created_atrequiredISODate
- accountsrequiredobject[]
The accounts the signed-in person can work in, for the account switcher. Empty for an API key.
- account_choice_requiredrequiredboolean
True while the person has several accounts and has never picked one; the dashboard asks which to open. Becomes false once they do (
POST /v1/session/account).
Errors: 400 · 401 · 403 · 500
/v1/me/notifications/seenDashboard session onlyMark the notification bell read
Stamps the signed-in member's Me.notifications_seen_at with the current time. It is kept per member, so the unread count follows the person across devices and other members are unaffected. Safe to repeat. Any signed-in member; an API key is refused.
- Auth
- Dashboard session
Response 204
Marked.
Errors: 401 · 403 · 500
/v1/me/countryDashboard session onlyGive the country the business is registered in
For an account that has no country on record, which is every account created before sign-up asked for one. Until it has one, POST /v1/payment-intents is refused with country_required; payouts, refunds and returns are not affected. It only fills a missing country: once one is on record, declared or confirmed by staff, only staff correct it (409 country_already_set). Owners and admins only, signed in; an API key is refused.
- Auth
- Dashboard session
Request body · CountryRequest
- countryrequiredstring
The country the business is registered in (ISO 3166-1 alpha-2), case-insensitive.
- subdivisionstring
An ISO 3166-2 code inside
country, needed only where a rule targets a region.
Response 200 · MarketEligibility
What the market allows now.
- country_requiredrequiredboolean
True when the merchant has no country on record; new payments are refused with
country_requireduntilPUT /v1/me/countrysupplies one. - statusrequired"allowed" | "servicing" | "blocked"
The strictest state across the activities an existing merchant can still start.
- marketrequiredobject | null
Null when no country is on record, in which case no market rule applies.
- version_idrequiredID | null
The eligibility matrix version this answer came from; operations are pinned to the version they were judged under.
- versionrequiredinteger
- activitiesrequiredobject[]
Errors: 400 · 401 · 403 · 409 · 500
catalogue
/v1/assetsEnabled assets and networks
One entry per asset and network pair with limits, contract and price.
- Auth
- none
Response 200 · object
Assets in display order.
Errors: 429 · 500
conversions
Currency conversion through a venue. Off for everyone until the venue is qualified and enabled by two staff members: while it is off every endpoint answers `409 conversion_unavailable` and nothing reaches the venue. A quote is indicative and an execution is at market, so every conversion keeps the quoted output next to the actual one and the slippage between them.
/v1/conversions/quotesDashboard session onlyAsk for an indicative conversion quote
Session only. Records the request and returns 202 with the conversion in quoting; poll GET /v1/conversions/{id} until it is quoted. The quote is indicative and expires at expires_at.
- Auth
- Dashboard session
Parameters
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · ConversionQuoteRequest
- from_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - to_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - amountrequiredBaseUnits
Non-negative integer amount in the asset's smallest unit, as a decimal string.
Response 202 · Conversion
The conversion, awaiting its quote.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - statusrequired"quoting" | "quoted" | "submitting" | "completed" | "failed" | "unknown"
- from_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - to_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - from_amountrequiredBaseUnits
Non-negative integer amount in the asset's smallest unit, as a decimal string.
- quoted_amountrequiredBaseUnits | null
The venue's indicative output; null until the quote arrives.
- quoted_raterequiredstring | null
- indicativerequiredboolean
Always true; the venue promises no minimum output.
- quoted_atrequiredISODate | null
- expires_atrequiredISODate | null
- actual_amountrequiredBaseUnits | null
What the venue delivered; null until the conversion completes.
- slippage_bpsrequiredinteger | null
How far the actual output fell short of the quote, in basis points; negative when it beat the quote.
- failure_reasonrequiredstring | null
- legsrequiredConversionLeg[]
- created_atrequiredISODate
- completed_atrequiredISODate | null
Errors: 400 · 409
/v1/conversionsDashboard session onlyExecute a quoted conversion at market
Session only. Holds the source amount and queues the conversion; returns 202 with the conversion in submitting. The output is whatever the venue delivers, which can differ from the quote.
- Auth
- Dashboard session
Parameters
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · ConversionRequest
- quote_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron.
Response 202 · Conversion
The conversion, now submitting.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - statusrequired"quoting" | "quoted" | "submitting" | "completed" | "failed" | "unknown"
- from_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - to_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - from_amountrequiredBaseUnits
Non-negative integer amount in the asset's smallest unit, as a decimal string.
- quoted_amountrequiredBaseUnits | null
The venue's indicative output; null until the quote arrives.
- quoted_raterequiredstring | null
- indicativerequiredboolean
Always true; the venue promises no minimum output.
- quoted_atrequiredISODate | null
- expires_atrequiredISODate | null
- actual_amountrequiredBaseUnits | null
What the venue delivered; null until the conversion completes.
- slippage_bpsrequiredinteger | null
How far the actual output fell short of the quote, in basis points; negative when it beat the quote.
- failure_reasonrequiredstring | null
- legsrequiredConversionLeg[]
- created_atrequiredISODate
- completed_atrequiredISODate | null
Errors: 404 · 409
/v1/conversions/{id}Dashboard session onlyA conversion with its quoted and actual output
- Auth
- Dashboard session
Parameters
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - idpathrequiredID
Response 200 · Conversion
The conversion.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - statusrequired"quoting" | "quoted" | "submitting" | "completed" | "failed" | "unknown"
- from_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - to_asset_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - from_amountrequiredBaseUnits
Non-negative integer amount in the asset's smallest unit, as a decimal string.
- quoted_amountrequiredBaseUnits | null
The venue's indicative output; null until the quote arrives.
- quoted_raterequiredstring | null
- indicativerequiredboolean
Always true; the venue promises no minimum output.
- quoted_atrequiredISODate | null
- expires_atrequiredISODate | null
- actual_amountrequiredBaseUnits | null
What the venue delivered; null until the conversion completes.
- slippage_bpsrequiredinteger | null
How far the actual output fell short of the quote, in basis points; negative when it beat the quote.
- failure_reasonrequiredstring | null
- legsrequiredConversionLeg[]
- created_atrequiredISODate
- completed_atrequiredISODate | null
Errors: 404
address book
/v1/address-bookDashboard session onlySave a payout address
Signed-in owner, admin or finance members only, with a step-up MFA code. The entry starts as cooling_off and becomes active after 24 h. An address with the same first and last four characters as a saved one is refused (422 lookalike_address).
- Auth
- Dashboard session
Parameters
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · AddAddressRequest
- labelrequiredstring
- networkrequiredNetworkID
- addressrequiredstring
- memostring
Destination tag or memo, when the network needs one (TON).
- coderequiredstring
Step-up MFA code (TOTP or passkey assertion token).
Response 201 · AddressBookEntry
The new entry.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - labelrequiredstring
- networkrequiredNetworkID
- addressrequiredstring
- memorequiredstring | null
Destination tag or memo the network needs (TON), if any.
- statusrequired"cooling_off" | "active"
- active_fromrequiredunknown
End of the 24 h cooling-off period.
- created_atrequiredISODate
Errors: 400 · 401 · 403 · 409 · 422 · 429 · 500
/v1/address-book/{id}/removeDashboard session onlyRemove a saved payout address (step-up MFA)
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- coderequiredstring
Response 204
Removed; payouts already prepared keep their destination.
Errors: 404 · 422
oauth
Authorization server for MCP clients. Discovery at `/.well-known/oauth-authorization-server` (RFC 8414). Public clients only, registered dynamically (RFC 7591) or identified by an https client ID metadata document. The consent screen lives in the dashboard; a team member approves with a passkey or TOTP code, and the app never gets more than that member's role allows.
/.well-known/oauth-authorization-serverAuthorization server metadata (RFC 8414)
- Auth
- none
Response 200 · object
Issuer, endpoints, `code_challenge_methods_supported: [S256]`, `client_id_metadata_document_supported: true`.
/oauth/registerRegister a public client (RFC 7591)
redirect_uris must be https, http on a loopback host (any port matches), or a private-use scheme. token_endpoint_auth_method must be none. Limited per IP. No Idempotency-Key.
- Auth
- none
Request body · object
- redirect_urisrequiredstring[]
- client_namestring
- client_uristring (uri)
- token_endpoint_auth_method"none"
- grant_types"authorization_code" | "refresh_token"[]
- response_types"code"[]
Response 201 · object
The registered client.
Errors: 400 · 429
/oauth/authorizeStart an authorization (browser)
Validates the request and redirects the browser to the dashboard's consent screen (/oauth/consent?request=<id>). resource (the MCP server URL), code_challenge and code_challenge_method=S256 are required. An unknown client or unregistered redirect URI is shown as an error page and never redirected to; other errors return to the client with error, state and iss.
- Auth
- none
Parameters
- response_typequeryrequired"code"
- client_idqueryrequiredstring
- redirect_uriqueryrequiredstring
- code_challengequeryrequiredstring
- code_challenge_methodqueryrequired"S256"
- resourcequeryrequiredstring (uri)
- scopequerystring
- statequerystring
Errors: 302 · 400
/oauth/tokenExchange a code or refresh token
Form-encoded. authorization_code needs code, client_id, redirect_uri and code_verifier; a failed PKCE check burns the code, and a code presented twice revokes the grant. refresh_token rotates: a refresh token used twice revokes the grant. scope on a refresh may only narrow. Access tokens last 15 minutes, refresh tokens 30 days, and a connection 90 days from consent however often it refreshes. A wrong code_verifier does not use up the code.
- Auth
- none
Response 200 · object
`access_token`, `token_type: Bearer`, `expires_in`, `refresh_token`, `scope`.
- access_tokenrequiredstring
- token_typerequired"Bearer"
- expires_inrequiredinteger
- refresh_tokenrequiredstring
- scoperequiredstring
Errors: 400
/oauth/revokeRevoke a token (RFC 7009)
Revokes the whole grant behind a token the client owns. Unknown tokens are not an error.
- Auth
- none
Response 200
Revoked, or nothing to revoke.
connected apps
The dashboard's consent screen and the list of connected OAuth apps (signed-in members only).
/v1/oauth/requests/{id}Dashboard session onlyWhat an app is asking for
Everything shown comes from the client's registration and our scope catalogue, never from model output. Only the browser that called /oauth/authorize can read or answer the request (a wp_oauth_browser cookie set there), so a forwarded consent link is refused.
- Auth
- Dashboard session
Parameters
- idpathrequiredID
Response 200 · ConsentRequest
The pending request.
- idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - clientrequiredobject
- redirect_urirequiredstring
- resourcerequiredstring
- scopesrequiredobject[]
- expires_atrequiredISODate
Errors: 403 · 404
/v1/oauth/requests/{id}/approveDashboard session onlyConnect the app
Needs a passkey or TOTP code. scopes may narrow the request; each must be allowed for the member's role.
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- coderequiredstring
- scopesstring[]
Response 200 · RedirectTo
Where to send the browser (the client's redirect URI with `code`, `state` and `iss`).
- redirect_torequiredstring (uri)
Errors: 403 · 404 · 422
/v1/oauth/requests/{id}/denyDashboard session onlyDecline the app
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200 · RedirectTo
The client's redirect URI with `error=access_denied`.
- redirect_torequiredstring (uri)
Errors: 403 · 404
/v1/oauth/grantsDashboard session onlyConnected apps
- Auth
- Dashboard session
Response 200 · object
Newest first, revoked ones included.
/v1/oauth/grants/{id}/revokeDashboard session onlyDisconnect an app
The member who connected it, or an owner or admin. Its tokens stop working at once.
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200
Revoked.
Errors: 403 · 404
pricing
/v1/ratesFX rates per USD for the display currencies
From the latest snapshot, taken every five minutes. estimated is true when the snapshot is older than 15 minutes or none exists yet. Before the first snapshot, outside local development, rates is empty and clients keep showing USD. Clients convert USD-cent values from /v1/portfolio/history and asset prices with these rates.
- Auth
- none
Response 200 · Rates
Rates per 1 USD.
- baserequiredstring
- taken_atrequiredISODate
- estimatedrequiredboolean
True when the snapshot is older than 15 minutes or no snapshot exists yet.
- ratesrequiredobject
Currency code to units per USD (USD is 1). Empty before the first snapshot outside local development.
Errors: 429 · 500
legal
The interface languages the platform enables and the legal texts merchants accept. Texts are versioned; an acceptance records the exact version and is never rewritten, so a later edit asks for a new acceptance without touching the old one.
/v1/languagesInterface languages the platform enables
The language pickers offer these tags only; default is what a new visitor gets.
- Auth
- none
Response 200 · Languages
Enabled languages in display order.
- enabledrequiredstring[]
- defaultrequiredstring
- version_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron.
Errors: 429 · 500
/v1/legal/{document}The current text of a legal document
Markdown in the requested locale, falling back to the language alone and then to English; locale in the response says which was served. version_id is what an acceptance names.
- Auth
- none
Parameters
- documentpathrequiredLegalDocumentName
- localequerystring
BCP-47 tag; defaults to English.
Response 200 · LegalDocument
The document.
- documentrequiredLegalDocumentName
- version_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - localerequiredstring
The locale served, after fallback.
- titlerequiredstring
- markdownrequiredstring
- effective_fromrequiredISODate
Errors: 404 · 429 · 500
/v1/legal/acceptancesDashboard session onlyWhere the account stands on each legal document
One entry per document: the current version, the version the account last accepted (if any) and whether that acceptance still covers the current text. An edit to one document never affects another's standing.
- Auth
- Dashboard session
Response 200 · object
One entry per document.
Errors: 401 · 429 · 500
/v1/legal/{document}/acceptDashboard session onlyAccept the current text of a legal document
Records that the signed-in member accepted version_id for the account. The version must read the same as the text in force for that document, else legal_version_stale (409): load the document again. Acceptances are append-only; a new one is added, the old one stays.
- Auth
- Dashboard session
Parameters
- documentpathrequiredLegalDocumentName
- Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · LegalAcceptInput
- version_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - localestring
The locale the member read; recorded with the acceptance.
Response 201 · LegalAcceptance
Recorded.
- documentrequiredLegalDocumentName
- current_version_idrequiredID
Resource identifier. UUIDv7 for user-owned rows; catalogue ids are slugs like
usdt-tron. - accepted_version_idrequiredID | null
- accepted_atrequiredISODate | null
- up_to_daterequiredboolean
True when the accepted version's text of this document reads the same as the current one.
Errors: 400 · 401 · 404 · 409 · 429 · 500
approvals
/v1/approvalsDashboard session onlyPayouts waiting for a team member's approval
- Auth
- Dashboard session
Parameters
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode).
Response 200 · object
Newest first.
/v1/approvals/{id}Dashboard session onlyOne payout approval (the payout id)
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode).
Response 200 · PendingApproval
The approval.
- typerequired"withdrawal" | "refund" | "overpayment_return"
- operationrequiredWithdrawal
Errors: 404
/v1/approvals/{id}/approveDashboard session onlyApprove a payout with step-up MFA
Owner, admin or finance members only. Never available to API keys. With two or more approvers on the account the preparer is refused (403 approver_must_differ); a late approval is refused with 409 approval_expired and the request is cancelled.
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Request body · object
- coderequiredstring
TOTP code or passkey step-up token.
Response 200 · PendingApproval
The payout, now `submitted` or `pending_review`.
- typerequired"withdrawal" | "refund" | "overpayment_return"
- operationrequiredWithdrawal
Errors: 403 · 404 · 409 · 422 · 423
/v1/approvals/{id}/rejectDashboard session onlyReject a payout and release its funds
- Auth
- Dashboard session
Parameters
- idpathrequiredID
- X-Test-Modeheaderboolean
When
true, a cookie-session request acts on the linked sandbox account (503 test_mode_unavailablewhen sandbox is disabled). Live API keys cannot switch modes (400 invalid_mode). - Idempotency-Keyheaderrequiredstring
Client-generated unique key (UUID recommended) that makes the POST safe to retry.
Response 200 · PendingApproval
The payout, now `cancelled`.
- typerequired"withdrawal" | "refund" | "overpayment_return"
- operationrequiredWithdrawal
Errors: 404 · 409