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:

FieldMeaning
symbol, long_venue, short_venueThe asset, the venue with the lowest hourly funding and the venue with the highest
spread_annualized_pctHighest minus lowest hourly rate, x 8760 x 100
net_annualized_pctSpread minus the annualised fee cost (formula below)
long, shortPer leg: funding_rate, interval_h, funding_hourly, funding_annualized_pct, mark_price, index_price, open_interest_usd, volume_24h_usd
annualized_pct_by_venueAnnualised funding on every venue compared for that asset
venues_failedVenues that could not be read this time, each with a reason
intervals_unknownPer venue, the count of symbols skipped because their funding interval could not be verified
symbols_not_foundRequested 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

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.