Trials
Overview
Every registered clinical study — design, arms, eligibility, outcomes — one document per NCT id.
- status
- live
- document id
nct_ide.g.NCT02082496- citation
[NCT02082496]- updated
- 2026-10
Common calls
Find trials
POST /v1/trials/search {"query": "GLP-1 用于肥胖的三期试验", "filters": {"phase": "PHASE3", "overall_status": "RECRUITING"}}Read one trial
GET /v1/trials/read/NCT02082496List a field's values
GET /v1/trials/facets?field=phaseThe fine print
- Filter by condition_mesh (controlled terms); `conditions` is free text as entered by the registrant.
- Eligibility highlights, biomarkers, prior therapy and ECOG are model-extracted from the eligibility text — verify against the record before acting.
- 97k studies carry overall_status=UNKNOWN: the registrant stopped updating, which does not mean the trial ended.
- The index holds no full text: level=full is not available yet (the full registry record lives on NAS (ctgov/bulk) and is not in the index).
Search
POST
/v1/trials/searchHybrid retrieval, one card per hit. 2 credits. Free sample:
glp-1 obesity phase 3.Filter fields
| field | type · ops | meaning |
|---|---|---|
| phase | keyword · eq anyEARLY_PHASE1 · PHASE1 · PHASE2 · PHASE3 · PHASE4 · NA | Trial phase |
| overall_status | keyword · eq anyRECRUITING · NOT_YET_RECRUITING · ACTIVE_NOT_RECRUITING · ENROLLING_BY_INVITATION · COMPLETED · TERMINATED · WITHDRAWN · SUSPENDED · UNKNOWN | Recruitment status |
| study_type | keyword · eq anyINTERVENTIONAL · OBSERVATIONAL · EXPANDED_ACCESS | Study type |
| intervention_type | keyword · eq anyDRUG · BIOLOGICAL · DEVICE · PROCEDURE · BEHAVIORAL · DIAGNOSTIC_TEST … 11 values, /facets lists them all | Intervention type |
| condition_mesh | keyword · eq any | Condition MeSH term (controlled, more reliable than free-text conditions) |
| countries | keyword · eq any | Trial countries |
| start_year | integer · eq range | Start year, range |
| has_results | bool · eq | Results posted |
| sponsor_class | keyword · eq anyINDUSTRY · NIH · FED · OTHER_GOV · NETWORK · INDIV · OTHER | Sponsor class |
10 more, all usable
| field | type · ops | meaning |
|---|---|---|
| sex | keyword · eqALL · FEMALE · MALE | Sex eligibility |
| sponsor | keyword · eq any | Sponsor name (exact) |
| intervention_mesh | keyword · eq any | Intervention MeSH term |
| biomarker_names | keyword · eq any | Biomarkers named in eligibility (model-extracted) |
| performance_status | keyword · eq any | Performance-status requirement, e.g. ECOG 0-1 (model-extracted) |
| treatment_naive | bool · eq | Requires treatment-naive patients (model-extracted) |
| enrollment | integer · eq range | Enrolment, range |
| age_min_years | integer · eq range | Minimum age, range |
| age_max_years | integer · eq range | Maximum age, range |
| completion_year | integer · eq range | Completion year, range |
Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–1000 characters. Or an array of up to 5 (batch; hits become results[]). |
| top_k | integer= 10 | 1–100. |
| fields | brief · head= brief | head costs one more credit and returns the head view per hit. |
| filters | json | Filter DSL object (see Getting started); declared fields are listed above. |
| mode | hybrid · dense · bm25= hybrid | Retrieval mode. Leave it out to use the first. |
| offset | integer= 0 | Pagination. |
Example
{ "domain": "trials", "query": "…", "hits": [ { "id": "NCT02082496", "score": 0.83, "brief": { … } } ], "total": null, "coverage": …, "warnings": [],
"meta": { "request_id": "req_…", "credits": { "charged": 2, "balance": 1998, "pool": "allowance" }, "latency_ms": 41, "cached": false } } Undeclared filter fields return 400 rather than being ignored silently. Filters combine with AND;
_or / _not are available.Read
GET
/v1/trials/read/{nct_id}Three depths.
detail is the default. Free sample: NCT02082496.Levels
| level | credits | returns |
|---|---|---|
| brief | 1 | Card: the fields needed to triage, same as in search hits |
| detail (default) | 2 | Every structured field (rule-derived plus model-generated; model fields are listed in _enrich.fields) |
| full | 5 | Full text (not available yet: the full registry record lives on NAS (ctgov/bulk) and is not in the index) |
Parameters
| Parameter | Type | Description |
|---|---|---|
| nct_id (path) REQUIRED | string | Document id (nct_id). |
| level | brief · detail · full= detail | How deep to read. |
| format | json · md · html= json | Response shape. |
Example
{ "domain": "trials", "id": "NCT02082496", "level": "detail", "view": "head", "data": { … } | "text": "…", "token_count": 1834, "meta": { … } } The older
GET /v1/trials/doc/{id}?view=… still works.Read many
POST
/v1/trials/readUp to 50 ids, one level. Missing ids come back with
error: "not_found" and are not charged.Parameters
| Parameter | Type | Description |
|---|---|---|
| ids REQUIRED | string[] | Document ids. |
| level | brief · detail · full= detail | Level for every id. |
Example
{ "domain": "trials", "level": "detail", "docs": [ { "id": "…", "data": { … } }, { "id": "…", "error": "not_found" } ], "meta": { … } } Facets
GET
/v1/trials/facets?field={field}Legal values for a filter field, so an agent never guesses; precomputed fields carry counts, declared enums come without. Free, no key.
Parameters
| Parameter | Type | Description |
|---|---|---|
| field REQUIRED | phase · overall_status · study_type · intervention_type · sponsor_class · sex · countries · condition_mesh | Filter field with facets. |
| limit | integer= 50 | Max values. |
Example
{ "domain": "trials", "field": "…", "values": [ { "value": "…", "count": 3120 } ], "meta": { … } } Askregistered key+ /stream
POST
/v1/trials/askAgentic Q&A over this domain: the model turns the question into filters plus keywords from the domain's own self-description, reads the hits and answers with [trials: ] citations; /stream is NDJSON with real token deltas.
effort low / medium / high = 50 / 100 / 200 credits. Append /stream for NDJSON; the first event is always billing. A failure before the first answer_delta is refunded.Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–2000 characters. Be specific; ask for numbers if you want numbers. |
| effort | low · medium · high= low | Reading rounds, and the price: 50 / 100 / 200 credits. Your plan caps it. |
| verbose | bool= false | Include the tool-call trace (tool_call / tool_result / thinking events when streaming). |
| top_k | integer= 10 | Speculative prefetch size. |
| stream_answer | bool= true | Streaming only: false emits one answer event instead of deltas. |
| max_rounds | integer | 0–8, overrides the effort preset. |
| force_answer_after | number | Seconds; hard cutover into the answer phase. |
| max_answer_tokens | integer= 4096 | Hitting it sets answer_truncated. |
| language | string | Answer language; defaults to the query’s. |
Example
{ "answer": "… [NCT02082496] …", "sources": [ … ], "stats": { "rounds": 1, "elapsed_s": 6.2, "answer_truncated": false }, "coverage"?: { … }, "meta": { "credits": { "charged": 50, … } } } Citations are real — every id in
answer exists in this domain (format [NCT02082496]). sources is the retrieval set, not the citation list. answer_truncated means incomplete.