Crypto funding rates, prices and events as JSON. No key, no sign-up
Funding rates and prices from 49 exchanges, in one line
curl -s https://www.carryroom.com/api/v1/latest- Exchanges
- 49
- Endpoints live
- 5 / 6
- Rate limit
- 1/s · 60 per 5 min
- Key / sign-up
- not needed
What you get
A read-only JSON API for the funding rates and prices of crypto perpetual futures (perps) — BTC, ETH, SOL and every other listed contract — across 49 exchanges including Binance, Bybit, OKX, Hyperliquid. Use it to monitor or backtest funding rate arbitrage, or to feed a bot. Values are read from each exchange's own public API about once a minute and returned as they are. No key, no sign-up.
What a funding rate is, and how to read one, is under how to read the numbers.
curl -s https://www.carryroom.com/api/v1/latestThat one line returns the latest value for every symbol on every exchange.
Endpoints
| URL | Available now |
|---|---|
/api/v1 | yes |
/api/v1/latest | yes |
/api/v1/venues | yes |
/api/v1/carry | yes |
/api/v1/events | yes |
/api/v1/history | not yet |
/api/v1/events/stream | yes — a stream (Server-Sent Events) |
/api/v1/history (past rates) is the next release. Until then it answers 501 with the URLs that do work; it never answers with an empty list.
Kinds of number
| Kind | Name in the response | In this release |
|---|---|---|
| The latest funding rate and price, per exchange and symbol | latest_rates | returned |
| Ranked cross-exchange pairs, and what the funding difference added up to over 30 days | pair_ranking | returned |
| Events — exchange notices, stablecoin peg moves, gaps between venues and pools (the same list as /news) | events | returned |
| How that total built up, day by day | cumulative_curve | not returned yet |
| Funding rate history — the past rates themselves, as a series | rate_history | not returned yet |
| Turnover and open interest — how much is left open | volume | not returned yet |
| How thick the order book is, and what getting filled costs | depth_profile | not returned yet |
The same list in machine-readable form is /openapi.json (OpenAPI 3.1, with each field's type, presence and unit); the site-wide index is /llms.txt.
Filtering
Fetch the list once and filter locally. One exchange, with each symbol's rate and settlement interval:
curl -s https://www.carryroom.com/api/v1/latest \
| jq '[.rows[] | select(.venue == "hyperliquid")
| {symbol, funding_rate_8h, funding_interval_h}]'symbolis the exchange's own spelling (1000BONK and BONK are the same asset).canonicalis the key to join on across exchanges.- Without a query the list matches the screens. Exchanges held back by default are included when named, as in ?venues=dydx,btcc.
- On the rate endpoints, venues is the only parameter. A name that cannot be read is returned in unreadable_venue_tokens and the filter does not apply, so the full list comes back. (Events take their own parameters — see below.)
Events and notifications
The same list as Notices — exchange notices, stablecoin peg moves, and gaps between exchanges, pools and oracle-priced venues — newest first, for the last 14 days.
curl -s 'https://www.carryroom.com/api/v1/events?kind=pool_gap,oracle_gap'kindtakes a kind (announcement, peg_move, dislocation, options_daily) or a gap type (price_gap, funding_gap, pool_gap, fxstable_gap, oracle_gap, lst_move, wrapper_gap), comma-separated.since_msandlimit(up to 500) also work.- Every row has an id, and the same event always has the same id. De-duplicate on it: a notice found late can carry an earlier time than rows you already have.
To have new events pushed instead of polling, keep this connection open (Server-Sent Events):
curl -N https://www.carryroom.com/api/v1/events/stream- First comes event: ready, then one message per new event: id: is its id, event: its kind, data: the same row as the list. A :ping line arrives every 20 seconds so proxies keep the connection open.
- After a drop, reconnect with the Last-Event-ID header (or ?last_event_id=) and what you missed is sent. event: gap means the id is no longer known — fill in from the list.
- Up to 4 open streams per client.
Push does not make an event earlier: how late it is depends on what watches it. Pools are checked every 30 seconds, oracle-priced venues every minute, gaps between exchanges run 2–3 minutes behind the market, stablecoin pegs every 30 minutes, exchange notices every 15 minutes. The list and the stream pick an event up within 5 seconds of it being recorded.
Using it from Claude Code, Codex or Gemini CLI
An agent skill (SKILL.md) is served from this site. Put the one file in place and the agent reads the units and how settlement intervals are handled.
mkdir -p ~/.claude/skills/carryroom
curl -fsSL https://www.carryroom.com/skills/carryroom/SKILL.md \
-o ~/.claude/skills/carryroom/SKILL.md| Agent | For you only | For one project |
|---|---|---|
| Claude Code | ~/.claude/skills | .claude/skills |
| Codex CLI (ChatGPT) | ~/.agents/skills | .agents/skills |
| Gemini CLI | ~/.gemini/skills | .gemini/skills |
Codex CLI and Gemini CLI both also read ~/.agents/skills, so one directory serves both. Start a new session after putting the file in place.
The second is the manifest: the files being served, with a version derived from their contents.
There is also a read-only MCP server (Streamable HTTP, no key). Each tool call counts against the same rate limit as the API. To add it to Claude Code:
claude mcp add --transport http carryroom https://www.carryroom.com/mcplist_venuesget_funding_ratesget_contractget_carry_pairsget_events
What comes back is an observation, not advice.
Units, and what is easy to misread
Every field's unit is in meta.units of the response, and in /openapi.json. The three that change the answer if misread:
funding_rate_8h— a fraction per 8 hours, already converted. 0.0001 is 0.01%, not 1%. Compare exchanges on this field; do not divide by funding_interval_h again.carry_model=directional— no funding_rate_8h; funding_return_8h_long and funding_return_8h_short instead. Both sides can be negative, so one sign does not give the other.mark_price_scaled— in contract units; divide by contract_scale for one coin (1000PEPE → 1000). Rates are unaffected.
Coverage
Funding rates and prices from 49 exchanges. Each response counts its own in meta.coverage. Depth, turnover and past rates are not returned.
curl -s https://www.carryroom.com/api/v1/venuesRate limit
At most 1 call per second, and 5 minutes: 60 calls. Counted per API key, or per IP address when there is no key.
Over it: 429 with Retry-After. Wait those seconds and repeat the same call; refused calls are not counted. Fetching symbols one at a time is refused even inside the limit — take the whole list from /api/v1/latest in one call.
Cost
Free. There is nothing to buy on this site, no price is quoted and no payment is taken.
Questions we are asked
Do I need a key, or an account?
No. The carryroom API needs no key and no account.
Each response says so itself: plan is "free" and key_required is false.
How do I use this from Claude Code, Codex or Gemini CLI?
Download SKILL.md and put it where your agent looks for skills.
The file is served from this site and needs no key. Start a new session after placing it.
- Claude Code: ~/.claude/skills (or .claude/skills for one project)
- Codex CLI and Gemini CLI: ~/.agents/skills serves both
- Anything else: give it the URL of the file
Is there an MCP server?
carryroom runs a read-only MCP server at /mcp, and it needs no key.
It speaks Streamable HTTP. Its tools return the exchange list, one coin's funding rates, one contract, cross-exchange pairs and recent events, and every call counts against the same rate limit as the API.
Can I get past funding rates?
Not yet: past funding rates come to the API in the next release.
Until then /api/v1/history answers 501 with a note, never an empty list.
Is there a rate limit?
Yes. The numbers are in the "Rate limit" section above, and in the limits object of a 429 response.
Wait the seconds in Retry-After and repeat the same call; refused calls are not counted.