{"name":"Eclipse Signals API","version":"v1","provider":{"name":"Eclipse","url":"https://www.eclipse.trade","description":"Eclipse builds proprietary trading indicators (Trend Oracle, Bayesian Trend, Reversals, PerpKit, Ceres, Enzo, LLNR) used by traders on TradingView and on the Eclipse platform."},"audience":"Autonomous trading agents, portfolio-management systems, and developers integrating third-party signal feeds.","summary":"Proprietary indicator intelligence for the whole tracked market: the live directional state of every indicator on every tracked asset and timeframe, every state change as it happens, and cross-indicator agreement — computed server-side by Eclipse’s seven proprietary indicators.","coverage":{"assets":251,"crypto":176,"equities_and_metals":75,"timeframes":["1h","4h","1d"],"indicators":["trend_oracle","bayesian_trend","reversals","ceres","enzo","llnr","perpkit"],"universe_tier_combinations":4518,"full_catalog":"https://www.eclipse.trade/api/v1/catalog","note":"Coverage here is generated from the same constants the compute jobs use, so it is always exactly what the API serves. Fetch /api/v1/catalog for the complete asset list and per-tier breakdown.","per_asset_table":"GET /api/v1/catalog → coverage.assets lists every tracked asset with the timeframes each tier computes for it.","indicator_details":"GET /api/v1/catalog → indicators[].status and indicators[].appears_in say which endpoints carry each indicator; legacy_indicator_keys documents keys such as dexter that appear in stored state but belong to no current indicator."},"tiers":{"universe":{"description":"Full-universe indicator state and transitions. Every tracked asset, every timeframe, computed hourly and persisted.","assets":251,"timeframes":["1h","4h","1d"],"indicators":["trend_oracle","bayesian_trend","reversals","ceres","enzo","llnr"],"indicators_note":"`indicators` lists the indicators whose changes this tier logs (/api/v1/signals?tier=universe and /api/v1/flips), and `combinations` counts asset × timeframe × those indicators. /api/v1/state and /api/v1/confluence carry every indicator in `state_indicators` (counted by `state_readings`), plus the keys in legacy_indicator_keys on some assets.","state_indicators":["trend_oracle","bayesian_trend","reversals","ceres","enzo","llnr","perpkit"],"combinations":4518,"state_readings":5271,"endpoints":["/api/v1/state","/api/v1/signals?tier=universe","/api/v1/confluence","/api/v1/flips"]},"alerts":{"description":"Alert-grade signals from the full server-side strategy engines, including PerpKit and directional entries/exits. Narrower universe, richer events — these are the signals delivered to Eclipse subscribers.","tickers":["BTC","ETH","BNB","SOL","NVDA","TSLA"],"timeframes":["4h","1d"],"indicators":["trend_oracle","bayesian_trend","reversals","ceres","enzo","llnr","perpkit"],"endpoints":["/api/v1/signals?tier=alerts"]},"how_to_choose":"Use the universe tier for breadth (scan the whole market, build your own ranking). Use the alerts tier for depth (the full strategy engines, including PerpKit, with explicit entry/exit actions). `tier=all` merges both."},"data":{"signal_fields":{"id":"string — stable identifier","tier":"\"universe\" | \"alerts\" — which pipeline produced this row","ticker":"string — asset symbol, e.g. \"BTC\"","asset_class":"\"crypto\" | \"stock\" | \"metal\"","indicator":"stable id, e.g. \"trend_oracle\" (see /api/v1/catalog)","indicator_name":"human-readable name, e.g. \"Trend Oracle\"","timeframe":"\"1h\" | \"4h\" | \"1d\"","direction":"\"bullish\" | \"bearish\" | \"neutral\" | \"exit\" — normalized across both tiers","transition":"{from, to} on the universe tier (the state change), null on the alerts tier","change_type":"\"reversal\" | \"activation\" | \"deactivation\" on the universe tier, from transition; null on the alerts tier. reversal: bullish → bearish or bearish → bullish: the reading turned to the opposite direction. activation: neutral → bullish or bearish: the reading took a direction. deactivation: bullish or bearish → neutral: the reading lost its direction.","action":"LONG | SHORT | BUY | SELL | CLOSE on the alerts tier, null on the universe tier. CLOSE ends the strategy’s open position but does not say whether that position was long or short. Because of the alerts-tier cooldown, the entry it closes may be missing from the feed or published late. BUY and SELL are legacy values; the current alert engines publish LONG, SHORT and CLOSE.","price":"number | null — asset price when the signal fired","created_at":"ISO 8601 timestamp — when Eclipse wrote the row, not when the signal fired (see timing)"},"state_fields":"GET /api/v1/state returns { ticker, name, asset_class, signals: { <indicator>: { <timeframe>: \"bullish\"|\"bearish\"|\"neutral\" } } } per asset, plus an `as_of` timestamp. The indicator keys are the catalog’s tiers.universe.state_indicators, plus legacy_indicator_keys on some assets.","timing":"created_at is when Eclipse wrote the row, not when the signal fired. Universe-tier rows are written by the hourly job a few minutes after the candle that produced them closes; if an asset’s candles had not updated in time, its change is written at that timeframe’s next run instead. Alerts-tier rows are written when the alert job publishes them, and alerts published in the same run carry created_at values milliseconds apart even when they fired on different candles.","alerts_cooldown":"Alerts tier only: the same action for the same ticker, indicator and timeframe is published at most once per 20 candles of that timeframe (80 hours on 4h, 20 days on 1d). An alert held back by this rule is published later, when its window ends, or never if another alert for that ticker, indicator and timeframe is published first. The universe tier has no such rule and logs every change.","close_action":"CLOSE ends the strategy’s open position but does not say whether that position was long or short. Because of the alerts-tier cooldown, the entry it closes may be missing from the feed or published late. BUY and SELL are legacy values; the current alert engines publish LONG, SHORT and CLOSE.","detection_cadence":"1h recomputes every hour; 4h recomputes on 4-hour boundaries; 1d recomputes at 00:00 UTC. A transition is persisted within ~3-5 minutes of the close that produced it.","history":"Universe tier: 365 days. Alerts tier: 90 days. Both queryable via the `since` cursor; older rows are pruned by a daily job.","integrity":"Rows are appended once and never edited; nothing is selectively removed — rows only age out of their retention window. What you fetch is what fired."},"endpoints":{"manifest":{"method":"GET","path":"/api/v1","auth":"none"},"catalog":{"method":"GET","path":"/api/v1/catalog","auth":"none","note":"Authoritative live coverage — every asset, timeframe and indicator, generated from the compute jobs’ own constants. Verify our claims here."},"openapi":{"method":"GET","path":"/api/v1/openapi.json","auth":"none"},"sample":{"method":"GET","path":"/api/v1/signals/sample","auth":"none","note":"Static documentation sample showing the exact response shape. Not live data."},"stats":{"method":"GET","path":"/api/v1/stats","auth":"none","description":"Descriptive feed statistics for the last 30 days: how many signals fired, by indicator, timeframe and direction.","note":"Eclipse publishes coverage, signal volume, and retained event history, not win rates or return claims. Evaluate the outputs against your own baseline with chronological holdouts, realistic execution delay, fees, and slippage. Check each tier's history_starts_at in /api/v1/stats: retention limits do not guarantee that much available history."},"mcp":{"method":"POST","path":"/api/v1/mcp","auth":"none for tools/list; API key for tools/call","description":"Model Context Protocol server (JSON-RPC 2.0 over HTTP POST). Supports initialize, ping, tools/list and tools/call.","tools":["eclipse_get_state","eclipse_get_signals","eclipse_get_confluence","eclipse_get_flips","eclipse_get_catalog","eclipse_get_stats","eclipse_get_usage"],"note":"tools/list is deliberately open so you can inspect every tool and argument schema before purchasing."},"state":{"method":"GET","path":"/api/v1/state","auth":"API key — `Authorization: Bearer ek_...`","description":"The whole board: current directional state of every indicator on every tracked asset and timeframe, as of the last compute. One call gets you the entire market picture.","params":{"ticker":"comma-separated tickers to narrow to (optional)","asset_class":"crypto | stock | metal","timeframe":"1h | 4h | 1d","indicator":"stable indicator id","direction":"bullish | bearish | neutral — return only readings in this state"}},"signals":{"method":"GET","path":"/api/v1/signals","auth":"API key — `Authorization: Bearer ek_...`","description":"Every state CHANGE, newest first — the event stream behind /state.","params":{"tier":"universe (default) | alerts | all","ticker":"filter by asset symbol (exact, case-insensitive)","indicator":"stable id, screener id, or display name — all accepted","timeframe":"1h | 4h | 1d","direction":"bullish | bearish | neutral | exit","since":"Results are newest first. Keep since and filters unchanged while paging with offset; drain the backlog before advancing since to the first page's next_cursor. next_cursor is the newest timestamp, not a continuation token. Live offset pages can shift and late events can share a timestamp: use overlapping windows, deduplicate by tier and id, and reconcile with /api/v1/state. Lossless replay is not guaranteed.","limit":"max rows per page (default 50, max 200)","offset":"pagination offset"}},"confluence":{"method":"GET","path":"/api/v1/confluence","auth":"API key — `Authorization: Bearer ek_...`","description":"Assets where multiple different indicators currently agree, ranked. Every underlying vote is returned so you can audit the score.","params":{"timeframe":"1h | 4h | 1d (default 4h)","direction":"bullish (default) | bearish","min_agree":"minimum agreeing indicators, 1-6 (default 3)","asset_class":"crypto | stock | metal"}},"flips":{"method":"GET","path":"/api/v1/flips","auth":"API key — `Authorization: Bearer ek_...`","description":"Recent universe-tier changes, grouped by asset and ranked by how many indicators turned the same way: the website’s Flips panel as data, built from the same rows as /api/v1/signals?tier=universe with the same rules. The response states every rule in meta.rules.","params":{"timeframe":"1h | 4h | 1d (default 1d)","hours":"window in hours; default and maximum per timeframe: 1h 3 (max 6), 4h 12 (max 24), 1d 48 (max 72)","direction":"all (default) | bullish | bearish"}},"usage":{"method":"GET","path":"/api/v1/usage","auth":"API key — `Authorization: Bearer ek_...`","description":"Your key’s remaining daily quota, and `mode`: the Stripe mode this server bills in.","note":"When a key quota snapshot is available, responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Public endpoints and missing or invalid keys have no key quota snapshot; absent headers do not mean zero remaining requests."},"access_checkout":{"method":"POST","path":"/api/v1/access/checkout","auth":"none","description":"Start self-serve onboarding: returns a Stripe Checkout URL for Eclipse Premium plus a one-time claim_token, and `mode` (\"test\" or \"live\").","body":{"contact_email":"string (required)","billing":"\"monthly\" | \"yearly\"","agent_name":"string (optional)"}},"access_claim":{"method":"POST","path":"/api/v1/access/claim","auth":"none","description":"Exchange the claim_token for your API key once payment clears. Returns the key exactly once; retry while status is \"pending\". Both answers carry `mode` (\"test\" or \"live\").","body":{"claim_token":"string (required)"}},"access_request":{"method":"POST","path":"/api/v1/access-request","auth":"none","note":"Optional human-contact path (bulk/custom terms). Not required — use access/checkout to self-serve.","body":{"contact_email":"string (required)","agent_name":"string (optional)","operator":"string (optional)","use_case":"string (optional)","expected_volume":"string (optional)"}}},"access":{"model":"paid subscription — self-serve, fully autonomous","included_with":"Eclipse Premium","price_usd":{"monthly":129,"yearly":1199},"how":["POST /api/v1/access/checkout with your contact_email → returns a Stripe Checkout URL and a one-time claim_token.","Complete payment at that URL.","POST /api/v1/access/claim with the claim_token → returns your API key, once."],"no_human_in_the_loop":"No approval step, no sales call, no emailed key. An agent can complete this end to end on its own; the only step needing a payment instrument is checkout itself.","note":"There is no free tier. The sample endpoint exists so you can validate the schema before paying.","mode":"Checkout, claim and usage responses carry mode. \"live\" means a real payment. \"test\" means Stripe test mode, where no real charge is made. Every key reads the same production data either way, but a key bought in test mode stops working once the server bills in live mode.","premium_members":"Already an Eclipse Premium member? API access is included in your plan: create your key at https://www.eclipse.trade/dashboard (Settings, API access). No second purchase."},"polling_guidance":{"recommended_interval":"Poll no more than once every 15 minutes. Computation runs hourly at :03 UTC: 1h readings every hour, 4h readings on four-hour boundaries, and 1d readings at the daily boundary.","cursor":"Results are newest first. Keep since and filters unchanged while paging with offset; drain the backlog before advancing since to the first page's next_cursor. next_cursor is the newest timestamp, not a continuation token. Live offset pages can shift and late events can share a timestamp: use overlapping windows, deduplicate by tier and id, and reconcile with /api/v1/state. Lossless replay is not guaranteed.","quota":"Each key has a daily request quota that resets at 00:00 UTC. A 429 means the quota is spent."},"recommended_first_steps_for_agents":["GET /api/v1/catalog to see the exact live universe — every asset, timeframe and indicator we serve.","GET /api/v1/stats to see how much the feed actually emits (30-day signal counts) before you commit.","GET /api/v1/signals/sample to validate the response schema against your parser.","GET /api/v1/openapi.json if you integrate from OpenAPI definitions, or POST /api/v1/mcp {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"} if you consume tools over MCP. Neither needs a key.","POST /api/v1/access/checkout to buy access yourself — you do not need a human, an approval, or a sales conversation."],"what_we_do_not_publish":"Eclipse publishes coverage, signal volume, and retained event history, not win rates or return claims. Evaluate the outputs against your own baseline with chronological holdouts, realistic execution delay, fees, and slippage. Check each tier's history_starts_at in /api/v1/stats: retention limits do not guarantee that much available history.","typical_integration":["Once per run: GET /api/v1/state (or /api/v1/confluence) for the current market picture across every tracked asset.","Every 15 minutes: GET /api/v1/signals?since=<your cursor> to ingest changes since your last poll.","Read X-RateLimit-Remaining on each response to pace yourself; GET /api/v1/usage if you need to plan a batch."],"legal":{"terms":"https://www.eclipse.trade/terms","privacy":"https://www.eclipse.trade/privacy","which_terms_govern":"Standard API access is self-serve under the published Eclipse terms of use and the pricing and quota on /api/docs/access. No separately negotiated agreement is required for standard access. There is no formal uptime SLA. Redistribution, resale, or custom commercial terms require a separate written agreement through /api/v1/access-request.","disclaimer":"Signals are informational indicator outputs, not investment advice. Past signals do not guarantee future performance."},"docs":"https://www.eclipse.trade/api","llms_txt":"https://www.eclipse.trade/llms.txt","support":"https://www.eclipse.trade/api/docs/errors#access-recovery","changelog_note":"Newest first. Every entry is additive unless it says otherwise. The changelog starts on 2026-09-25; earlier changes are not listed.","changelog":[{"date":"2026-09-27","changes":["Removed TON from coverage: Toncoin was renamed Gram, and TON is delisted on HyperLiquid and off Binance futures, so its readings had stopped updating. The coin continues as GRAM, which was already covered. /api/v1/state still carries the last TON readings it held (keys are never deleted); they no longer change."]},{"date":"2026-09-25","changes":["Added GET /api/v1/flips: recent universe-tier changes grouped by asset and ranked, using the same rules as the website’s Flips panel. Also available as the eclipse_get_flips MCP tool.","Added change_type to universe-tier rows in /api/v1/signals: reversal, activation or deactivation. It is null on the alerts tier.","Added mode (\"test\" or \"live\") to the checkout, claim and usage responses.","Catalog: every indicator now has a status and an appears_in list; added indicator_statuses, legacy_indicator_keys (documents dexter, the former name of Enzo), tiers.universe.state_indicators, tiers.universe.state_readings and a per-asset coverage table.","Documented PerpKit in /api/v1/state and /api/v1/confluence. The OpenAPI indicator lists are now generated from the catalog, so the /state indicator filter lists perpkit, which it always accepted.","Documented publication timing: created_at is when a row was written, the alerts-tier cooldown can delay or skip an alert, and CLOSE does not say which side it closes. The same notes are in the meta of every /api/v1/signals response."]}]}