Skip to content
TidePerp
Checking sources……

TidePerp API

Versioned REST under /v1 and a WebSocket stream at /v1/ws. Decimal strings for every financial value, ISO-8601 UTC timestamps, and provenance on every time-sensitive value. The OpenAPI document is served by the API itself.

Quick start: BTC market data in four requests

No key needed for public market data (60 requests per minute per address)

  1. 1Find the instrument. Search returns markets, protocols and assets; the id is stable across symbol changes.

    curl "https://api.tideperp.tech/v1/search?q=BTC&limit=3"
  2. 2Read the market: current metrics, specification, fee schedule and provenance in one document.

    curl "https://api.tideperp.tech/v1/markets/{id}"
  3. 3Pull history: candles, funding, open interest, trades, liquidity.

    curl "https://api.tideperp.tech/v1/markets/{id}/candles?interval=1h&limit=168"
    curl "https://api.tideperp.tech/v1/markets/{id}/funding?limit=168"
    curl "https://api.tideperp.tech/v1/markets/{id}/open-interest?bucket=1h&limit=168"
  4. 4Stream it. Subscribe per channel and instrument; every event carries a sequence per (channel, instrument), its observation time and quality status.

    const ws = new WebSocket("wss://api.tideperp.tech/v1/ws");
    ws.onopen = () => ws.send(JSON.stringify({ action: "subscribe", channel: "market.ticker", instrument_ids: ["{id}"] }));
    ws.onmessage = (m) => { const e = JSON.parse(m.data); if (e.type === "event") console.log(e.sequence, e.quality_status, e.data.mark_price); };

Every REST response is { data, meta }; meta carries request_id, generated_at, environment, the overall source_status and next_cursor for paginated lists. Errors are { error: { code, message, request_id, details } }.

Authentication

Public market data needs no credentials. Account features (watchlists, alerts, keys) use the browser session cookie with a CSRF token, or an API key:

curl -H "Authorization: Bearer tp_live_xxxxxxxx_…" "https://api.tideperp.tech/v1/watchlists"
  • Keys are created at API keys, shown once, stored as a peppered hash, and sent only in the Authorization header (never in a query string).
  • Scopes: read for REST, stream to raise WebSocket subscription limits with an auth message.
  • Keys can expire; revoking is immediate.

Rate limits

TidePerp policy limits, enforced per key, per session or per address

PrincipalREST requests / minuteWebSocket subscriptions
Anonymous (per address)6050 per connection
Developer plan300200
Professional plan1,200800

Defaults of this deployment; the effective limit is returned on every response in x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset. A rejected request answers 429 with RATE_LIMIT_EXCEEDED. These are TidePerp limits, independent of the exchange’s own limits, which the ingester respects separately.

Endpoints

Loading

WebSocket channels

/v1/ws · heartbeat every 20 s · ping/pong · subscribe, unsubscribe and auth actions

ChannelPayload
market.tickerMark, mid, oracle, funding, open interest and 24h volume per instrument, on every source update.
market.tradesObserved trades for the subscribed instruments (demand-driven on the source).
market.orderbookTop-of-book snapshots with up to 20 levels per side.
market.fundingFunding observations as they are recorded.
market.open_interestOpen interest observations.
protocol.metricsReserved for venue-level aggregates; no publisher in this version.
intelligence.alertsDetector signals as they are detected.
chain.blocksIndexed Elysium blocks.
system.healthSource health transitions.

Event envelope: { type: "event", event_id, channel, sequence, occurred_at, published_at, environment, instrument_id, quality_status, data }. Subscribing without instrument_ids receives every instrument on the channel as one subscription.

Error reference

CodeMeaning
INVALID_PARAMETERA query, path or body value failed validation; details name the field.
MARKET_NOT_FOUNDNo instrument with that id or canonical code.
VENUE_NOT_FOUNDNo venue with that id or code.
PROTOCOL_NOT_FOUNDNo protocol with that slug.
NOT_FOUNDThe resource does not exist or is not yours.
NON_COMPARABLE_MARKETSThe instruments are not in one comparison group; they cannot be ranked together.
INSUFFICIENT_DEPTHThe visible order book cannot fill the requested size; nothing is extrapolated.
STALE_MARKET_DATAThe latest snapshot is older than max_snapshot_age_ms; raise it or wait for a fresh book.
SOURCE_UNAVAILABLEAn upstream source is down or the platform has no observation yet.
RATE_LIMIT_EXCEEDEDToo many requests for this key, session or address; details carry retry_after_ms.
UNAUTHORIZEDMissing, invalid, expired or revoked credentials.
FORBIDDENAuthenticated but not allowed: wrong scope, missing CSRF token or missing role.
CONFLICTThe request conflicts with existing state (for example a duplicate email).
INTERNAL_ERRORThe platform failed; the request_id lets operators find the trace.

Data methodology

Formulas, detector parameters, quality states and source limits are published at GET /v1/methodology and rendered on the methodology page. Quality status values: LIVE, DELAYED, STALE, ESTIMATED, RECONSTRUCTED, MISSING, UNAVAILABLE, INVALID.

Changelog

  • 0.1.02026-11-07 · Initial public API: markets, protocols, overview aggregates, compare and funding opportunities, intelligence, chain telemetry, accounts, watchlists, alerts, API keys, methodology; WebSocket stream.

Status

Platform and source health: system status, or GET /v1/health (exempt from rate limits). OpenAPI document: GET /v1/openapi.json.