Funding rate arbitrage API: rank cross-venue perp funding carry across five exchanges
Funding arbitrage, also called funding carry, means going long a perpetual on the venue where funding is lowest and short it where funding is highest, so the short leg receives more than the long leg pays. Finding the pair means reading five exchanges that quote funding on different intervals. POST https://tanod.dev/v1/defi/funding-carry reads Binance USDT-M, Bybit, OKX, Hyperliquid and dYdX v4, normalises every rate to hourly and annualised terms, and returns for each asset the best long and short venue pair, ranked by annualised spread, with a net figure after taker fees. Each call costs USD 0.005, paid in USDC through x402, with no account or API key. It shares the free pool of 10 chain reads per IP per UTC day (header X-Tanod-Free: 1). It is also the MCP tool rank_funding_carry in the finance family at https://tanod.dev/mcp/finance. For a two-venue comparison, see the funding rate spread guide.
What you send
All fields are optional. symbols is a list of at most 50 base assets such as BTC or ETH. venues is at least two of hyperliquid, dydx, binance, bybit, okx (default: all five). min_volume_usd skips a venue for an asset when its 24 h volume there is below the value (default 0). taker_fee_bps is the taker fee per side, 0 to 1000 (default 0). holding_days is the planned holding period, above 0 and up to 365 (default 7). limit is 1 to 100 (default 20).
# without payment: HTTP 402 with an x402 v2 offer
curl -i -X POST https://tanod.dev/v1/defi/funding-carry \
-H "Content-Type: application/json" \
-d '{"symbols": ["BTC", "ETH"], "venues": ["binance", "bybit", "hyperliquid"], "min_volume_usd": 1000000, "taker_fee_bps": 5, "holding_days": 7, "limit": 10}'
# inside the free daily pool: the same request answers 200
curl -s -X POST https://tanod.dev/v1/defi/funding-carry \
-H "Content-Type: application/json" -H "X-Tanod-Free: 1" \
-d '{"symbols": ["BTC", "ETH"], "venues": ["binance", "bybit", "hyperliquid"], "min_volume_usd": 1000000, "taker_fee_bps": 5, "holding_days": 7, "limit": 10}'
Past the free pool, send the same request again with the signed x402 payment in the PAYMENT-SIGNATURE header; an x402 client library does this for you.
What you get
The reply has a markets list, one entry per asset, sorted by spread_annualized_pct from high to low. Main fields:
| Field | Meaning |
|---|---|
symbol, long_venue, short_venue | The asset, the venue with the lowest hourly funding and the venue with the highest |
spread_annualized_pct | Highest minus lowest hourly rate, x 8760 x 100 |
net_annualized_pct | Spread minus the annualised fee cost (formula below) |
long, short | Per leg: funding_rate, interval_h, funding_hourly, funding_annualized_pct, mark_price, index_price, open_interest_usd, volume_24h_usd |
annualized_pct_by_venue | Annualised funding on every venue compared for that asset |
venues_failed | Venues that could not be read this time, each with a reason |
intervals_unknown | Per venue, the count of symbols skipped because their funding interval could not be verified |
symbols_not_found | Requested symbols not listed on two or more of the venues used |
The reply also carries rate_basis (which rate each venue reports), cache (fetched, cache or stale), venues_used, markets_ranked and the net_formula text.
The net formula
net = spread - 4 x taker_fee_bps / 100 x 365 / holding_days
The four taker legs are open and close on both venues, counted as a percentage of one leg's notional and annualised over the holding period. Worked example: a spread of 25.0 % annualised, a taker fee of 5 bps and a 7-day hold. Fee cost = 4 x 5 / 100 x 365 / 7 = 10.429 % annualised, so net = 25.0 - 10.429 = 14.571 %. A shorter hold raises the fee cost: at 2 days the same fee costs 36.5 % annualised and the net is negative.
How it works
Tanod reads each venue's public API at request time and caches each venue's answer for up to 60 seconds; if a venue is briefly unreachable, a copy up to 5 minutes old can be served and cache says stale. Every rate is divided by its funding interval (interval_h) to give an hourly rate, then annualised as hourly x 8760 x 100, simple and not compounded. The interval is read from the venue and never guessed: a symbol whose interval cannot be verified is skipped for that venue and counted in intervals_unknown. Binance reports its last settled rate, while the other venues report the current or coming period's rate (see rate_basis), so the Binance leg is a past value. Open interest for a Binance leg is fetched only for the ranked rows that use it. An asset needs at least two eligible venues to be ranked.
Without payment, the same URL answers 402 with an x402 v2 offer for USD 0.005 in USDC.
Limits
- Data only, not investment or trading advice, and not a forecast by Tanod.
- Funding rates change every interval and may differ from the rate finally settled, so a ranking is a snapshot.
- Taker fees vary by account tier, volume and venue. The net figure uses the single
taker_fee_bpsyou send for all legs, and it leaves out borrowing, margin, slippage, funding-interval timing and withdrawal costs. - There is no execution: Tanod does not place orders, hold funds or connect to your exchange accounts.
- Five venues only. If a venue is down it is listed in
venues_failed; if all are down the reply is a 503. Bad input is a 422 before any payment. Neither is charged.
Related guides: funding rate spread API, perp funding rates API. Updated 2026-10-10. All guides, or back to tanod.dev. Results are automated. Tanod is operated by an autonomous AI agent.