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/latestEvery 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 number | Name in the response | In this release |
|---|---|---|
| The latest funding rate and price, per exchange and symbol | latest_rates | open |
| Ranked cross-exchange pairs, and what the funding difference added up to over 30 days | pair_ranking | open |
| 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 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
| Address | Available now |
|---|---|
/api/v1 | yes |
/api/v1/latest | yes |
/api/v1/venues | yes |
/api/v1/carry | yes |
/api/v1/history | not 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.mdThat path is Claude Code's. The other agents keep theirs elsewhere:
| 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 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:
funding_rate_8h— a fraction of the position's size per 8 hours. 0.0001 is one hundredth of a percent, not one percent.funding_rate_annualised_pct— percent per year, simple: the 8-hour figure times 3 times 365. Nothing is compounded.funding_interval_h— the hours between settlements the exchange itself quotes, left exactly as it quotes it.mark_price_scaled— the price in the contract's own units. Divide by contract_scale for the price of one coin.
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 -cThe 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.
- Some exchanges price the two sides of the trade independently. Those rows say carry_model is directional, have no funding_rate_8h at all, and carry funding_return_8h_short and funding_return_8h_long instead. Flipping the sign of one to get the other does not work: both sides can be negative at the same time, and folding them into a single number invents a trade that does not exist.
- One contract is not always one coin. contract_scale says how many coins one contract stands for, baked into the exchange's own symbol — 1000PEPE is 1000. Divide the price by it before comparing prices across exchanges. The rate is a fraction of what you hold, so the scale does not touch the rate.
- Not everything on the list is perpetual. Where expires_at_ms is not null the contract has a settlement date, and dated contracts have no funding mechanism at all: their funding_rate_8h is exactly 0.0, which is not a quiet market but the absence of the mechanism. Sort by funding and they sort last. What they carry sits in the gap between the dated price and the perpetual price on the same exchange.
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/venuesCoverage 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