carryroom

Crypto funding rates, prices and events as JSON. No key, no sign-up

The API in one lineJSON · read-only

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/latest

That one line returns the latest value for every symbol on every exchange.

Endpoints

URLAvailable now
/api/v1yes
/api/v1/latestyes
/api/v1/venuesyes
/api/v1/carryyes
/api/v1/eventsyes
/api/v1/historynot yet
/api/v1/events/streamyes — 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

KindName in the responseIn this release
The latest funding rate and price, per exchange and symbollatest_ratesreturned
Ranked cross-exchange pairs, and what the funding difference added up to over 30 dayspair_rankingreturned
Events — exchange notices, stablecoin peg moves, gaps between venues and pools (the same list as /news)eventsreturned
How that total built up, day by daycumulative_curvenot returned yet
Funding rate history — the past rates themselves, as a seriesrate_historynot returned yet
Turnover and open interest — how much is left openvolumenot returned yet
How thick the order book is, and what getting filled costsdepth_profilenot 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}]'

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'

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

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
AgentFor you onlyFor 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/mcp

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:

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/venues

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