Skip to main content
The AroPay API is a JSON-over-HTTPS API. Every dashboard feature is built on it, so anything you see in the UI can be automated with the same calls.

Base URL

All paths in this reference are relative to the base URL. On-chain operations execute on Ethereum Sepolia (chain ID 11155111), the current MVP sandbox environment; a Mainnet deployment will follow.

Authentication

Protected endpoints accept either credential; the Authorization header wins when both are present:
A handful of sensitive endpoints are session-only and return 403 session_required when called with an API key: password change, TOTP and passkey management, key create/revoke, and wallet export. Each is labeled in its endpoint page. Background in Authentication.

The response envelope

Every endpoint (except the flat Sandbox probes) wraps its result:
Branch on HTTP status for class of failure and on error.code for specifics; the full catalog is in Errors.

Conventions

POST/PATCH/DELETE requests with bodies require Content-Type: application/json; anything else is rejected with 415 unsupported_media_type. (This doubles as CSRF protection.)
Human units, string-typed: "125.50" means 125.5 tokens. No wei, no base units, no floats. The one exception: GET /gas additionally reports wei strings for precision-sensitive tooling.
Wallets, transactions, keys, and passkeys use cuid-style IDs. IDs from another account read as 404 not_found; ownership is enforced on every access.
e.g. "2026-08-13T09:30:00.000Z".
GET /transactions takes page (default 1) and pageSize (default 20, max 100) and returns items, page, pageSize, total.
/fund, /mint, /transfer, /redeem wait for the on-chain receipt and return 201 with the transaction. If the receipt isn’t in yet, the transaction returns as PENDING; poll GET /transactions/{id} until terminal. Reads also advance in-flight transactions (lazy reconciliation).

Rate limits

30 writes and 120 reads per minute per principal; 10 login attempts per 15 minutes per IP. Exceeding a limit returns 429 rate_limited. Details and patterns in Rate limits.

Sandbox endpoints

GET /sandbox (status probe) and POST /sandbox (JSON echo) are unauthenticated connectivity checks with a flat response shape (no data envelope):
Use them to verify connectivity and JSON handling before wiring auth.

Try it here

Every endpoint page in this reference has an interactive playground: authenticate with your aro_sk_… key and requests run against the live sandbox. A good first call is GET /auth/session (under Auth in the sidebar): it echoes back who you are and which credential authenticated.