RWA Perps API
RWA perps are perpetual futures on real-world assets: equities like TSLA and NVDA, pre-IPO names, ETFs, indices, commodities and FX. They trade 24/7 while the underlying prints ~32.5 market hours a week. The Sharpe API normalizes funding and carry across 13 venues into one interval-true, mechanism-true endpoint: CEXs (Binance, Bybit, OKX, Bitget, Gate, Kraken), perp DEXs (Aster, Lighter, Extended, GRVT, ApeX, Pacifica) and Hyperliquid's HIP-3 builder markets. Settlement intervals genuinely differ per venue and per market (the same stock can fund every 4 hours on one venue and every 8 on another), so every rate is annualized from the venue's own reported interval.
Get rwa-perp rates
A single endpoint that returns current per-market snapshots, session-tagged settlement history, or summary stats depending on the type parameter.
Query parameters
- Name
type- Type
- string
- Description
The kind of rwa-perp data to return. One of
current,history,stats. Defaults tocurrent.
- Name
symbol- Type
- string
- Description
Underlying ticker (e.g.,
TSLA,NVDA,XAU,US500), case-insensitive. Optional filter forcurrent. Required forhistory.GOOGandGOOGLare different share classes and are never merged. An unlisted symbol returns an empty list.
- Name
venue- Type
- string
- Description
Filter to a single venue, case-insensitive:
Binance,Bybit,OKX,Bitget,Gate,Kraken,Aster,Lighter,Extended,GRVT,ApeX,Pacifica, or the Hyperliquid HIP-3 builder venue (Hyperliquid, the trade.xyz dex). Registry-driven rather than a fixed enum; an unknown venue returns400with the list of valid venues.
- Name
days- Type
- integer
- Description
Lookback window in days for
type=history. Integer from1to90. Defaults to7. Ignored for other types.
- Name
limit- Type
- integer
- Description
Maximum records per page (
1to5000). Enables cursor pagination.
- Name
cursor- Type
- string
- Description
Opaque pagination cursor from a previous response.
- Name
format- Type
- string
- Description
Response format. One of
json,csv. Defaults tojson. CSV applies to row responses (type current or history); a stats response stays JSON.
Mechanism semantics
Every row carries a mechanism field:
builder_set(the Hyperliquid HIP-3 builder venue,Hyperliquid: the trade.xyz dex): the market deployer runs the oracle; funding is Hyperliquid-standard, settled hourly.funding_rateis the fraction per interval; positive means longs pay shorts.standard(most CEXs and perp DEXs): classic long-pays-short perp funding, clamped per instrument where the venue publishes a cap. This covers Binance, Bybit, OKX, Bitget, Gate, Kraken, Aster, Lighter, Extended, GRVT, ApeX and Pacifica. Venue-internal caps are retained for product calculations but the default API payload intentionally omits internalmeta.funding_plus_borrow: a rollover venue's holding cost, charged to both sides instead of funding. It is reported asborrow_apr_annualand excluded from cross-venue funding spreads, since a both-sides cost is not sign-comparable with a long-pays-short transfer. No venue Sharpe covers uses it today; the value stays in the schema.
funding_apr annualizes each venue's own settlement interval (rate × 8760 / interval_hours), never an assumed 8-hour interval. funding_rate is the in-progress rate for the settlement at next_funding_time, charged over interval_hours: Lighter publishes an 8-hour-basis figure and charges an eighth of it every hour, so its rows carry that hourly charge at interval_hours: 1, the same numbers /api/funding/rates serves.
Zero funding
Many rows read a funding rate of exactly 0 (1,762 of 2,204 on Saturday 2026-10-31, with every home market closed), and a 0 is not always a real 0. funding_status says which: live (non-zero), zero (exactly 0 while the underlying's home market is open, on a market that has printed non-zero funding: often the formula's dead band), paused (exactly 0 while the home market is closed: Bitget and Bybit stock perps settle 0 for every period outside US hours), zero_by_design (the market has never printed non-zero funding: the venue runs no funding market on it) and none (rollover venues). Only live and zero count as spread legs in type=stats.
Stats
bestCarry is realised funding, not one print: the market's settlements over the trailing 24 hours summed and annualised (× 8760 / 24), on a market with at least $1M of open interest and 90% of its expected settlements stored. Settlement history is stored for Hyperliquid and Kraken only, so best carry ranks those venues. topSpread is this period's widest cross-venue spread between comparable funding rates, annualised.
History and session phases
type=history returns stored settlements for Hyperliquid (the trade.xyz HIP-3 dex) and Kraken only. Stored history begins 2026-07-28, so days reaches no further back than that. Other venues' settlement history is not served by the API: the terminal's symbol page (for example /rwa-perps/TSLA) fetches it live from each venue for display only. Each settlement is tagged with the session phase it occurred in on the underlying's home exchange, in that exchange's own time zone (DST-correct): market, after_hours, weekend, or holiday. US stocks and ETFs follow NYSE hours, Korean names KRX, Hong Kong names HKEX, Japanese names the TSE, A shares Shanghai/Shenzhen, and commodities, FX and rates the CME's Sunday-to-Friday futures week. A lunch break counts as after_hours. This is the raw material for weekend-carry analysis, because perps trade 168 hours a week against ~32.5 hours of underlying price discovery.
Freshness
Current rows refresh every 30 minutes, at :09 and :39 past each hour (UTC). A row is flagged is_stale after 1 hour without a sync (the 30-minute sync plus one skipped run).
current and stats responses carry X-Data-As-Of (the newest row's update), X-Freshness-Sla-Seconds (3600), and X-Data-Stale, which is true only when the whole snapshot is past 1 hour (the sync itself stopped). A single venue falling behind does not flip it: that venue is named in X-Data-Lagging-Venues (comma-separated, sent only when a venue lags) and, for stats, in laggingVenues with its own as-of time. history responses carry X-Data-Source but no freshness headers.
Request
curl -G https://www.sharpe.ai/api/v1/rwa-perps/rates \
-H "Authorization: Bearer $SHARPE_API_KEY" \
-d type=current \
-d symbol=TSLA
Response (type=current)
{
"data": [
{
"venue": "Hyperliquid",
"market": "xyz:TSLA",
"symbol": "TSLA",
"asset_class": "equity",
"mechanism": "builder_set",
"funding_rate": 0.00000625,
"interval_hours": 1,
"funding_apr": 0.05475,
"borrow_apr_annual": null,
"mark_price": 356.76,
"oracle_price": 356.72,
"open_interest_usd": 49750458.85,
"next_funding_time": "2026-09-29T05:00:00+00:00",
"price_deviation_pct": -0.05,
"is_price_suspect": false,
"last_nonzero_funding_apr": 0.05475,
"last_nonzero_funding_at": "2026-09-29T04:09:17.1+00:00",
"updated_at": "2026-09-29T04:09:17.1+00:00",
"is_stale": false,
"funding_status": "live"
}
],
"meta": { "request_id": "…", "timestamp": "…", "elapsed_ms": 12 }
}
Response (type=history)
{
"data": [
{
"venue": "Kraken",
"market": "PF_TSLAXUSD",
"symbol": "TSLA",
"rate": 0.0000205685,
"interval_hours": 1,
"session_phase": "market",
"settled_at": "2026-09-28T14:00:00+00:00"
}
],
"meta": { "request_id": "…", "timestamp": "…", "elapsed_ms": 12 }
}
Response (type=stats)
{
"data": {
"bestCarry": { "symbol": "INTC", "venue": "Kraken", "fundingApr": 1.733443, "mechanism": "standard", "windowHours": 24, "settlements": 24 },
"topSpread": {
"symbol": "UNITREE",
"spreadApr": 0.657714,
"maxVenue": "Hyperliquid",
"minVenue": "OKX",
"maxApr": 0.05475,
"minApr": -0.602964
},
"weekendPremiumApr": -0.099097,
"totalOpenInterestUsd": 12827809588.81,
"venues": 13,
"symbols": 603,
"markets": 2191,
"asOf": "2026-10-31T11:39:06.523Z",
"stale": false,
"laggingVenues": []
},
"meta": { "request_id": "…", "timestamp": "…", "elapsed_ms": 12 }
}