The same query, as an endpoint.
Every screen consumes public endpoints. The page, the API and the export parse the same parameters with the same function, so no surface can answer a different question from another.
Read-only, JSON, CORS-enabled, no key. Every endpoint is backed by the same functions the pages call. searchWorks() serves both /works and /api/v1/works, so the API cannot answer a different question from the page above it.
Base URL: https://metacan.xera.ac/api/v1
{
"meta": {
"total": 6784,
"direct_labels_cover": 23,
"predictions_cover": 6784,
"query_hash": "23b0df378a31",
"filters": { "route_fund": true,
"route_aff": false,
"lang": "fr" }
},
"results": [ … ]
}Notes
- CORS is open (
*). This is a public CC-BY research dataset; the point of publishing it is that you can query it from your own page without proxying. - Caching. Responses carry
s-maxage=3600. The frame is a pinned snapshot: it does not change between deploys, so a stale aggregate is not a risk and re-scanning 4.3M rows per request would be. - No key, no rate limit. It is one small server. Be reasonable, and if you need the whole frame, take the repository and rebuild it locally rather than paginating four million rows out of this box.
- License. Data CC-BY-4.0, code MIT. Cite OpenAlex and Retraction Watch as the upstream sources.
/api/v1/cohortThe cohort builder's own query. Same parser, same function as the front page, so the API cannot answer a different question from the page above it. Takes every /api/v1/works parameter, plus the facets below.
meta.total is the real N (a cohort is cited by its N), and meta.direct_labels_cover reports direct label coverage, while meta.predictions_cover reports prediction coverage. An empty labels array means unlabeled, never “not in the category”.| Parameter | Type | Meaning |
|---|---|---|
topic | string | Exact OpenAlex primary topic. Values come from the typeahead: /api/v1/facets/topic?q=… |
venue | string | Exact venue string. Values come from /api/v1/facets/venue?q=… |
route_aff, route_fund, route_venue, route_about | 1 | 0 | Tri-state route facets: 1 requires the route, 0 excludes it, absent means any. They compose (route_fund=1&route_aff=0 is the funder-only stratum), which the single `route` parameter cannot express. |
retracted | 1 | 0 | 1 = retracted only; 0 = exclude retracted; absent = any. |
abstract | has | none | has = only works with an abstract; none = only works without. |
category | metaresearch | metaepi_narrow | metaepi_broad | bibliometrics | sts | scholarly_communication | open_science | research_integrity | Category facet. Its evidence source is selected by label_source. Direct labels and predictions are both unvalidated. |
design | randomized_trial | nonrandomized_trial | observational | systematic_review | meta_analysis | case_report | qualitative | simulation_or_modeling | bench_or_experimental | theoretical_or_conceptual | not_applicable | design_other | Study design facet. Its evidence source is selected by label_source. No study design is MEDLINE validated yet. |
label_source | direct | predicted | direct uses sparse direct model outputs. predicted uses full frame teacher distillation outputs. Neither is human validated. |
prediction_mode | candidate | consensus | candidate uses the union of the thresholded Codex and Gemma heads. consensus uses their intersection. |
agreement | any | all | For direct labels only. any means one model suffices; all means every model that labeled the work agrees on the filtered value. |
labeled | 1 | 0 | For direct labels only. 1 requires a direct label row; 0 requires no direct label row. |
# Directly labeled metaresearch works, with exact coverage:
curl -sS "https://metacan.xera.ac/api/v1/cohort?label_source=direct&category=metaresearch" \
| jq '{total: .meta.total, direct: .meta.direct_labels_cover}'
# Consensus frame predictions for metaresearch:
curl -sS "https://metacan.xera.ac/api/v1/cohort?label_source=predicted&prediction_mode=consensus&category=metaresearch" \
| jq '{total: .meta.total, predicted: .meta.predictions_cover, first: .results[0].prediction}'/api/v1/cohort/exportThe whole cohort as a file, streamed from the database: every work column, direct labels, full prediction data, provisional legacy scores, and per-row status fields.
meta.truncated (JSON), in a trailing comment line (CSV), and in the X-Export-Truncated header. Past the cap, narrow the cohort or rebuild the frame from the repository.| Parameter | Type | Meaning |
|---|---|---|
format | csv | json | csv (default) or json. Everything else is the same filter vocabulary as /api/v1/cohort. |
# A labeled cohort as CSV:
curl -sSL "https://metacan.xera.ac/api/v1/cohort/export?category=metaresearch&format=csv" -o cohort.csv
# As JSON, metadata first:
curl -sS "https://metacan.xera.ac/api/v1/cohort/export?design=systematic_review&year_from=2020&format=json" | jq '.meta'/api/v1/permalinkMint the citable /q/<hash> permalink for a filter state. Idempotent: the hash is a function of the canonical filters, so the same cohort always gets the same URL, whoever asks and whenever.
curl -sS -X POST "https://metacan.xera.ac/api/v1/permalink?label_source=predicted&prediction_mode=consensus&category=metaresearch" \
| jq '{url, total, direct_labels_cover, predictions_cover}'/api/v1/facets/{venue,topic}Search-as-you-type over the ~85,000 distinct venues and ~4,500 distinct topics, with frame-wide counts. Two characters minimum.
curl -sS "https://metacan.xera.ac/api/v1/facets/venue?q=canadian+journal" | jq '.results[:3]'
curl -sS "https://metacan.xera.ac/api/v1/facets/topic?q=peer+review" | jq '.results[:3]'/api/v1/facets/authorSearch-as-you-type over researchers with a Canadian-affiliated authorship, ranked by Canadian output. Returns the disambiguated OpenAlex A-id next to each name; the id is what ?author_id= and the network endpoint consume. Two characters minimum.
curl -sS "https://metacan.xera.ac/api/v1/facets/author?q=tricco" | jq '.results[:3]'/api/v1/networkThe Canada-only collaboration network. Without parameters: the overview graph of the strongest ties. With author_id: that researcher’s neighborhood. The meta block states the construction rules (nodes, edges, fractional weights, the density guard) on every response, because a graph whose rules are not in the response is not citable.
| Parameter | Type | Meaning |
|---|---|---|
author_id | string | OpenAlex author id (A...). Omit for the overview graph. |
curl -sS "https://metacan.xera.ac/api/v1/network?author_id=A5044517411" | jq '.meta, .graph.nodes[:3]'/api/v1/stats/labelsThe label landscape: coverage, categories, study designs, years and languages over the machine-labeled subset. The same function the Landscape page renders, so the two cannot drift.
curl -sS https://metacan.xera.ac/api/v1/stats/labels | jq '{coverage, top: .by_category[:3]}'/api/v1/stats/summaryThe frame in one object: total works, the no-affiliation and no-abstract counts, the four route marginals, and the screen's consensus histogram.
curl -sS https://metacan.xera.ac/api/v1/stats/summary | jq/api/v1/worksBrowse and search the whole frame. Full-text over titles, every filter the browse page offers, paginated.
total_is_capped: true means “at least 10,000”, not “exactly 10,000”. Page through if you need more.| Parameter | Type | Meaning |
|---|---|---|
q | string | Full-text search over titles (Postgres tsvector; terms are ANDed). |
author | string | Author-name search over the author layer (same websearch semantics as q). A name is a broad net: it can match many OpenAlex author identities; author_id is the precise form. |
author_id | string | Exact OpenAlex author id (A...), the disambiguated identity. The citable author filter. |
year_from, year_to | int | Inclusive publication-year bounds. |
cited_min | int | Minimum citation count (cited_by >= N). |
lang | string | Language code, e.g. en, fr. |
type | string | Work type, e.g. article, preprint, dissertation. |
field | string | OpenAlex primary field, e.g. 'Medicine'. |
route | aff | fund | venue | about | no_aff | Route provenance: why the work is in the frame. no_aff returns the works with NO Canadian affiliation, which an affiliation-only frame never sees. |
retracted | 1 | Only works OpenAlex flags as retracted. |
no_abstract | 1 | Only works with no abstract. The screen finds half as much metaresearch here. |
n_in | 0..3 | Screening consensus: how many of the three models called it metaresearch. |
sort | cited | year_desc | year_asc | Default: cited. |
page, per_page | int | per_page max 100, default 25. |
# The works an affiliation-only frame would never have seen,
# most-cited first:
curl -sS "https://metacan.xera.ac/api/v1/works?route=no_aff&sort=cited&per_page=5" | jq '.results[] | {id, title, cited_by, routes}'
# French-language works with no abstract, published since 2015:
curl -sS "https://metacan.xera.ac/api/v1/works?lang=fr&no_abstract=1&year_from=2015&per_page=5" | jq
# Full-text search:
curl -sS "https://metacan.xera.ac/api/v1/works?q=reproducibility+crisis&per_page=3" | jq '.results[].title'/api/v1/works/{id}One work with every frame field, route provenance, Retraction Watch state, direct model labels, and the full frame prediction with teacher scores and uncertainty fields.
| Parameter | Type | Meaning |
|---|---|---|
abstract | 1 | Fetch the abstract live from OpenAlex and de-invert it. Off by default: abstracts are not in this database, so asking for one costs an upstream round-trip. |
# A work, with its provenance:
curl -sS https://metacan.xera.ac/api/v1/works/W2342586781 | jq '{id, title, routes}'
# With the abstract fetched live from OpenAlex:
curl -sS "https://metacan.xera.ac/api/v1/works/W2342586781?abstract=1" | jq '.abstract'/api/v1/screenedThe 5,600 screened works with all three models' tiers, genres, confidences and reasons, plus the design weight.
weight (inverse selection probability). Any rate you compute from these rows without applying the weight is wrong.| Parameter | Type | Meaning |
|---|---|---|
contested_only | 1 | THE DISAGREEMENT DOSSIER: every work any model called metaresearch. This subset, not the base rate, is the project’s deliverable. |
n_in | 0..3 | Exact consensus count. |
stratum | string | e.g. aff_core, about_only, french, venue_new, fund_new. |
page, per_page | int | per_page max 100. |
# The disagreement dossier: the works that mark the field's boundary.
curl -sS "https://metacan.xera.ac/api/v1/screened?contested_only=1" | jq '.meta.summary'
# The works only ONE model called metaresearch:
curl -sS "https://metacan.xera.ac/api/v1/screened?n_in=1" \
| jq '.results[] | {title, opus: .opus.tier, gpt: .gpt.tier, grok: .grok.tier}'/api/v1/stats/by-routeThe four routes: marginals, and the exact route combinations.
marginals sums to more than the frame. combinations counts each work once and sums to the total.curl -sS https://metacan.xera.ac/api/v1/stats/by-route | jq '{no_aff: .meta.no_aff, marginals, combinations: .combinations[:5]}'/api/v1/stats/by-yearWorks per year, with the no-affiliation and no-abstract counts alongside, because both gaps move over time.
curl -sS https://metacan.xera.ac/api/v1/stats/by-year | jq '.results[-5:]'/api/v1/stats/by-fieldThe field breakdown, plus languages, the abstract gap by type, top venues, top funders, and the four-state retraction record. This is everything the analytics page draws in one call.
curl -sS https://metacan.xera.ac/api/v1/stats/by-field | jq '.retraction_states'/api/v1/findingsAll 32 findings, served verbatim from the file the pilot scripts write. Every pilot number quoted on this site comes from here.
curl -sS https://metacan.xera.ac/api/v1/findings | jq '.findings.three_model_screen.headline'/api/v1/predictionsThe full frame prediction summary and the model evaluation report, served directly from the generated pilot artifacts. They include source and model hashes, model version, category counts, policies, cross-validation results, and limitations. Every score measures fidelity to machine teachers, not human accuracy, and every prediction is machine predicted and unvalidated.
curl -sS https://metacan.xera.ac/api/v1/predictions | jq '{status: .predictions.prediction_status, n: .predictions.n_predictions, evidence: .meta.evidence_level, limitations: .predictions.limitations}'