All endpoints require auth (JWT, API key, or dev headers).

Recall spans

POST /v1/recall
question
string
required
keywords
string[]
default:"[]"
domain
string | null
default:"null"
label
string
default:"\"Claim\""
budget_tokens
integer | null
default:"null"
Defaults to 8000.
section_types
string[] | null
default:"null"
scope_signals
string[] | null
default:"null"
e.g. open_questions, mechanisms, reliability, what_to_build.
spans
object[]
Each span: node_id (int), text (str), score (float), tokens (int), provenance (object).
total_tokens
integer
curl -X POST https://host/v1/recall -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d '{"question":"gliotransmission calcium","budget_tokens":8000}'

Papers

Recall papers

GET /v1/papers/recall?q={query}list[Paper], where a paper is doi, title, year, oa, cached, score.

Check existence

GET /v1/papers/{doi}/exists{ "exists": bool }.

Ingest a paper

POST /v1/papers
doi
string | null
Resolved from title/url if absent.
title
string
default:"\"\""
text
string
default:"\"\""
authors
string[]
default:"[]"
year
integer | null
oa
boolean
default:"false"
Open access.
source_url
string | null
Returns the Paper (doi, title, year, oa, cached).

Batch ingest

POST /v1/papers/batch
papers
object[]
required
Each item is a paper spec; fanned out to a worker pool.
Returns an ingest report (includes an ingested count).

Cache-first fetch

POST /v1/papers/{doi}/fetch{ "doi", "warm", "bytes", "bytes_saved", "source" } where source is "memory" or "origin". 404 if the paper isn’t in memory.

Analyses

Store an analysis

POST /v1/analysis
doi
string
required
markdown
string
required
doi
string
core_claim
string
acceptance
string
scorecard
string
sharpest_flaw
string
claims_extracted
integer

Get an analysis

GET /v1/analysis/{doi} → the analysis fields above. 404 if not found.