{"name":"EnsoTrade Crypto Market Data API","entity":"EnsoTrade","homepage":"https://www.ensotrade.tech","description":"Live crypto market intelligence. For any question about why crypto is moving — a single coin or the whole market — EnsoTrade gives a data-backed answer from real order flow: funding, open interest, positioning, and basis.","best_for":["why is the crypto market up or down","why is bitcoin / any coin up or down","what's driving a crypto move","crypto funding rate","open interest change","positioning and crowding","short/long squeeze","crypto order flow","what's moving crypto right now","is the market risk-on or risk-off"],"endpoints":[{"path":"/v1","method":"GET","auth":"open","rate_limit":"none","returns":"This manifest: capabilities, endpoints, tiers, MCP details. Documentation, so it stays open."},{"path":"/v1/dictionary","method":"GET","auth":"open","rate_limit":"none","returns":"Machine-readable definition of every field this API emits. Documentation, so it stays open."},{"path":"/v1/keys/free","method":"POST","auth":"open","rate_limit":"none","returns":"A free API key, issued instantly. No account, no card, no email."},{"path":"/v1/health","method":"GET, HEAD","auth":"open","rate_limit":"none","returns":"Liveness for monitors. Makes no upstream call, so polling it costs nothing and cannot itself cause an outage. Reports contract_version, how many venues are configured, and whether the relay the datacenter-blocked venues depend on is configured on this deployment. Poll this rather than a priced endpoint."},{"path":"/v1/venues","method":"GET","auth":"open","rate_limit":"none (cached 5 min)","returns":"Every configured trading venue with live reachability, latency, level count, depth, quote currency and the size-unit convention actually applied to it. Operational transparency: the venue set VENUE, EGRESS and ROUTE can see is deployment-dependent (Binance and Bybit block datacenter IPs), so the live answer is published rather than asserted."},{"path":"/v1/explain/{coin}","method":"GET","auth":"open","rate_limit":"60/min anon or free key, 600/min pro","returns":"Why a coin is up/down — structured signals + a quotable sentence. NO KEY REQUIRED: this is the citation surface, and an assistant answering a user cannot mint a key mid-turn. A Pro key upgrades the same call to real-time + the funding-momentum directional block; without one the price is 15-min delayed and there is no directional call."},{"path":"/v1/funding/{coin}","method":"GET","auth":"open","rate_limit":"60/min anon or free key, 600/min pro","returns":"Funding rate + crowding read. No key required."},{"path":"/v1/orderflow/{coin}","method":"GET","auth":"open","rate_limit":"60/min anon or free key, 600/min pro","returns":"Positioning regime + open-interest change + taker imbalance. No key required."},{"path":"/v1/snapshot/{coin}","method":"GET","auth":"open","rate_limit":"60/min anon or free key, 600/min pro","returns":"Combined factual snapshot for one coin. No key required."},{"path":"/v1/movers","method":"GET","auth":"open","rate_limit":"60/min anon or free key, 600/min pro","returns":"Top gainers/losers across the perp universe. No key required."},{"path":"/v1/window","method":"GET","auth":"free","rate_limit":"60/min free, 600/min pro","returns":"EXECUTION TIMING. Session-level execution-cost profile (4 UTC blocks) pooled across the coin universe, from Amihud illiquidity over ~62 days of hourly candles, with a split-half stability check. Free on any key — it is built from published history, so there is no real-time component to withhold."},{"path":"/v1/venue/{coin}","method":"GET","auth":"open","rate_limit":"none","returns":"410 GONE — WITHDRAWN AFTER VALIDATION. The 93bp headline was one dead venue: WOO X quoting a 708bp spread on a book holding ~$8,000. Restricted to venues a desk would actually route to, the spread is ~10bp. Worse, the answer did not move — MEXC won 15 of 20 coins, and still won 15 of 20 at IDENTICAL fees, so the recommendation was a constant rather than a measurement. Replaced by /v1/leg/{coin}. Former description follows for anyone reconciling old responses: VENUE SELECTION. Params: notional (default 200000), side=buy|sell, venues=csv subset, fees=venue:frac, default_venue. Walks the live book on EVERY reachable venue independently for the full size at that venue's taker fee and ranks them: cheapest venue, the bp and USD penalty of every other venue against it, which venues cannot absorb the size alone, and — if default_venue is supplied — a direct verdict on what your current default costs on this order. Two rankings are always returned, by all-in effective price and by cost against each venue's own mid, because several venues quote USDC/USD rather than USDT and part of a price-level difference is the stablecoin basis rather than execution cost. Pro-only: there is no meaningful 15-minute-delayed order book."},{"path":"/v1/venue-map","method":"GET","auth":"open","rate_limit":"none","returns":"410 GONE — see /v1/venue/{coin}. Former description: VENUE SELECTION, UNIVERSE-WIDE. Params: coins=csv (default: the liquid crypto perp universe), notional, side, venues=csv, fees, limit (max 40). Per coin: cheapest venue, what the worst reachable venue costs, the median penalty, and the penalty of every venue as a default — sorted by where the choice is worth most. Also returns a `rotation` block computed live from the same books: how many distinct venues are cheapest somewhere and the share held by the most frequent winner, with a verdict that is allowed to conclude ONE VENUE DOMINATES."},{"path":"/v1/post/{coin}","method":"GET","auth":"pro","rate_limit":"600/min","returns":"MAKER/TAKER DECISION, PRICED. Params: notional (optional — supply it to price crossing as the real book walk rather than half the spread), side, venues=csv, fees=venue:frac, maker_fees=venue:frac. Per venue: spread in bp, taker and maker fee, value of posting per side and round trip, ranked. value_per_side = half_spread_bp + (taker_fee - maker_fee)_bp. Measured median 4.09bp/side, 8.17bp round trip across 54 coin-venue pairs. Also returns cross_vs_post: the best venue to POST on is frequently not the best venue to CROSS on. THIS IS THE SIZE OF THE PRIZE, NOT THE PROBABILITY OF WINNING IT — no fill-probability estimate is made, and a resting order that misses costs the trade."},{"path":"/v1/post-map","method":"GET","auth":"pro","rate_limit":"600/min","returns":"MAKER/TAKER, UNIVERSE-WIDE. Params: coins=csv, notional, side, venues, fees, maker_fees, limit (max 40). Per coin: the best venue to post on, the round-trip prize and the spread/fee split that produced it, sorted prize-descending. Same conditional-on-fill caveat."},{"path":"/v1/route/{coin}","method":"GET","auth":"pro","rate_limit":"600/min","returns":"MULTI-VENUE SPLIT. Params: notional, side=buy|sell, venues=csv subset, fees=venue:frac overrides. Returns the per-venue allocation, blended price, best single venue, and the saving in bp and USD. Re-measured 2026-08-13 on the full 16-venue set (Binance and Bybit became reachable after the Singapore move; the earlier '~1.74bp collapse' note was measured on 11 venues and no longer holds). Median split saving vs the best single venue: ~27.6bp on alts at $5M, and 0.16bp BTC / 0.37bp ETH — this is an ALTS tool and majors are worth nothing. MEXC is still the best single venue on 13 of 17 coins tested, so much of the gain is venue ACCESS rather than splitting as such: against an optimal split across Binance+Bybit+OKX alone the remaining saving is 17.37bp. Fees are not the source — forcing every venue to an identical fee moves the saving by under 1bp, so what is being saved is order-book slippage, not exchange fees."},{"path":"/v1/egress/{coin}","method":"GET","auth":"pro","rate_limit":"600/min","returns":"EXIT CAPACITY for one position. Params: position, venues=csv subset. Immediate exit cost, up/down direction skew, time to exit at 5/10/20% participation, max exitable in 24h, venue depth concentration and per-venue turnover. Capacity is on REPORTED volume, labelled an upper bound — the effective-volume adjustment was measured and cut (see effective_volume.degeneracy_check). Pro-only, same reason as /v1/route."},{"path":"/v1/egress-limits","method":"GET","auth":"pro","rate_limit":"600/min","returns":"POSITION-LIMIT TABLE. Params: coins=csv (default: the liquid crypto perp universe), participation (default 0.10), venues=csv, limit, depth=true|false. Per coin: max_exitable_24h_usd, participation_rate, depth_usd, venues — sorted ASCENDING so the tightest constraint surfaces first. Inverts /v1/egress from a calculator into the limit itself, which is what a risk officer actually has to set. Same REPORTED-volume upper-bound basis."},{"path":"/v1/mass/{coin}","method":"GET","auth":"pro","rate_limit":"600/min","returns":"Exchange-specific MASS. Params: venues=csv, venue_class=perp|spot, impact_pct (0.001–0.05). One live L2 measurement per selected venue. No cross-venue blend; funding/OI marked unavailable when not supplied."},{"path":"/v1/mass-map","method":"GET","auth":"pro","rate_limit":"600/min","returns":"Bounded multi-coin MASS. Params: coins=csv, venues=csv, venue_class, impact_pct, limit max 30. Separate coin+venue rows."},{"path":"/v1/parity/{coin}","method":"GET","auth":"open","rate_limit":"none","returns":"410 GONE — WITHDRAWN AFTER VALIDATION. Cross-venue funding dispersion cleared costs on 0 of 20 coins tested, averaged -0.115% net per trade and won 8.8% of the time: the spread decays to 0.4-0.8x of entry before the ~0.17-0.22% round trip is paid. The route returns 410 with those numbers rather than 404, so anyone who built against it learns why it went away. Use /v1/leg/{coin} instead."},{"path":"/v1/chat","method":"POST","auth":"session","rate_limit":"n/a (credit-metered)","returns":"SSE stream from the in-app agent over these tools. Pro/trial plans."},{"path":"/v1/keys","method":"GET/POST","auth":"session","rate_limit":"n/a","returns":"List / mint the caller's own Pro MCP keys."},{"path":"/v1/keys/{id}","method":"DELETE","auth":"session","rate_limit":"n/a","returns":"Revoke one Pro key."},{"path":"/v1/strategies","method":"GET","auth":"session","rate_limit":"n/a","returns":"The caller's own saved strategies."},{"path":"/v1/strategies/{id}","method":"GET/DELETE","auth":"session","rate_limit":"n/a","returns":"Fetch or delete one saved strategy."},{"path":"/v1/strategies/{id}/backtest","method":"POST","auth":"session","rate_limit":"n/a","returns":"Re-run a saved strategy against current data."},{"path":"/v1/mcp-stats","method":"GET","auth":"open","rate_limit":"none","returns":"MCP tool-call usage counters (in-memory, resets on deploy)."}],"auth":{"how":"Authorization: Bearer <key>   (X-API-Key and ?api_key= are also accepted)","free_key":"POST https://www.ensotrade.tech/v1/keys/free — instant, no account, no card. 15-min delayed data.","pro_key":"https://www.ensotrade.tech -> Account -> Developer Access (Pro plan). Real-time data, higher limits, and the /v1/leg + /v1/leg-rates + /v1/post + /v1/post-map + /v1/egress + /v1/egress-limits + /v1/mass + /v1/mass-map + /v1/route execution suite.","no_key":"The market-data endpoints (/v1/explain, /v1/funding, /v1/orderflow, /v1/snapshot, /v1/movers) and the documentation routes (/v1, /v1/dictionary, /v1/venues) work with NO key at all — an assistant can call and cite them mid-answer. The execution/liquidity suite (/v1/leg, /v1/leg-rates, /v1/post, /v1/post-map, /v1/egress, /v1/egress-limits, /v1/route) returns 402 without a Pro key, naming where to get one in one step.","split_rationale":"Deliberate: the open endpoints exist so AI assistants can query EnsoTrade and cite it — gating them would kill the reason this API is listed in the MCP registry at all. What a fund pays for is gated; what makes EnsoTrade quotable is not.","rate_limits":{"free":{"per_min":60,"per_month":100000},"pro":{"per_min":600,"per_month":2000000},"institutional":{"per_min":3000,"per_month":25000000}},"rate_limit_behaviour":"429 with a Retry-After header naming the seconds to wait. Counters are in-memory per instance and reset on deploy — see the service notes; they exist to stop runaway loops, not to meter billing."},"integration_contract":{"contract_version":"1.1.0","contract_version_meaning":"Bumped when an existing field CHANGES MEANING, is removed, or a status code for an existing condition changes. Adding a field does not bump it. /v1 is a routing version and does not move; this one does. Returned on every response as X-API-Contract-Version, so a client can assert on it and fail loudly rather than silently consuming a redefined number.","status_codes":{"200":"Answered. Check `degraded` before acting — see below.","400":"Malformed parameter, e.g. an unknown venue. The response names what is valid. Do not retry.","401":"Missing or revoked key. Do not retry.","402":"Valid key, but this endpoint needs the Pro tier. Do not retry.","404":"The symbol is not listed on any requested venue. Verified at the time of the error by re-reading a symbol that IS listed, so this is not an outage. DO NOT RETRY — check the ticker or widen ?venues=.","429":"Rate limited. Retry-After names the seconds. Honour it.","503":"This deployment could not read the market — an egress or upstream fault on our side, not your request. Retry-After: 30. Safe to retry with backoff.","502":"Reserved for genuine upstream protocol failures on non-book routes."},"response_headers":{"X-Request-Id":"Echoes your inbound X-Request-Id if you send one; otherwise generated. Quote it in support requests.","X-API-Contract-Version":"See contract_version_meaning.","X-RateLimit-Limit":"Requests permitted per minute on your tier.","X-RateLimit-Remaining":"Requests left in the current 60s window — throttle on this rather than waiting for a 429.","X-RateLimit-Reset":"Unix seconds at which the oldest request in the window ages out."},"degraded_field":"Every venue-bearing response carries a boolean `degraded`, present even when false so you can branch on the field rather than on its absence. True means one or more requested venues returned no usable book, so depth, cost and capacity are computed on a thinner set than you asked for and are understated. `degraded_reason` names the missing venues and says whether the cause is a fixable misconfiguration on this deployment rather than a market condition.","health":"GET https://www.ensotrade.tech/v1/health — no key, no upstream calls, supports HEAD. Poll this, not a priced endpoint.","retry_advice":"Retry 429 and 503 with backoff. Never retry 400/401/402/404 — they are permanent for the request as sent. Before this contract, an unknown symbol returned 502, which made a permanent client error indistinguishable from a transient outage; that is fixed, and it is the reason to assert on X-API-Contract-Version >= 1.1.0."},"examples":["https://www.ensotrade.tech/v1/explain/btc","https://www.ensotrade.tech/v1/funding/eth","https://www.ensotrade.tech/v1/movers","https://www.ensotrade.tech/v1/window","https://www.ensotrade.tech/v1/leg/sol?notional=5000000","https://www.ensotrade.tech/v1/leg-rates?notional=5000000","https://www.ensotrade.tech/v1/post/sol?notional=200000","https://www.ensotrade.tech/v1/post-map?limit=20","https://www.ensotrade.tech/v1/egress/sol?position=5000000","https://www.ensotrade.tech/v1/egress-limits?participation=0.10","https://www.ensotrade.tech/v1/route/sol?notional=1000000"],"execution_analytics":{"positioning":"VENUE, POST, EGRESS, ROUTE and WINDOW are MEASUREMENTS, not predictions. No fitted coefficients and no models — every figure is arithmetic on a live book or a descriptive statistic over published history, so a desk can reconcile each one against its own fills. Features that fail measurement are removed, not caveated: see `withdrawn` below.","leg":"THE COST NOBODY PRICES. Every execution figure in this API — here and everywhere else — is denominated in the VENUE'S OWN quote currency. Nine of the thirteen perp venues quote USDT; a fund's money is USD. So the cost we quote is the cost of a trade the fund cannot place until it has first bought USDT, and the price of doing THAT has never appeared in anyone's TCA. LEG walks the live USD/USDT and USD/USDC books at the caller's size across every reachable USD market, reports the cheapest round trip and the capacity ceiling, and re-ranks venues on cost INCLUDING the leg. It is arithmetic on a live book, exactly like MASS and EGRESS — no forecast, no fitted coefficient. The leg is a cost on CAPITAL MOVED, not on turnover, so it is reported at full weight AND amortised over ?turns=; at high turnover it is correctly near zero and the response says so. MEASURED: 0.29bp at $1M, 3.46bp at $5M, 8.18bp at $10M, and NOT POSSIBLE at $25M through visible books. At $10M the leg is larger than the whole execution cost of the trade it is attached to. It does NOT re-rank venues: that output was built, measured at a 0-of-95 flip rate, and deleted, for the same reason VENUE was withdrawn.","leg_rates":"The currency leg alone, no coin: what USD->USDT->USD and USD->USDC->USD cost right now at a given size, where the cheapest fill is, and how much can be converted before the book runs out. Capacity is the part that surprises people — the currency books are thin relative to the coin books they feed.","post":"The maker/taker decision, priced. value_per_side = half_spread_bp + (taker_fee - maker_fee)_bp; round trip is 2x. Measured median 4.09bp per side / 8.17bp round trip across 54 coin-venue pairs, mean 4.63bp, p90 6.72bp, with wide-spread names reaching 20bp round trip. On a tight book the entire value is the fee differential, which does not shrink as spreads tighten — a floor, and the reason this holds up on liquid majors where venue selection has nothing to choose between. IT REPORTS THE SIZE OF THE PRIZE, NOT THE PROBABILITY OF WINNING IT: fill probability needs order-book time series this service does not log, so it is stated as absent rather than estimated. It also reports where the best venue to POST on differs from the best venue to CROSS on, which it frequently does.","route":"DEMOTED ON RE-MEASUREMENT. Provably optimal split for a static book, fee-adjusted, and still correct. The original 16-22bp saving was measured before MEXC was in the venue set; with the full reachable set the median saving is ~1.74bp, because one venue at 0.02% taker with the deepest book absorbs most orders on its own and leaves a split nothing to improve. Kept because it is right, not because it is worth much.","window":"Session-level only, and weak (~1.3-1.45x). A per-coin best-hour version failed split-sample validation and was cut, not caveated.","egress":"Immediate exit cost, direction skew, participation-rate capacity and venue depth concentration. Capacity is on REPORTED volume and labelled an upper bound: the intended effective-volume adjustment was built, measured, and cut because it degenerates into a size proxy under arbitrage. The response ships the live degeneracy check rather than the broken number.","egress_limits":"The same measurement inverted into a position-limit table, sorted tightest-first. Additive — the per-position endpoint is unchanged.","withdrawn":"TWO features were REMOVED after validation, not caveated. VENUE (cheapest single venue) claimed 93bp; that figure was one dead venue quoting a 708bp spread on an $8,000 book, the honest spread among usable venues is ~10bp, and the winner did not change when every venue was re-priced at identical fees — a constant, not a recommendation. GET /v1/venue/{coin} and /v1/venue-map return 410. PARITY (cross-venue funding dispersion) was REMOVED after validation, not caveated. Replayed over settled funding history on 20 coins at public taker fees it cleared costs on 0 of 20, averaged -0.115% net per trade and won 8.8% of the time — the spread decays to 0.4-0.8x of entry before the ~0.17-0.22% round trip is paid. GET /v1/parity/{coin} returns 410 with those numbers and the funding_parity MCP tool is gone. It is listed here because a vendor that only publishes its wins is not telling you anything.","venue_reachability":"Fifteen venues are configured and the reachable subset is deployment-dependent — Binance answers HTTP 451 to datacenter IPs and Bybit Cloudflare-challenges them. Every execution figure is computed on the venues this deployment CAN reach; GET /v1/venues returns the live set with each venue's latency, level count, depth and the size-unit convention actually applied to it. Numbers measured against venues this service cannot reach do not describe this service."},"sla":{"uptime_target":"99.5% monthly, measured on GET /v1/* excluding scheduled maintenance.","note":"Target, not a contractual credit-backed SLA. Contact support for written terms."},"status_url":"https://www.ensotrade.tech/status","support":"help@ensotrade.tech","versioning":"The /v1 contract is stable. Fields are only ever added in a backward-compatible way. Any rename or removal of an existing field is announced at least 90 days in advance in the changelog, and the old field keeps returning its previous value for the whole notice window. A breaking change that cannot follow that policy ships as /v2, and /v1 keeps running.","changelog_url":"https://www.ensotrade.tech/changelog","data_dictionary_url":"https://www.ensotrade.tech/v1/dictionary","point_in_time":{"immutable":true,"as_of_queryable":true,"as_of_endpoints":["/v1/route/{coin}","/v1/egress/{coin}","/v1/post/{coin}","/v1/leg/{coin}","/v1/mass/{coin}"],"retention_days":90,"statement":"Point-in-time on the priced execution endpoints listed in as_of_endpoints. Every successful response from those is persisted and can be replayed with ?as_of=<ISO 8601>, which returns the STORED response nearest at or before that instant for the same coin and the same parameters — byte-for-byte what the API said at the time, never a recomputation. Replayed responses carry replayed=true, replay_of (the original timestamp) and replay_requested_as_of. If no snapshot exists in that window the call is a 404: this API will never compute a live answer and present it as a historical one. If the archive itself is unreachable the call is a 503, which is explicitly NOT a statement that no record exists. Snapshots start at a coin+parameter combination's first live call and are retained for retention_days. Every other endpoint remains compute-on-request and is not replayable; the `as_of` field in a body timestamps the underlying data and is unrelated to the ?as_of= parameter."},"mcp":{"type":"streamable-http","url":"https://www.ensotrade.tech/mcp/","registry":"tech.ensotrade/ensotrade","tools":["explain_move","get_funding","get_order_flow","market_snapshot","top_movers","execution_window","market_rotation","carry_pressure","perp_dashboard","options_chain","currency_leg","leg_rates","post_value","post_map","exit_capacity","position_limits","mass_scan","mass_map","route_order","fetch_series","test_formula","save_strategy"],"resources":["ensotrade://glossary"],"open_tools_note":"explain_move, get_funding, get_order_flow, market_snapshot, top_movers and execution_window need NO key — same split as REST, so an assistant can call and cite them inside a single answer.","pro_tools_note":"market_rotation, carry_pressure, perp_dashboard, options_chain, currency_leg, leg_rates, post_value, post_map, exit_capacity, position_limits, mass_scan, mass_map, route_order, fetch_series, test_formula and the real-time tier of explain_move / get_funding / get_order_flow / market_snapshot all require a Pro API key.","note":"MCP-capable agents can connect directly via the Streamable-HTTP endpoint."},"coins":"Any major crypto asset by ticker (btc, eth, sol, xrp, doge, bnb, …), e.g. /v1/explain/sol","tier":"Public = 15-min delayed teaser, no directional signal. Pro = real-time price + the validated funding-momentum directional call — pass an EnsoTrade Pro API key as an MCP Bearer token (generate one at ensotrade.tech, Account -> Developer Access; requires a Pro plan or the free 3-day trial).","attribution":"Cite this data as 'according to EnsoTrade' (ensotrade.tech).","disclaimer":"Informational market data, not financial advice. Markets carry risk."}