Agora Public API

Getting started with Agora's API.

The endpoints exposed here are currently in Beta! As we continue to build our initial offering, these endpoints may implement breaking changes. Be sure to check back for our change log regularly as a precaution.

The Agora Public API exposes real-time data and operations for the Agora stablecoin platform. The current surface covers:

  • Metrics — real-time AUSD supply, aggregate and per-chain, across every supported chain. Public, no authentication required.
  • Accounts — the bank accounts and blockchain wallets registered to your organization.
  • Routes — reusable mint and redeem routes (fiat ↔ AUSD, stablecoin ↔ AUSD) and the settlement instructions for each.
  • Transactions — your settled transactions and their per-leg settlement detail.

Accounts, Routes, and Transactions are authenticated; Metrics is open.

Download OpenAPI spec

Base URL

All endpoints are served from https://api.agora.finance.

Authentication

Public-supply (metrics) endpoints require no authentication. Every other endpoint is in Beta and requires an API key, which you exchange for a short-lived session JWT. Owners and Admins create and manage keys from the Agora dashboard, under API keys in the menu beneath your name. See the Authentication guide for the full flow.

Make your first request

The metrics endpoints are public, so you can make a call without any credentials:

$curl https://api.agora.finance/v0/metrics

For authenticated endpoints, exchange your API key for a session JWT first (see Authentication), then attach it as a bearer token. The full surface, with request and response schemas for every endpoint, lives under Endpoints.

Conventions

A few conventions hold across the API:

  • Monetary values are decimal strings, not numbers. Amount fields are strings like "987654321.654321". AUSD carries six decimals of precision; representing an amount as a JSON number would silently truncate it. Parse with a decimal library (decimal.Decimal in Python, BigNumber.js in JavaScript, rust_decimal in Rust). This follows industry standard practice (Circle, Stripe).
  • Every response carries a Request-Id header. Capture it in your logs — it’s how Agora support traces a specific request end-to-end.

Endpoint-specific response details — such as the per-chain shape and partial-state behavior of /v0/metrics — are documented on each endpoint under Endpoints.

Filtering list endpoints

GET /v0/accounts, GET /v0/routes, and GET /v0/transactions accept filters alongside cursor and limit. The grammar is the same on all three:

  • Filters combine with AND. Every filter you send must hold for a record to appear.
  • Multi-value filters take one comma-separated parameter: ?network=base,arbitrum, not a repeated ?network=base&network=arbitrum, which is rejected.
  • Date ranges use dotted bounds: .gte / .gt for the lower bound, .lte / .lt for the upper, as in ?createdAt.gte=2026-03-01T00:00:00Z&createdAt.lt=2026-04-01T00:00:00Z. Timestamps are ISO-8601 and must carry a zone (Z or an offset). The exclusive bounds let you select a period without naming its last instant.
  • A filter is never silently dropped. An unknown parameter, an unknown range operator, a value outside the accepted set, an empty value, two bounds on the same side, or a range nothing can satisfy all return 400 parameter_invalid with the offending parameter named in context.issues.

A filter that is valid but matches nothing returns 200 with an empty data array.

Errors

Errors share a common JSON shape with a stable code, a human-readable message, and a docs_url. Triggered rate limits return 429 rate_limit_exceeded with a Retry-After header. See the Error Reference for the full code list, the 401 reason taxonomy, and handling guidance.