FUND / ENTERPRISE · PILOT, BY REQUEST

API Documentation

Programmatic access to ORION's company analysis, watchlist state, and detected-event alerts — the same real, sourced data the dashboard shows, callable from your own systems. Fund and Enterprise are not self-serve plans today: API access is provisioned only where explicitly arranged for a pilot account. Request access.

ORION does not compute investment scores, rankings, buy/sell recommendations, price targets, or expected-return forecasts. Every response distinguishes deterministic, source-verified fields from the AI-generated narrative summary — see the example below.

Getting a key

API access is not self-serve. Once your Fund or Enterprise pilot account has API access explicitly provisioned (see Request access), sign in, open API in the top navigation, and click Generate new key. The raw key is shown exactly once at creation — copy it immediately. ORION only ever stores a one-way hash of your key, so if you lose it, revoke it and generate a new one.

Already provisioned? Generate your key.
Not provisioned yet? Request access first — API access is not available at signup.

Authentication

Every request must include your API key in the x-api-key header. There is no separate OAuth flow for the REST API today — session-based sign-in (used by the web app) and API-key auth (used here) are independent, so an API key works even if you're not otherwise signed in from that client.

curl https://orion-backend-xzsm.onrender.com/api/v1/analysis?company=Moderna&ticker=MRNA \
  -H "x-api-key: orion_live_your_key_here"

A missing, unknown, or revoked key always returns 401 — never a downgraded or partial response.

Rate limits

EndpointLimit
GET /api/v1/analysis60 requests / hour / account
GET /api/v1/watchlist60 requests / hour / account (shared with the general API rate limit)
GET /api/v1/alerts30 requests / hour / account

Limits are per account, independent of how many keys you've issued. A 429 response means you're over the limit for that window.

Endpoints

GET/api/v1/analysis

Runs ORION's full company analysis pipeline — live ClinicalTrials.gov pipeline data, market data, SEC EDGAR cash-runway/dilution checks, and an AI-generated, cited research report — and returns the same JSON shape the web app's report view uses.

ParamRequiredDescription
companyYesCompany name, e.g. Moderna
tickerNoStock ticker, e.g. MRNA — enables market-data fields (price, cash runway, dilution)
conditionNoIndication/condition filter for the clinical trial search

verification_result is deterministic and server-computed — the same ruleset that drives the dashboard's evidence badges, never inferred by the model. analysis is the AI-generated narrative summary and is labeled as such; it is not a score or a recommendation. ORION does not return an investment score, a buy/sell recommendation, a price target, or an expected-return figure on this or any endpoint.

{
  "company": "Moderna", "ticker": "MRNA", "trials_count": 42,
  "trials": [...], "stock_info": {...},
  "entity_passport": {
    "canonical_company": "Moderna, Inc.", "canonical_entity_id": "org:moderna",
    "verification_status": "VERIFIED"
  },
  "verification_result": {
    "overall_status": "PARTIALLY_VERIFIED",
    "required_facts_total": 7, "required_facts_resolved": 6,
    "sources_required": 3, "sources_reached": 3,
    "entity_confidence": "HIGH",
    "missing_evidence": [], "source_failures": [],
    "ruleset_version": "report-verification-v1.1.0"
  },
  "analysis": "AI-generated narrative summary, cited to the sources below — not a score or recommendation.",
  "generated_at": "2026-...",
  "sources": { "clinical": "ClinicalTrials.gov v2 API", "market": "...", "analysis": "..." }
}

entity_confidence (inside verification_result) describes how strongly the requested company/ticker matched a verified source-backed identity — it is not an investment-confidence or attractiveness signal.

GET/api/v1/watchlist

Returns the API-key owner's authenticated, server-saved Watchlist. The caller does not supply an arbitrary ticker list: ownership is resolved from the verified API key and only active saved items for that account are returned. This endpoint is distinct from Watchtower event detection, which computes monitor state and source changes for that saved Watchlist.

Query parameters: none. Scope comes exclusively from the API-key owner's active server watchlist.

{
  "holdings": [
    { "ticker": "MRNA", "company": "Moderna",
      "last_checked_at": "2026-07-10T08:12:00Z",
      "last_success_at": "2026-07-10T08:12:00Z", "last_error": null }
  ]
}

Fields reflect stored watchlist rows. Missing monitor timestamps remain null; the API does not infer a successful check.

GET/api/v1/alerts

Returns real, stored Watchtower changes for the API-key owner's server-saved Watchlist — such as a trial status or enrollment differing from the prior immutable observation. A saved ticker with no detected change returns no event, never a fabricated one.

Query parameters: none. The response also includes watchlist, monitor_health, generated_at, and mode: "server_watchlist".

{
  "events": [
    { "event_id": "snap-...", "company": "Moderna", "ticker": "MRNA",
      "event_type": "trial_status_change", "alert_level": "high",
      "previous_state": "overall status: RECRUITING",
      "new_state": "overall status: COMPLETED",
      "source_urls": ["https://clinicaltrials.gov/study/NCT..."],
      "verification_status": "confirmed", "detected_at": "2026-07-10T08:12:00Z" }
  ]
}

Revoking a key

From the API panel in the dashboard, click Revoke next to any key. Revocation is immediate — any request using that key returns 401 from that point on. There's no way to view a key's raw value again after creation; generate a new one if needed.