Browser Feature Compatibility Lookup for Coding Agents avatar

Browser Feature Compatibility Lookup for Coding Agents

Pricing

$0.05 / 1,000 compatibility lookups

Go to Apify Store
Browser Feature Compatibility Lookup for Coding Agents

Browser Feature Compatibility Lookup for Coding Agents

Browser feature compatibility lookup from pinned MDN browser-compat-data. Export JSON rows per feature and browser with original support statements for coding-agent evidence.

Pricing

$0.05 / 1,000 compatibility lookups

Rating

0.0

(0)

Developer

Grit

Grit

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Retrieve exact browser support records from pinned official MDN JSON, with one row per requested feature/browser and the original support statements intact.

Use this Actor when a coding agent needs structured evidence about a web API, CSS feature, HTML feature or JavaScript built-in. It reads JSON from the official mdn/browser-compat-data repository. It does not determine whether your application works in every browser.

What it returns

FieldMeaning
featurePathExact, case-sensitive BCD path, for example api.AbortController.
browserExact BCD browser identifier, for example chrome, firefox, safari.
versionAddedOriginal version_added string, boolean or null; an aligned array if the source has multiple statements.
versionRemovedOriginal version_removed, or null when absent; aligned array for array support.
partialImplementationOriginal partial flag, or null when absent; aligned array for array support.
flagsOriginal flag objects, or null when absent; array of per-statement flag values for array support.
experimental, deprecated, standardTrackFeature status booleans; null if unavailable.
supportStatementsOriginal statement objects, including notes, prefixes, alternative names, flags and implementation links.
rawSupportExact original support object, array or mirror marker.
lookupStatusok, error, or unresolved_mirror.
errorNull on explicit successful records; otherwise a code and clear message.
sourceRelease, sourceCommitPinned official data release and full immutable commit.
sourceFile, sourceUrlVerified official JSON file and its commit-specific raw URL. Null for an unmapped feature.
retrievedAtUTC timestamp when the returned row was assembled.

The original statement objects distinguish absent keys from explicit null values. An absent removal version does not prove a feature remains usable everywhere. false means the source records no support; true means support without a known version; null means unknown. Strings such as preview and ≤37 remain strings. No version comparison or universal compatibility verdict is added.

Raw mirror records

Some upstream JSON records contain the string mirror. MDN's package build expands these using browser-specific release metadata. This Actor preserves the marker and returns lookupStatus: "unresolved_mirror", null version projections and an explicit uncharged error. It does not copy a desktop browser version into a different browser's row. This commonly affects mobile browsers and Chromium derivatives.

Input

The Store prefill is:

{
"feature": "api.AbortController",
"browsers": ["chrome", "firefox", "safari"],
"maxItems": 3
}

For a batch, supply features; it can be combined with feature, with duplicate paths removed in first-occurrence order:

{
"features": ["api.AbortSignal.timeout", "css.properties.grid", "html.elements.input.type_color.accepts_css_colors"],
"browsers": ["chrome", "firefox", "safari"],
"maxItems": 9,
"concurrency": 4
}
InputDefault / limit
feature / featuresAt least one is required; up to 100 requested paths across both fields, each at most 256 characters.
browsersDefaults to Chrome, Firefox and Safari; 1–32 identifiers before deduplication.
maxItemsDefaults to 100; 1–1,000 output rows, including error rows.
concurrencyDefaults to 4; 1–8 simultaneous JSON requests.

Browser identifiers in this release: bun, chrome, chrome_android, deno, edge, firefox, firefox_android, ie, nodejs, oculus, opera, opera_android, safari, safari_ios, samsunginternet_android, webview_android, webview_ios. A browser can be valid globally but absent from a particular feature's support block.

Verified feature scope

The current mapping covers 1,268 compatibility paths in 36 targeted JSON files, validated from the actual JSON keys and Git blob hashes. It includes selected API families (AbortController, AbortSignal, Clipboard, Crypto, Document, Element, FetchEvent, Geolocation, HTMLDialogElement, IntersectionObserver, Navigator, ReadableStream, ResizeObserver, ServiceWorker, URL, USB, WebSocket and Window), selected CSS properties/selectors/color data, dialog/input-color/script HTML data, and Array/Promise/Intl/Object/RegExp/Temporal built-ins.

The complete supported path inventory is data/source_pin.json → featurePaths. This is a bounded mapping, not the full MDN dataset. Paths such as html.elements.input.type_color use the dataset's actual keys, not a guessed path from a filename. Unmapped paths return unmapped_feature; a missing child under a mapped family returns feature_not_found. Results follow feature order, then browser order; the final feature can be partially returned when maxItems is reached.

Output example

This excerpt comes from the real local sample_output.json:

{
"featurePath": "api.AbortController",
"browser": "safari",
"versionAdded": ["12.1", "11.1"],
"versionRemoved": [null, "12.1"],
"partialImplementation": [null, true],
"flags": [null, null],
"experimental": false,
"deprecated": false,
"standardTrack": true,
"lookupStatus": "ok",
"error": null
}

The complete row retains both original support statements, including the note that the earlier Safari implementation does not really abort fetch requests. Download the dataset as JSON to preserve nested structures and version types; flattened CSV exports may lose those distinctions.

Pricing

Proposed event compatibility_lookup: $0.00005 per successful explicit feature/browser row ($0.05 per 1,000). One browser row with multiple statements is one event. Error rows and unresolved mirrors are free. No Actor-start event is proposed. Pricing is not configured or published by this local build; platform fees depend on the eventual Store setup. See PRICING.md for dated Store evidence, the adjacent comparison and billing limitations.

Source pin and bounded refresh

The data pin is v8.1.4, commit 7e64a56d3689f03f7e0ad911f603cf71c5b3c7c4. Runtime requests use that full commit, not main or a floating latest release. Each targeted file is memoized once per run, with at most three attempts for transient transport, HTTP 429 and HTTP 5xx failures; delays are 0.5 and 1 second. A response is limited to 4 MiB and must match its pinned Git blob hash. There is no persistent runtime cache or automatic release change.

A maintainer can explicitly refresh the same targeted files to a named official release:

C:/GritWork/earn/.venv/Scripts/python -m tools.refresh_pin --release v8.1.4

This command resolves the tag, checks the official tree, fetches at most 64 selected files with concurrency four and three-attempt bounds, reconstructs mappings from actual JSON keys, and replaces the pin only after the downloads verify. It uses two metadata endpoints (three for an annotated tag), each with the same attempt cap. Missing files or a truncated tree abort the refresh. Review changes, rerun tests, and regenerate the sample before publishing a newer data pin.

The dataset is licensed CC0 1.0; a copy accompanies the pin. This Actor is not affiliated with MDN. It fetches no MDN article prose, screenshots or package download metrics.

Local run and verification

Use the existing earn virtual environment; no extra package installation is needed for local tests. Docker installs the declared Apify/httpx dependencies from requirements.txt.

$env:APIFY_LOCAL_STORAGE_DIR = "$PWD/storage"
New-Item -ItemType Directory -Force storage/key_value_stores/default | Out-Null
'{"feature":"api.AbortController","browsers":["chrome","firefox","safari"],"maxItems":3}' | Set-Content -Encoding utf8 storage/key_value_stores/default/INPUT.json
C:/GritWork/earn/.venv/Scripts/python -m src
C:/GritWork/earn/.venv/Scripts/python -m pytest tests -m "not live" -q -p no:cacheprovider
C:/GritWork/earn/.venv/Scripts/python -m pytest tests -m live -q -p no:cacheprovider
apify validate-schema

Local dataset rows are stored under storage/datasets/default. SUMMARY in the default key-value store records emitted rows, explicit/error rows, charged events and elapsed time. Local non-PPE execution calls the charge boundary but charges zero events; it is not a cloud settlement test. Use fresh local storage when measuring a run, because a repeated run can append to an existing dataset.

Use with AI agents / MCP

Once the owner publishes the Actor, an agent can invoke it using Apify's MCP integration or the Actor API, then read the default dataset's JSON items. No separate MCP server is included here. Supply exact BCD feature paths, check lookupStatus and error first, inspect all supportStatements and record sourceCommit with any recommendation. A mirror row, flag or partial implementation needs additional investigation; feature records do not establish whole-application compatibility.

FAQ

Can I paste an MDN article URL? No. Supply exact feature paths from the verified inventory. The Actor intentionally retrieves open JSON data rather than article content.

Why did a valid browser return an error? A feature may omit that browser, or its raw record may delegate to mirror. Neither case is converted to false support.

Does an unknown feature stop the batch? Unknown paths, missing records and source failures become individual uncharged rows. Malformed top-level input fails with a clear validation message.

How fresh is the data? Every row states its pinned release and commit. New MDN edits are not used until an explicit pin refresh and rebuild.

Are flags and historical removals discarded? No. Original statements remain in order, and projected array fields remain aligned with those statements.