EveryCRT:Data API
The EveryCRT Data API is a documented way to fetch the structured data of EveryCRT programmatically — for example, to build a third-party app that mirrors, indexes, or analyzes the wiki.
It is not a custom REST service. It is a thin documentation layer over the standard MediaWiki Action API and Semantic MediaWiki endpoints, plus one wiki-maintained manifest that lists the canonical entity-type categories.
No authentication is required. All data is publicly readable.
URL layout
This wiki uses two URL paths:
- Articles live at
/wiki/PageName(e.g.https://wiki.everycrt.com/wiki/Sony_KV-20FV300). - Scripts live at the document root:
/api.php,/rest.php,/index.php,/load.php. The Action API is athttps://wiki.everycrt.com/api.php— not/w/api.phpas on Wikipedia.
Sync pattern
The recommended way to mirror the wiki is two-step:
- Fetch the manifest once to discover the entity types and how to enumerate each.
- For each entity type, fetch its list of pages (with last-modified timestamps), then call entity facts on each page you want full data for.
For ongoing incremental sync, poll recent changes since your last sync timestamp and re-fetch only the affected pages.
Manifest
The manifest is a JSON document listing every canonical entity-type category, with live page counts and ready-to-use enumeration URLs. It updates automatically as the catalog grows; new entity types added in the future will appear here without API clients needing code changes (assuming they iterate over entity_types rather than hardcoding).
Programmatic fetch (recommended):
GET https://wiki.everycrt.com/api.php?action=expandtemplates&text=%7B%7B%23invoke%3ADataAPIManifest%7Cjson%7D%7D&prop=wikitext&format=json&formatversion=2
The response wraps the manifest in expandtemplates.wikitext as a string; parse that string as JSON:
const url = 'https://wiki.everycrt.com/api.php'
+ '?action=expandtemplates'
+ '&text=%7B%7B%23invoke%3ADataAPIManifest%7Cjson%7D%7D'
+ '&prop=wikitext&format=json&formatversion=2';
const res = await fetch(url, {
headers: { 'User-Agent': 'my-app/1.0 (https://example.com/contact)' },
});
const { expandtemplates } = await res.json();
const manifest = JSON.parse(expandtemplates.wikitext);
console.log(manifest.entity_types);
The current manifest is rendered at the bottom of this page for human reading.
Listing entities
Use Semantic MediaWiki's action=ask endpoint to enumerate pages of a given entity type. The manifest's list_url for each entity type does exactly this — returning every page with its Modification date, which is what you want for indexing and for driving incremental sync:
GET https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=[[Category:CRT models]]|?Modification date|limit=500
The query supports any SMW ask syntax — additional printouts, filters, ordering, etc.
- Page through with
|offset=Nin the query. - Maximum
limitper request is 500.
Example — all Sony CRT models with screen size and release year:
GET https://wiki.everycrt.com/api.php?action=ask&format=json&query=[[Category:CRT models]][[Has brand::Sony]]|?Has screen size inches|?Has release year|limit=500
For interactive query development, use Special:Ask.
Entity facts
For a single page, the action=browsebysubject endpoint returns every SMW fact known about it — including subobjects (CRT inputs, outputs, voltage ranges, etc.):
GET https://wiki.everycrt.com/api.php?action=browsebysubject&format=json&formatversion=2&subject=Sony_KV-20FV300
This is the right endpoint for "give me everything you know about this entity" — no need to enumerate properties up front. New properties added to the wiki are automatically included in the response.
Subobjects are returned as additional subjects with names like Sony_KV-20FV300#_HASH. Treat them as child records of the parent page; together they describe the CRT inputs, outputs, voltage ranges, and so on.
For interactive browsing, use Special:Browse.
Recent changes
For incremental sync, poll action=query&list=recentchanges filtered by a timestamp. The standard MediaWiki Special:RecentChanges view is the human-readable equivalent:
GET https://wiki.everycrt.com/api.php?action=query&list=recentchanges&format=json&formatversion=2&rcprop=title|timestamp|ids|sizes|user&rclimit=500&rcend=2026-05-01T00:00:00Z
A typical sync loop:
- Save your "last sync" timestamp (UTC ISO 8601) after each successful pass.
- On the next sync, fetch recent-changes with
rcend=<previous timestamp>. - For each unique
titlein the response, re-fetch viabrowsebysubject(or remove from your index if it was a deletion — seerctype=logandrcshowoptions for handling deletes and moves). - Save the new "last sync" timestamp.
To filter to specific namespaces, add &rcnamespace=0|3000 (main + Document, for example). Namespace IDs are listed via:
GET https://wiki.everycrt.com/api.php?action=query&meta=siteinfo&siprop=namespaces&format=json&formatversion=2
RDF export
For semantic-web-style consumption, Special:ExportRDF returns RDF/OWL for individual pages or entire category subtrees:
GET https://wiki.everycrt.com/wiki/Special:ExportRDF?pages=Category:CRT%20models&recursive=1
This is more verbose than the JSON endpoints; most app developers will prefer browsebysubject.
Conventions and stability
- All endpoints return UTF-8.
- Page titles are case-sensitive after the first character (standard MediaWiki).
- Subobjects (per-input, per-output, per-voltage-range facts) appear as separate subjects in
browsebysubjectoutput, with titles ending in#_HASH. Treat them as child records of the parent page; you do not need to fetch them separately. - The set of properties on any one entity type may grow over time. Clients using
browsebysubjectautomatically pick up new properties; clients using fixedaction=askprintouts will need updates when they want to read newly added fields. - Entity-type categories listed in the manifest are stable. New entity types may be added; existing ones will not be silently renamed.
- This is a community wiki; data quality varies. Treat values as best-effort, especially for newer or less-documented models.
Etiquette
The wiki is publicly readable and no authentication is required for any of these endpoints. Please be a good citizen:
- Set a descriptive
User-Agenton your requests (e.g.my-app/1.0 (https://example.com/contact)) so the wiki operators can reach you if there's a problem. - Cache the manifest — it changes slowly (new entity types are rare).
- For full syncs, sleep briefly between requests; a few requests per second is fine.
- Use recent changes for incremental sync rather than re-walking the whole catalog every time.
If your app is doing something cool with EveryCRT data, drop a note on the community channels — we'd love to see it.
Live manifest
This is the manifest as it would be returned by the programmatic fetch above, rendered live from Module:DataAPIManifest:
{
"version": 1,
"entity_types": [
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3ACRT+models%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 2152,
"key": "crt_model",
"label": "CRT models",
"category_url": "https://wiki.everycrt.com/wiki/Category:CRT_models",
"ask_query": "[[Category:CRT models]]",
"category": "CRT models",
"description": "CRT monitors, televisions, and professional video displays."
},
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3AAV+devices%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 1069,
"key": "av_device",
"label": "AV devices",
"category_url": "https://wiki.everycrt.com/wiki/Category:AV_devices",
"ask_query": "[[Category:AV devices]]",
"category": "AV devices",
"description": "VCRs, TBCs, video mixers, switchers, and other vintage AV equipment."
},
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3AAccessories%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 49,
"key": "accessory",
"label": "Accessories",
"category_url": "https://wiki.everycrt.com/wiki/Category:Accessories",
"ask_query": "[[Category:Accessories]]",
"category": "Accessories",
"description": "Remotes, cables, antennas, and other accessories."
},
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3AParts%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 13,
"key": "part",
"label": "Parts",
"category_url": "https://wiki.everycrt.com/wiki/Category:Parts",
"ask_query": "[[Category:Parts]]",
"category": "Parts",
"description": "ICs, transistors, CRT tubes, flyback transformers, and other components."
},
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3ARepair+services%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 7,
"key": "repair_service",
"label": "Repair services",
"category_url": "https://wiki.everycrt.com/wiki/Category:Repair_services",
"ask_query": "[[Category:Repair services]]",
"category": "Repair services",
"description": "Repair shops and technicians serving the vintage AV community."
},
{
"list_url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=%5B%5BCategory%3ADocuments%5D%5D%7C%3FModification+date%7Climit%3D500%7Coffset%3D0",
"count": 350,
"key": "document",
"label": "Documents",
"category_url": "https://wiki.everycrt.com/wiki/Category:Documents",
"ask_query": "[[Category:Documents]]",
"category": "Documents",
"description": "Manuals, brochures, spec sheets, service bulletins, and other reference documents."
}
],
"wiki": {
"api_url": "https://wiki.everycrt.com/api.php",
"name": "EveryCRT",
"base_url": "https://wiki.everycrt.com"
},
"endpoints": {
"entity_facts": {
"url": "https://wiki.everycrt.com/api.php?action=browsebysubject&format=json&formatversion=2&subject=<PAGE_TITLE>",
"method": "GET",
"notes": "Returns every SMW fact (property/value pair) for a single page, including subobjects (CRT inputs, outputs, voltage ranges, etc.)."
},
"recent_changes": {
"url": "https://wiki.everycrt.com/api.php?action=query&list=recentchanges&format=json&formatversion=2&rcprop=title%7Ctimestamp%7Cids%7Csizes%7Cuser&rclimit=500",
"method": "GET",
"notes": "Returns recent edits across all namespaces. Use rcend=<ISO timestamp> to fetch only changes since your last sync. Add &rcnamespace=N|N to filter by namespace."
},
"rdf_export": {
"url": "https://wiki.everycrt.com/wiki/Special:ExportRDF?pages=<PAGE_TITLE>",
"method": "GET",
"notes": "Full RDF/OWL export. Use &recursive=1&pages=Category:CRT models to export an entire category subtree."
},
"list_entities": {
"url": "https://wiki.everycrt.com/api.php?action=ask&format=json&formatversion=2&query=<ASK_QUERY>",
"method": "GET",
"notes": "Returns titles and selected printouts for entities matching the SMW ask query. Append |limit=N|offset=M for pagination (max limit 500)."
}
},
"generated_at_utc": "2026-08-01T21:23:43Z"
}
See also
- Special:RecentChanges — human-readable change log
- Special:Ask — interactive SMW query builder
- Special:Browse — interactive per-page fact browser
- Module:DataAPIManifest — Lua source of the manifest
- EveryCRT:Maintenance — wiki health and category audits