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.to

Everything 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_KEY

Don'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

CallPurpose
1GET /v1/capabilitiesWhat can move between two chains right now, and why anything unavailable is unavailable
2POST /v1/quotesPrice one exact transfer. Returns an expiry and the payload to sign
3POST /v1/quotes/{orderId}/executionsSubmit the signed authorization
4GET /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 decimals on the token you selected.
  • Timestamps are RFC 3339, UTC.
  • Errors always carry a code and a message — branch on code, never on message. The envelope differs by endpoint: quoting and execution return them at the top level ({ code, message }), while the transfers endpoints nest them under error ({ 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.

On this page