Skip to content

Compatibility data API

Published

Everything the compatibility explorer renders is served as JSON from the same URLs the pages live at. No key, no rate limit, no signup — Access-Control-Allow-Origin: *, so you can call it straight from a browser.

If you are building a build-target checker, a linter, an editor plugin, a dashboard, or an answer engine that needs to say “can I use X in a PWA”, this is the entry point.

Terminal window
curl https://openpwa.net/compatibility/index.json

The index lists every feature with its category, provenance, and a data_url:

{
"name": "OpenPWA compatibility dataset",
"licence": "CC BY 4.0",
"attribution": "OpenPWA — https://openpwa.net",
"count": 38,
"features": [
{
"slug": "web-share",
"name": "Web Share API",
"category": "Capabilities",
"confidence": "high",
"verified_at": "2026-07-14",
"support_rows": 4,
"data_url": "https://openpwa.net/compatibility/web-share.json",
"page_url": "https://openpwa.net/compatibility/web-share/"
}
]
}

page_url is null when a dataset has been published but its prose entry has not, so following it never lands on a 404.

Endpoint What it returns
/compatibility/index.json Every feature: category, provenance, data_url, page_url
/compatibility/{slug}.json One feature: support rows, ecosystem-policy rows, provenance
/compatibility/by-country.json Country-weighted effective reach per feature, per region
Terminal window
curl https://openpwa.net/compatibility/web-nfc.json

Each record carries the spec and MDN URLs, a confidence grade, and the verified_at date the row was last checked — so you can decide for yourself how much to trust a given cell rather than taking a green tick on faith. confidence is never typed in by an editor: it is computed from each row’s source (high for a row generated from a browser-compat-data entry, medium for a vendor document or release note, low for anything else), and a feature’s grade is its weakest row. Every row that cites a browser-compat-data file is also cross-checked against the live BCD file on each deploy; a row that disagrees with the source it cites, or cites a path that no longer resolves, blocks the deploy.

biz_compat is the part general references do not carry: whether ad networks, payment providers, and app stores actually accept a capability in production. Sponsored rows are flagged with sponsored: true and never change an editorial support value.

Terminal window
curl https://openpwa.net/compatibility/by-country.json

reach is computed at build time from support × real browser market share, never hand-stored. Each region carries its market-share source, source_url, and as_of date, and the payload states the derivation method so you can reproduce or reject it. Treat it as approximate — it is a weighted estimate, not a measurement.

const { features } = await fetch(
'https://openpwa.net/compatibility/index.json',
).then((r) => r.json());
const webShare = await fetch(
features.find((f) => f.slug === 'web-share').data_url,
).then((r) => r.json());
console.log(webShare.support, webShare.verified_at);

The dataset is CC BY 4.0. Use it commercially, modify it, redistribute it — the one condition is attribution:

Data: <a href="https://openpwa.net">OpenPWA</a>,
<a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>

Every JSON payload carries licence, licence_url, attribution, and attribution_html, so a consumer can render the credit without hard-coding it.

Feature slugs are stable: a slug is the dataset’s identity, and the build fails if one stops matching its source file. Fields are added, not removed or repurposed. Data is rebuilt on publish, so verified_at on a row tells you when a human last checked that row — not when the file was regenerated.

Found a wrong cell? Tell us — a correction with a source is the most useful thing you can send.

← Back to the Compatibility explorer.