Status

System Status

Public health of Orrery's data sources, freshness checks, data-quality notices, Kalshi preview state, and incidents.

All systems operational

Build v4.01 · e04f30d · changelog · last entry 2026-05-09 · public roadmap

Sources up

2/2

Open issues

0

Latency over budget

0

x402 endpoints

24

Prod blockers

0

Kalshi realtime

REST preview

Production readiness

READY

Production readiness passes with 3 warnings. Machine-readable gate: /api/status/readiness.

  • LLM explanationsWARN

    Optional LLM integration is off, so explain and Copilot routes use deterministic fallback heuristics.

  • Telegram deliveryWARN

    Optional Telegram channel is disabled until Telegram delivery is configured; email and signed webhooks are unaffected.

  • Discord deliveryWARN

    Optional Discord channel is disabled until Discord delivery is configured; email and signed webhooks are unaffected.

Data quality contract

PASS

Public trust checks for freshness, market-status consistency, stale fallback prevention, and share-card quality. Automated check: npm run check:trust-foundation.

Freshness contractPASS

Top live markets carry fresh timestamps inside the public SLA.

Status invariantPASS

Expired markets cannot render as LIVE; rail-pinned markets cannot render as resolved.

Data-quality noticesPASS

No active data-quality notices on the public status surface.

Crawler SSR hygienePASS

Public SSR HTML is clean: no stale queue rows or loading chrome detected.

Machine-readable statusPASS

/api/status/ops and /api/status/readiness are available for monitors.

Verification languagePASS

Product copy is constrained to observation, verification, resolution risk, and not-trade-advice language.

Verification loop handoffPASS

Brief, market detail, source-drop, alert, and share surfaces guide users from observation to verification instead of leaving raw prices as the answer.

All systems operational

Last checked Jun 9, 00:45 UTC

GREEN

Polymarket Gamma API

Probed Jun 9, 00:45 UTC

OK

25ms latency

Polymarket CLOB API

Probed Jun 9, 00:45 UTC

OK

37ms latency

Agent API · x402

24 endpoints

Paid per-call market context at /api/x402/v1/* for autonomous AI agents. Inherits the same upstream health as the surfaces above; if any source is DOWN, the x402 endpoints depending on it will degrade.

  • GET /api/x402/v1/decision/attention$0.050
  • GET /api/x402/v1/decision/market/{id}$0.150
  • GET /api/x402/v1/brief/today$0.010
  • GET /api/x402/v1/markets/movers$0.005
  • GET /api/x402/v1/venues$0.000
  • GET /api/x402/v1/markets$0.005
  • GET /api/x402/v1/divergence/top$0.050
  • GET /api/x402/v1/markets/{id}/snapshot$0.005
  • GET /api/x402/v1/markets/{id}/why$0.020
  • GET /api/x402/v1/markets/{id}/resolution-risk$0.010

Showing the first 10 endpoints here. Full machine-readable catalog: /.well-known/x402-services.json.

Free health-check at /api/x402/v1/health · Discovery → /docs/agents

x402 endpoint latency

persistent
EndpointSamplesp50p95p99TargetLast seen
/api/x402/v1/events25665ms151ms221ms500msJun 9, 00:07 UTC
/api/x402/v1/health25637ms126ms155ms150msJun 9, 00:07 UTC
/api/x402/v1/divergence/top18523ms139ms305ms1800msJun 8, 06:18 UTC
/api/x402/v1/markets18123ms148ms239ms800msJun 8, 06:17 UTC
/api/x402/v1/brief/today17722ms88ms182ms800msJun 8, 07:53 UTC
/api/x402/v1/decision/attention16721ms79ms198ms900msJun 8, 06:17 UTC
/api/x402/v1/decision/market/{id}15922ms43ms58ms1500msJun 8, 06:17 UTC
/api/x402/v1/markets/movers15321ms43ms238ms600msJun 8, 06:17 UTC
/api/x402/v1/signals15320ms56ms360ms800msJun 8, 06:18 UTC
/api/x402/v1/search15223ms56ms200ms500msJun 8, 06:17 UTC
/api/x402/v1/trades/recent15222ms41ms202ms600msJun 8, 06:17 UTC
/api/x402/v1/markets/{id}/snapshot15121ms76ms238ms600msJun 8, 06:17 UTC

Showing the first 12 endpoint samples, sorted by budget pressure and volume. p95 highlighted amber when above the published target. 256-sample ring buffer per endpoint; older samples evict.

Kalshi preview state

REST PREVIEW

Worker is refreshing public Kalshi REST orderbook snapshots into KV. WebSocket streaming still requires Kalshi API credentials.

Storage

kv

Preview status

rest_preview

Stored markets

16

Last ticker

KXLPBGAME-26JUN121400BLIPOR-BLI

Last seen

13s

Read-only Kalshi market-data preview. It does not place orders, read balances, or connect to trading accounts. JSON status: /api/venues/kalshi/realtime · last heartbeat Jun 9, 00:45 UTC.

Uptime — last 90 days

persistent
88.89%last 90 days
80ok9degraded1outage
2026-03-12today

Per-day worst-severity rollup of the persistent incident log (all components, all kinds). Operational % counts both incident-free days and days with informational notices. Hover a cell to see the date and the incidents that touched it.

Per-component upstream uptime

Same 90-day window, restricted to upstream_probe incidents and decomposed by upstream so a Gamma outage doesn't mask a CLOB-only outage in the aggregate strip above.

Polymarket Gamma
94.44%· 5 incident days
Polymarket CLOB
90.00%· 9 incident days
Polymarket Data API
100.00%
Snapshot pipeline
100.00%

Delivery freshness

persistent

Public delivery and data refresh jobs stamp their last successful run so brief, alerts, large-trade context, source probes, and Kalshi preview state cannot silently go stale.

  • freshDaily brief deliveryevery 24.0hlast run Jun 8, 12:00 UTC

    Email delivery only: the public /brief page is generated separately and can be fresh while inbox delivery is degraded.

  • freshAlerts deliveryevery 5mlast run Jun 9, 00:45 UTC

    Evaluates server-eligible rules against the current snapshot and delivers email or signed webhook notifications.

  • freshLarge-trade ingestevery 10mlast run Jun 9, 00:40 UTC

    Refreshes large-trade context from public venue data so wallet and flow pages stay current.

  • freshUpstream status probeevery 5mlast run Jun 9, 00:40 UTC

    Checks upstream source health and opens or resolves public data-quality incidents.

  • freshKalshi REST previewevery 5mlast run Jun 9, 00:45 UTC

    Refreshes public Kalshi REST snapshots while WebSocket streaming remains private beta.

Data-quality incidents

0 recorded

Separate feed from upstream HTTP probes: rows here track content-quality regressions caught by Orrery's own invariants (e.g. tape-event counters going to zero, taxonomy buckets leaking, snapshot-id drift). An upstream API can be green while our derived data is wrong — this feed surfaces that distinction publicly.

No persisted data-quality incidents recorded.

Upstream incident history

current OK

Current upstream probes are healthy. Rows below are resolved external API blips kept for audit history, not active data-quality problems. Storage: persistent.

  • RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 6, 23:35 UTC → Jun 6, 23:40 UTC
    polymarket-clob · fetch failed
  • RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 23:35 UTC → Jun 6, 23:40 UTC
    polymarket-gamma · fetch failed
  • RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 6, 07:01 UTC → Jun 6, 07:04 UTC
    polymarket-clob · fetch failed
  • RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 01:25 UTC → Jun 6, 01:32 UTC
    polymarket-gamma · The operation was aborted due to timeout
  • RESOLVEDWAS OUTAGEPolymarket Gamma API probe failedJun 6, 01:10 UTC → Jun 6, 01:20 UTC
    polymarket-gamma · The operation was aborted due to timeout [promoted to outage after 3 consecutive failed probes at 2026-06-06T01:19:13.113Z]
  • RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 01:00 UTC → Jun 6, 01:05 UTC
    polymarket-gamma · The operation was aborted due to timeout
  • RESOLVEDWAS OUTAGEPolymarket Gamma API probe failedJun 6, 00:40 UTC → Jun 6, 00:55 UTC
    polymarket-gamma · The operation was aborted due to timeout [promoted to outage after 3 consecutive failed probes at 2026-06-06T00:50:43.106Z]
  • RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 20:40 UTC → Jun 5, 20:45 UTC
    polymarket-clob · The operation was aborted due to timeout
  • RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 17:15 UTC → Jun 5, 17:20 UTC
    polymarket-clob · The operation was aborted due to timeout
  • RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 16:35 UTC → Jun 5, 16:40 UTC
    polymarket-clob · The operation was aborted due to timeout

Changelog

28 entries
  • rule changev4.01 — /scanner default view filters to live_research bucket2026-05-09

    Pipes the 200 active markets through `partitionByBucket()` and keeps only `live_research`. Excludes resolution-watch markets (UMA pending, expired but not closed, within 72h of expiry) and settled markets (closed, pinned ≤1¢/≥99¢ with real volume). A Bundesliga match that ended hours ago and is awaiting Oracle confirmation no longer pollutes the "what to research now" surface — those still live on /opportunities Resolution tab and /signals Resolution Watch view. Summary KPIs recompute over the live-research subset so the chip row matches the table.

  • releasev4.00 — chart hover crosshair + rich tooltip + density tokens align2026-05-09

    InspectorChart on /scanner /signals /opportunities now responds to cursor: vertical dashed crosshair guide spans the canvas, a 2px dot tracks the price line at the interpolated y, and a styled tooltip anchored to cursor x renders price (interpolated, in tone colour), relative-ago time, nearest volume bucket (compact $X.Yk/M), and any event labels within 2% of the timespan. Auto-flips left/right at 60% width to stay in-plot. Synthetic-fallback mode hides the tooltip entirely (no real timestamps to honestly label). The shell's existing density toggle (`data-density="dense"`) now drives the v3.98 `--space-*` tokens too, shrinking padding globally.

  • releasev3.99 — WalletInspector + WalletsExplorer split-view (/wallets joins workbench pattern)2026-05-09

    /wallets refactored from inline cards+table → ScannerSplitView. Desktop: row click selects into right-rail WalletInspectorPane via SelectionProvider context (paramKey="wallet"). Mobile keeps existing card→detail navigation. Inspector renders five 0..100 quality dimensions (Activity / Performance confidence / Specialisation / Early-entry / Copy risk) as inline progress bars with green/amber/red tone, plus an insufficient-sample warning when winRateSample<3 with open>$25k OR copyRiskScore≥60. Five inspectors now share one chrome — Trade / Market / Signal / Opportunity / Wallet.

  • releasev3.98 — premium primitives (Skeleton + AnimatedNumber + Tooltip + LiveRefresh)2026-05-09

    Sprint A (visual foundation) + Sprint B (live feel) shipped together. Skeleton primitive (CSS shimmer, no deps, prefers-reduced-motion respected). AnimatedNumber primitive (requestAnimationFrame tween 280ms easeOutCubic, optional flashOnChange green/red glow on direction). Tooltip primitive (zero-dep, viewport edge auto-flip, Esc dismiss). LiveRefresh component — auto router.refresh() every 30s, "Updated Xs ago" pulse, pause/play toggle persisted in localStorage, visibility-API aware (backgrounded tab doesn't burn refreshes). Density tokens (--space-tight / -base / -relax + --type-display / -h2 / -body / -meta / -micro). Wired into /scanner price column (animated + flashOnChange), DataConfidencePill (styled tooltip with score+tier+factor breakdown), InspectorChart current-cents chip, /scanner data-meta strip.

  • rule changev3.97 — alerts copy drift fix on Market Detail + /scanner toolbar count clarity2026-05-08

    AlertBuilder on Market Detail page hard-coded "Email, Telegram, Discord delivery are coming soon" + email channel disabled — outdated since RESEND was wired. Now `emailDeliveryLive` prop drives both copy and chip availability: when true, "Email digests are wired to a server-side cron and continue while your tabs are closed"; when false, dry-run language. /scanner toolbar count line read "100 markets" while KPI showed 200; now renders "Showing X of N markets" when slice is smaller than universe.

  • rule changev3.96 — alerts CTA reflects production state, history cap 50→2002026-05-09

    Threads serverDeliveryLive into AlertsCreate. Until any out-of-browser channel is wired, every rule is effectively local-only — server-eligible rules are stored, the cron logs them in dry-run mode, no email leaves. CTA + card title + subtitle reflect this honestly: serverDeliveryLive=false → "Create local alert" / "In-app only · email dry-run"; serverDeliveryLive=true + server-eligible condition → "Create alert". Local triggered-history cap raised 50→200; display window 20→50.

  • releasev3.95 — public proof + observation copy consistency2026-05-08

    Sprint A (public proof) + Sprint D (copy consistency). Build line directly under the /status page header — "Build vX.YZ · <short-sha> · changelog · last entry <date>" reading commit SHA from VERCEL_GIT_COMMIT_SHA. Lets an external auditor cross-reference a /status snapshot against a specific deploy. Copilot "momentum signal active" → "momentum observation active" (last surface that hadn't migrated in v3.40). Brief intro paragraph, metadata.description, JSON-LD WebPage description, FAQ Q&A, markdown export, OpenGraph image, BriefView + PersonalBriefView empty states all flipped from "research signals" → "research observations".

  • releasev3.94 — chart primitive shared across /scanner /signals /opportunities + alerts plural fix2026-05-08

    InspectorChart (mid-size probability line, real CLOB ticks, volume bars, event markers, 1D/7D/30D/ALL toggle) now lives inside the right-rail inspector on three pages, not just /scanner. The chart fetches /api/markets/[slug]/history once on selection (60s revalidate) and overlays whale trades ≥ $5k, signal firings deduped by kind+day, expiry, and current UMA state on the line. Bundle: chart moves into a shared chunk so /scanner's per-page payload drops 15.2 → 12.7 kB. Pluralization fix for the email-digest count: "0 rule s eligible" rendered with a stray space across multi-line JSX; folded into a single template-string expression.

  • releasev3.93 — InspectorChart Phase 3 (volume bars + event markers)2026-05-08

    The /api/markets/[slug]/history route now returns { points, volumeBuckets, events } in a single round-trip. Volume bars normalised against the heaviest bucket so the shape stays honest across markets that vary by orders of magnitude. Event markers — whale ◆ / signal ● / expiry ▲ / UMA ◆ — anchored to the same (firstSec → lastSec) x-axis as the price line, with `<title>` hover for label + detail. Foot strip gains a marker legend (shape-coded so the reader can map legend → chart by shape alone, no colour reading required) and a total-volume figure for the visible window.

  • releasev3.92 — Inspector chart Phase 3 part 1 (real CLOB history + range toggle + keys)2026-05-08

    Inspector chart now fetches tick-by-tick CLOB price history per (slug, interval) with a 1D/7D/30D/ALL range toggle. Per-mount cache prevents re-fetches when toggling back to a previously-viewed range. Synthetic 4-anchor curve stays as the loading-state fallback at 0.55 opacity so the panel never paints empty. /scanner keyboard nav: ArrowUp / ArrowDown alongside j / k; Escape closes the inspector + clears the URL `?market=` param.

  • releasev3.91 — Inspector polish (pluralization + info icon + empty-state)2026-05-08

    Five JSX-whitespace pluralization bugs across market-table ("100 market s"), personal-brief-view ("1 market s watched"), portfolio-view ("1 categor / ies"), watchlist-import-prompt ("Import N market / s"). All folded into single template-string expressions so the noun + plural suffix stay glued. Category trace trigger character `?` replaced with the standard lucide Info icon for consistency with canonical-status / data-confidence affordances. Inspector empty-state copy now mentions the 7-day probability chart so a first-time user knows what they'll see when they click a row.

  • releasev3.90 — Markets Inspector redesign (chart on top + tabs)2026-05-08

    Right-rail inspector restructured: Header → mid-size probability chart → KPI strip → primary insight → tabs (Overview / Resolution / Related) → sticky footer. Tabs replace the prior flat scroll-of-sections so the inspector reads as panels, not a list. Tab strip is keyboard-navigable (Arrow Left / Right cycle, Home / End jump). Chart tone is canonical-status-aware: rail-pinned + UMA-pending → amber, resolved → muted, live → green or red by 1w direction.

Showing the latest 12 entries. Full shipped history lives on the public roadmap.

How this page works

  • Each row performs a live HTTP probe against the upstream endpoint when you load this page. Latency is the round-trip time of that probe.
  • OK means the upstream returned a 2xx response. DOWN means the probe failed or returned a non-2xx status.
  • Data freshness on individual pages is surfaced under each card (e.g. “updated 23s ago · source: Polymarket Gamma”). Orrery caches upstream responses for 60 seconds.