carryroom

at a glance

Funding rates and prices as JSON. No key, no sign-up

What this page is

A funding rate is the payment that changes hands between the two sides of a perpetual futures position, on a clock each exchange sets for itself. This site reads those rates, and the prices next to them, from each exchange's own public API about once a minute. The same observations are served as JSON, at the addresses below.

No key, no sign-up, nothing to install. One line is enough to see the whole list:

curl -s https://www.carryroom.com/api/v1/latest

Every response says which release it belongs to, when it was generated, and what it does not contain. Nothing is returned as an empty list to stand in for something that has not been built.

What comes back today

Kind of numberName in the responseIn this release
The latest funding rate and price, per exchange and symbollatest_ratesopen
Ranked cross-exchange pairs, and what the funding difference added up to over 30 dayspair_rankingopen
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 history of the rates themselves is the next release. Until it is there, the address for it answers with a short note saying so — never with an empty list, which a program cannot tell apart from "nothing matched today".

A kind marked "open" is what this release is willing to return; whether its address is already standing is a separate question, and the list below answers it.

Addresses

AddressAvailable now
/api/v1yes
/api/v1/latestyes
/api/v1/venuesyes
/api/v1/carryyes
/api/v1/historynot yet

No address on this list takes a key, because this release has no notion of one. An address marked "not yet" answers with a short note saying so, and says what to call instead; it never answers with an empty list.

Fetch the list once, then work on it locally. One exchange, its rates and the interval each of them settles on:

curl -s https://www.carryroom.com/api/v1/latest \
  | jq '[.rows[] | select(.venue == "hyperliquid")
         | {symbol, funding_rate_8h, funding_interval_h}]'

The symbol field is the exchange's own spelling, so 1000BONK and BONK are the same asset written twice. Each row also carries the normalised asset name, and that is the one to join on for a cross-exchange comparison. Without a query the list comes back in the same scope the screens use; name the others to widen it, as in ?venues=dydx,btcc. A name that cannot be read is reported back rather than quietly widening the result.

Calling it from an agent

What an agent needs starts from one file, served from this site itself, so there is no package registry in the way. It is the plain skill format that Claude Code, Codex (ChatGPT) and other agents read: a short front matter naming the file, then the rules of the road.

mkdir -p ~/.claude/skills/carryroom
curl -fsSL https://www.carryroom.com/skills/carryroom/SKILL.md \
  -o ~/.claude/skills/carryroom/SKILL.md

That path is Claude Code's. The other agents keep theirs elsewhere:

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 them together. Start a new session after putting the file in place.

Where an agent keeps its skills moves between versions. If yours does not find the file, hand it the address instead. The second address above is the manifest: it lists every file the site is serving, how large each one is, and a digest of what is being served, so an agent can tell whether the copy it holds is still current.

There is no MCP server in this release. The addresses are ordinary HTTP with no key, so an MCP server that can fetch a URL reaches them as they are, and so does an agent's own fetch tool.

What comes back is an observation, not advice. Ask the agent to report the field, its value and its unit as they stand, and to say what the response says it is missing.

Units and times

Each response carries a meta.units block naming the unit of every number in it, so the unit never lives in a document that can drift away from the data. Field names ending in _ms are epoch milliseconds in UTC; field names ending in _utc are RFC 3339.

The four fields that are read wrongly most often:

How settlement intervals are handled

Exchanges settle funding on different clocks — the funding settlement interval is one hour on some, four on others, eight on others again. A headline rate from one exchange and a headline rate from another are therefore not the same measurement, and lining them up side by side without saying so is the single mistake this data is most often used to make.

The size of that mistake: a rate of 0.00002 quoted by an exchange that settles every hour is 0.00016 over eight hours, while the same 0.00002 quoted by an exchange that settles every eight hours is 0.00002. Eight times apart, and the larger printed number belongs to the smaller payment.

So both numbers come back, and they are kept apart. funding_rate_8h has already been converted to a per-8-hour basis, which is what makes two exchanges comparable — converting it a second time is the same error twice. funding_interval_h is the exchange's own interval, untouched, so the conversion can be undone or checked.

The interval belongs to the symbol, not to the exchange: one exchange can carry hourly, four-hourly and eight-hourly symbols at the same moment, and a symbol can change its own interval from one day to the next. Rather than print a count here that would quietly go out of date, here is how to count it yourself, right now:

curl -s https://www.carryroom.com/api/v1/latest \
  | jq -r '.rows[].funding_interval_h' | sort -n | uniq -c

The annualised figure is simple, not compounded, and it is a hypothetical: this instant's rate extended to a year, not a forecast and not a realised return. The arithmetic is set out under how to read the numbers.

Where exchanges differ from one another

Three differences survive every attempt to flatten them, so the response keeps them visible rather than picking one convention and hiding the rest.

How much is covered

Exchanges listed on this site: 48. Funding rates and prices are read from those, about once a minute.

How many of them actually appear in a given response is a different number, and the response counts it rather than claiming it: meta.coverage carries the count, and the venues address lists them one by one with whether each is in the current observation.

curl -s https://www.carryroom.com/api/v1/venues

Coverage is not one number for the whole site: it differs by the kind of number asked for. This release returns funding rates and prices, and does not return order-book depth, turnover or the history of the rates — so it publishes no count for those, because it has not measured them here.

How many calls

Ask for the list in one call rather than one call per symbol. What is measured is the shape of the traffic as well as the count: many different symbols fetched once each looks like a sweep, while a few of them watched repeatedly does not.

A refusal comes back as 429 with Retry-After and the address to call instead, so a program can recover without a person reading a document.

Cost

There is no charge for any of this, and there is nothing to buy on this site. No price is quoted anywhere, and no payment is taken.

Questions we are asked

Do I need a key, or an account?

No. There is no key, and no account to make.

Every response says so in its own body: it carries a plan field reading "free" and a key_required field reading false, so a program can tell whether it is seeing everything without asking anyone.

How do I use this from Claude Code, Codex or Gemini CLI?

Download one file and put it where your agent looks for skills.

The file is served from this site itself, so no package registry is involved, and no key is needed at any point. It is the plain skill format, so the same file works for each of them. Start a new session after putting it in place.

  • Claude Code: ~/.claude/skills (or .claude/skills for one project)
  • Codex CLI and Gemini CLI: ~/.agents/skills serves both
  • Anything else: hand it the address of the file and let it read it

Is there an MCP server?

Not in this release.

The addresses are ordinary HTTP and take no key, so an MCP server that can fetch a URL reads them as they are, and so does an agent's own fetch tool. Nothing has to be installed or authorised first.

Can I get past funding rates?

Not yet. Rate history is the next release.

What comes back today is the latest rate and price per exchange and symbol. Until the history is there, the address for it answers with a short note saying so, so a program is never left reading an empty list as an answer.

How often can I call it?

Ask for the list in one call; a call per symbol is what gets refused.

What is measured is the shape of the traffic, not only the count: fetching many different symbols once each looks like a sweep, while looking at a few of them repeatedly does not. A refusal comes back as 429 with a Retry-After header and the address to call instead.

What unit is each number in?

In the response itself, under meta.units.

Times follow the field name: anything ending in _ms is epoch milliseconds in UTC, and anything ending in _utc is RFC 3339. Prices are given in the contract's own units together with the scale, because a contract can stand for a thousand coins.

Something I want is not there. Is it broken?

No. An address that is not built yet says so, rather than returning an empty list.

An empty list cannot be told apart from "nothing matched today", and a program that reads one will carry that away as a fact. So those addresses answer 501 with a status of not_yet, a line saying why, and the addresses that do work.

Exchanges settle funding on different clocks. How are they lined up?

Two fields, kept apart: the rate converted to a per-8-hour basis, and the exchange's own interval left exactly as it quotes it.

The conversion is what makes two exchanges comparable, and it has already been applied — dividing or multiplying by the interval a second time is the same error twice. The interval is there so you know how many payments fall inside the time you hold, which is not the same question.

  • 0.00002 on an exchange that settles hourly is 0.00016 over eight hours.
  • 0.00002 on an exchange that settles every eight hours stays 0.00002.
  • The interval belongs to the symbol, not the exchange: one exchange can carry hourly, four-hourly and eight-hourly symbols at the same moment.

How many exchanges does this cover?

Funding rates and prices are read from the exchanges this site lists, and the response counts them rather than claiming a number.

There is no single number for the whole site, because coverage differs by the kind of number asked for. This release returns funding rates and prices; it does not return order-book depth, turnover or rate history, so it publishes no count for those either.

  • The exchange list, and whether each is in the current observation: /api/v1/venues