API Reference
One API for moving money across chains.
The Across API moves money across chains through four calls: discover what is possible, price it, execute it, track it. Every transfer uses the same four, whatever is moving and wherever it is going.
Staging. The endpoints below run against the staging environment.
Base URL
Every Across API endpoint is served from one host, under /v1:
https://api.staging.across.toEverything under Deprecated APIs is the older API on
https://across.to/api and is unaffected.
Authentication
Pass your API key as a Bearer token on every request.
Authorization: Bearer YOUR_API_KEYDon't have a key yet? Get your API key and Integrator ID in under a minute.
Your first call
GET /v1/quotes/ping needs no key and confirms you can reach the service.
curl "https://api.staging.across.to/v1/quotes/ping"
# {"ok":true,"service":"quote"}GET /v1/capabilities is the simplest authenticated call, so it is the fastest
way to check your key works.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.staging.across.to/v1/capabilities?originChainId=42161&destinationChainId=8453&include=tokens"const BASE = "https://api.staging.across.to";
const res = await fetch(
`${BASE}/v1/capabilities?originChainId=42161&destinationChainId=8453&include=tokens`,
{ headers: { Authorization: `Bearer ${process.env.ACROSS_API_KEY}` } },
);
const capabilities = await res.json();import os, requests
BASE = "https://api.staging.across.to"
response = requests.get(
f"{BASE}/v1/capabilities",
params={
"originChainId": "42161",
"destinationChainId": "8453",
"include": "tokens",
},
headers={"Authorization": f"Bearer {os.environ['ACROSS_API_KEY']}"},
)const base = "https://api.staging.across.to"
req, _ := http.NewRequest("GET",
base+"/v1/capabilities?originChainId=42161&destinationChainId=8453&include=tokens",
nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("ACROSS_API_KEY"))
resp, _ := http.DefaultClient.Do(req)The four calls
| Call | Purpose | |
|---|---|---|
| 1 | GET /v1/capabilities | What can move between two chains right now, and why anything unavailable is unavailable |
| 2 | POST /v1/quotes | Price one exact transfer. Returns an expiry and the payload to sign |
| 3 | POST /v1/quotes/{orderId}/executions | Submit the signed authorization |
| 4 | GET /v1/transfers/{orderId} | Follow the money to a settled outcome |
The quoteId from step 2 is the same identifier you track in step 4, so
nothing needs translating between them.
Walk the whole flow in the Across API Quickstart.
Conventions
- Amounts are integers in the token's base units, sent as strings. Decimals
differ per chain for the same asset, so size amounts from the
decimalson the token you selected. - Timestamps are RFC 3339, UTC.
- Errors always carry a
codeand amessage— branch oncode, never onmessage. The envelope differs by endpoint: quoting and execution return them at the top level ({ code, message }), while the transfers endpoints nest them undererror({ error: { type, code, message, requestId } }). - Unknown fields are rejected. Request bodies are strict — a misspelled field is an error rather than a silently ignored one.
Deprecated APIs
Superseded endpoints are collected under Deprecated APIs in the sidebar. They still work and existing integrations are unaffected, but new integrations should use the four calls above.