Atomic Research

API documentation

A read-only JSON API. Every endpoint lives under https://api.atomicresearch.markets/v1.

Authentication

Send your key as a bearer token on every request. Keys are issued by email when you subscribe.

curl -H "Authorization: Bearer ark_your_key_here" \
  https://api.atomicresearch.markets/v1/symbols/AAPL

We store only a hash of your key, so we cannot recover it if you lose it. Write to help@atomicresearch.markets and we will issue a replacement.

Endpoints

EndpointReturns
GET /v1/symbols/{symbol} Every signal your plan covers for one company
GET /v1/symbols/{symbol}/{signal_id} A single signal for one company
GET /v1/catalog All 56 signal definitions. No key required
GET /v1/plans Plan coverage and limits. No key required
GET /v1/bulk/latest A time-limited link to the full daily snapshot. Full plan only
GET /v1/health Service status. No key required

The response

A request for one company returns its observations for the most recent snapshot.

{
  "symbol": "AAPL",
  "snapshot_date": "2026-08-18",
  "plan": "broad",
  "atom_count": 56,
  "atoms": [
    {
      "signal_id":          "cash-flow.fcf-trend-and-stability",
      "family":             "Cash Flow Evaluation",
      "state":              "neutral",
      "value":              0,
      "definition_version": 1,
      "maturity":           "deterministic",
      "method":             "cagr=-3.95%;years=3;latest-vs-avg=0.9438",
      "evidence_date":      "2025-09-30",
      "period":             "FY2025",
      "observed_at":        "2026-08-14T15:58:00.985Z"
    }
  ]
}

Field reference

state

The answer to the question. The three absence states are distinct on purpose, because "we could not tell" is different information from "the answer is no".

positiveEvidence supports the question, value is 1
neutralEvidence is mixed or unremarkable, value is 0
negativeEvidence runs against the question, value is -1
missingThe inputs were not available
inapplicableThe question does not apply to this company
failedThe computation was attempted and did not complete
not-yet-availableThe evidence is expected but has not been published yet

maturity

How the answer was produced. Use this to decide how much weight to give it; you can filter on it entirely if you only want arithmetic.

deterministicComputed from filings. Reproducible from the stated inputs
structured-extractionRead from a document into a fixed schema
naive-web-searchJudged from public sources by a language model
incompletePartially wired. Treat with caution

Signals above deterministic involve a language model and can be wrong. The method field always states the reasoning, so you can check it rather than take it on trust.

Other fields

evidence_dateThe date the underlying evidence describes
periodThe fiscal period, such as FY2025
observed_atWhen we produced the observation
definition_versionIncrements if a signal's meaning ever changes

Errors

Errors return a JSON body with a stable code.

401Key missing, unrecognised, or revoked
403Your plan does not cover that company, signal, or bulk access
404No such company, or no such signal
429Above your plan's request rate
{
  "error": {
    "code": "symbol_not_in_plan",
    "message": "Your Core plan does not cover TSLA.",
    "hint": "See /v1/plans for coverage of each plan."
  }
}

Bulk download

On the Full plan, /v1/bulk/latest returns a signed link to the day's complete snapshot as newline-delimited JSON, one company per line. The link expires after fifteen minutes; request another whenever you need one.

Refresh cadence

A new snapshot is written every morning. Individual signals refresh on their own schedules, because a cash-flow figure only changes when a filing arrives, while other evidence moves more often. Each observation carries its own observed_at and evidence_date, so you always know how fresh it is rather than having to assume.