Perpetual futures data from 19 venues, as a request or as a tool
Funding rates now and for every settlement we hold, cross-venue spreads priced against real order-book depth, and the listings calendar. One key for programs, one connection for Claude, ChatGPT and Cursor. Every response names the page it came from.
- Venues
- 19
- Coins with a funding page
- 987
- Data delay on paid plans
- 0 s
curl https://arbitron.app/api/v1/funding/BTC \ -H "Authorization: Bearer $ARBITRON_KEY"
{
"data": {
"coin": "BTC",
"venue_count": 18,
"spread_pct": 0.016532,
"best_short_exchange": "Blofin",
"best_long_exchange": "GateIo",
"rates": [
{ "exchange": "Blofin", "symbol": "BTC-USDT", "rate_pct": 0.016532,
"interval_hours": 8, "next_funding_at": "2026-09-21T00:00:00Z" },
{ "exchange": "Htx", "symbol": "BTC-USDT", "rate_pct": 0.01,
"interval_hours": 8, "next_funding_at": "2026-09-21T00:00:00Z" },
{ "exchange": "Poloniex", "symbol": "BTC-USDT", "rate_pct": 0.01,
"interval_hours": 8, "next_funding_at": "2026-09-21T00:00:00Z" },
... 15 more rows
]
},
"meta": {
"as_of": "2026-09-20T17:41:31Z",
"delayed_seconds": 0,
"source": "arbitron.app",
"url": "https://arbitron.app/funding-rates/coin/btc?utm_source=api"
}
}
Two minutes from a key to a response
- Create a key. In Settings, API keys. It is shown once and starts with
arb_live_. - Call one endpoint. Send the key as a bearer token. The response at the top of this page is what comes back.
- Read the RateLimit header. Every response says how much of the minute and of the month is left, so a client can pace itself and never see a 429.
- Connect an assistant. The MCP tab holds the config block for Claude Desktop, Cursor and ChatGPT.
curl "https://arbitron.app/api/v1/spreads?size_usd=100&limit=3" \ -H "Authorization: Bearer $ARBITRON_KEY"
import os, requests
r = requests.get(
"https://arbitron.app/api/v1/spreads",
params={"size_usd": 100, "limit": 3},
headers={"Authorization": f"Bearer {os.environ['ARBITRON_KEY']}"},
timeout=10,
)
r.raise_for_status()
body = r.json()
print(body["meta"]["as_of"])
for row in body["data"]["spreads"]:
print(row["coin"], row["exchange_a"], row["exchange_b"], row["est_profit_pct"])
const res = await fetch(
"https://arbitron.app/api/v1/spreads?size_usd=100&limit=3",
{ headers: { Authorization: `Bearer ${process.env.ARBITRON_KEY}` } },
);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data, meta } = await res.json();
console.log(meta.as_of, data.spreads.map((r) => r.coin));
{
"mcpServers": {
"arbitron": {
"url": "https://arbitron.app/mcp",
"headers": { "Authorization": "Bearer arb_live_..." }
}
}
}
Eight endpoints, one envelope
Read-only JSON over HTTPS at https://arbitron.app/api/v1. Percentages end in _pct and are percent values, timestamps are UTC ISO 8601, lists page with a cursor. The full parameter and schema reference is generated from the OpenAPI document.
| Method | Path | Scope | Returns |
|---|---|---|---|
| GET | /api/v1/funding | funding:read | Current funding rate on every venue and symbol, sorted by absolute rate. Filter by coin or venue. |
| GET | /api/v1/funding/{coin} | funding:read | One coin across venues: every rate, the spread between highest and lowest, and which venue pays a short or a long best right now. |
| GET | /api/v1/funding/history | history:read | Funding history, one annualised point per day for every venue or every settlement print for one venue. Depth depends on the plan. |
| GET | /api/v1/spreads | spreads:read | Executable cross-venue spreads from the public scanner, priced against real order-book depth for an order of size_usd. |
| GET | /api/v1/listings | listings:read | Announced listings and delistings: what each venue announced, when it takes effect and where the announcement is. |
| GET | /api/v1/exchanges | — | The venues, with tracked instrument counts, maximum leverage, taker fee and links to their specs and funding pages. |
| GET | /api/v1/coins | — | Ticker lookup: q matches the start of a ticker. Each coin carries its venue count and 24h volume. |
| GET | /api/v1/usage | usage:read | This key's plan, the month and minute windows, and what the plan includes. |
Every response is an envelope: data, then meta with meta.as_of, meta.delayed_seconds, meta.url, meta.next_cursor.
The anonymous discovery document lists all of this in JSON: GET /api/v1 · /api/v1/openapi.json
The same data as tools for an assistant
Eight read-only tools over the four datasets, for Claude, ChatGPT, Cursor and any other MCP client. An assistant with the connection uses them when a question is about funding, spreads or listings, and every result ends with the page to cite.
| Tool | Answers |
|---|---|
| arbitron_get_funding_rates | Current funding on every venue and symbol, filtered by coin or venue. |
| arbitron_get_coin_funding | One coin across venues, with the best venue to be short and the best to be long. |
| arbitron_get_funding_history | Daily or per-settlement funding history, to the depth of the plan. |
| arbitron_get_spreads | Executable spreads at an order size, best first. |
| arbitron_get_listings | What lists or delists in a window, per venue. |
| arbitron_get_exchanges | The venue list with contract specs and links. |
| arbitron_get_usage | This connection's remaining quota, so the assistant can explain a limit. |
- Endpoint
- https://arbitron.app/mcp
- Transport
- Streamable HTTP, stateless: no session to keep, every call stands alone. One tool call counts as one request against the same quotas as the REST API.
- Authentication
- An API key as a bearer header for clients that take a static header, or OAuth 2.1 with PKCE: the assistant signs in with your Arbitron account and you approve the scopes on a consent screen.
- Citation
- Every result carries meta.url, the human page for the same numbers. That page is what the assistant cites, and it is the same data.
A free demo, then three sizes of the same product
Monthly, paid the way every Arbitron plan is paid. Quotas are hard caps: when a window is spent you get a 429 and never an invoice. Every tier includes the MCP server.
Demo
Every account. The shape of the data, delayed.
- Requests per month
- 3,000
- Per minute
- 20
- API keys
- 1
- History depth
- 7 days
- Data delay
- 15 min
- Commercial use
- No
- MCP server
- Yes
Developer
Most popularLive funding, spreads and listings for your own scripts and dashboards.
- Requests per month
- 100,000
- Per minute
- 120
- API keys
- 3
- History depth
- 90 days
- Data delay
- Live
- Commercial use
- No
- MCP server
- Yes
Pro
Deeper history and a commercial licence for the products you ship.
- Requests per month
- 500,000
- Per minute
- 300
- API keys
- 10
- History depth
- 730 days
- Data delay
- Live
- Commercial use
- Yes
- MCP server
- Yes
Business
The full archive, the highest limits and keys for the whole team.
- Requests per month
- 2,000,000
- Per minute
- 600
- API keys
- 25
- History depth
- Everything we hold
- Data delay
- Live
- Commercial use
- Yes
- MCP server
- Yes
Prime includes Developer at no extra charge, so the top trading plan is also an entry to the API. Pricing
Demo data must be attributed to Arbitron with a link to the page it came from.
Two windows, both on every response
Each key has a minute window and a month window. Both are advertised on every response in the standard RateLimit-Policy and RateLimit fields, so a client can pace itself without ever hitting a limit.
- When a window is spent you get 429 with Retry-After in seconds and a problem body naming the window.
- Every data response carries an ETag. Send it back as If-None-Match and an unchanged body answers 304, which is refunded on both windows.
- Cache-Control is private, max-age=15 on live data and max-age=300 on delayed data, matching how often the snapshot behind it moves.
- The month resets on the 1st at 00:00 UTC. Nothing is billed as overage.
- One request is one request: history, spreads and funding cost the same, and an MCP tool call counts like a REST call.
RateLimit-Policy: "minute";q=120;w=60, "month";q=100000;w=2592000 RateLimit: "minute";r=118;t=41, "month";r=99871;t=1209600
Retry-After: 19 RateLimit: "minute";r=0;t=19, "month";r=99870;t=1209581 { "type": "https://arbitron.app/developers/errors#rate-limited", "title": "Too many requests this minute", "status": 429, "detail": "The api-developer plan allows 120 requests per minute; the window resets in 19 s. Cache responses (they carry ETag) or upgrade." }
Problem details you can switch on
Errors are RFC 9457 problem details: a stable type URL that points at a row of this table, a title, the HTTP status, a detail that says what to change, the request id as instance, and suggestions where a close match exists.
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
{
"type": "https://arbitron.app/developers/errors#unknown-coin",
"title": "Unknown coin",
"status": 404,
"detail": "No venue quotes a perpetual on 'ETHEREUM'. GET /api/v1/coins?q=ETHEREUM lists close matches.",
"instance": "0HN7Q2K3J9R4P:00000001",
"code": "unknown-coin",
"docs": "https://arbitron.app/developers",
"suggestions": ["ETH", "ETC", "ETHFI"]
}| Status | Code | What to change |
|---|---|---|
| 400 | invalid-parameter | A query value is out of range or the wrong shape. detail names the parameter and the accepted values. |
| 401 | unauthenticated | No key, or one that is mistyped, revoked, expired or rotated out. Send Authorization: Bearer with a key from Settings, API keys. |
| 403 | scope-missing | The key was created without the scope this endpoint needs; detail lists the scopes it has. Create a key with that scope. |
| 403 | plan-limit | The request reaches past the plan: a history window deeper than it includes, or a page larger than the Demo plan returns. Narrow the request or upgrade. |
| 404 | unknown-coin | No venue quotes a perpetual on that ticker. suggestions carries close matches, and GET /api/v1/coins?q= searches. |
| 404 | unknown-exchange | The venue is not one the API serves. suggestions lists the venues, as does GET /api/v1/exchanges. |
| 404 | not-found | No endpoint at that path under /api/v1. GET /api/v1 lists the ones that exist. |
| 429 | rate-limited | The minute window is spent, or too many rejected keys came from one address. Wait Retry-After seconds, or pace the client from the RateLimit header. |
| 429 | quota-exhausted | The month's requests are used up. The quota resets on the 1st at 00:00 UTC; a higher plan has more. |
| 503 | snapshot-unavailable | The snapshot behind the endpoint is still warming up after a restart. Retry in a minute. |
| 503 | api-disabled | The API is not enabled on this host. Nothing to change on your side; it is a configuration fault on ours. |
v1 is the contract
/api/v1 is the contract. Fields, endpoints, enum values and optional parameters are added without a version change. Removing or renaming anything, changing a type or changing a default is v2, and v1 keeps working for twelve months after v2 ships.
A deprecated endpoint or field announces itself in the response with Deprecation and Sunset headers and a Link to the changelog entry that names the replacement. The MCP server's version follows the same number, and tool names never change within a major version.
The OpenAPI document is versioned with the API; a diff of it is part of every release note. /api/v1/openapi.json
Deprecation: @1789500000 Sunset: Mon, 20 Sep 2027 00:00:00 GMT Link: <https://arbitron.app/developers#versioning>; rel="deprecation"
Changelog
- 2026-09-20
- v1 published: funding, funding history, spreads, listings, exchanges, coins and usage. MCP server with seven tools, key or OAuth.
Frequently Asked Questions
Is there a free tier?
Why is Demo data delayed?
Can I use the data commercially?
How are keys stored?
How do I rotate a key?
Do assistants need a key?
Do 304 responses count against my quota?
What happens when I hit a limit?
Start with the free key
The first request takes two minutes. The reference has a try-it panel that uses your key.