API
All data comes from our own checks and is available as static JSON files. No authentication, open CORS. Generated: 2026-10-18T18:03:01Z
| URL | Content |
|---|---|
https://shopsforbots.com/api/index.json | Compact index of all shops (short keys: d=domain, n=name, s=score, p=protocols, k=capabilities, c=category) |
https://shopsforbots.com/api/chunks/NNN.json | Detail records for shops without a static page, 256 files; file = fnv1a-32(domain) mod 256 (see example) |
https://shopsforbots.com/api/shops/<domain>.json | One shop with all fields (shops that have their own page here), e.g. /api/shops/allbirds.com.json |
https://shopsforbots.com/api/stats.json | Counts per status, category, country, platform, protocol; score distribution |
https://shopsforbots.com/api/changelog.json | Changelog (added, delisted, score changes) |
https://shopsforbots.com/api/search | Live search (q, category, country, platform, min_score, status, protocol, limit, offset), docs on /bot/ |
https://shopsforbots.com/api/shop/<domain> | Full record of one shop |
https://shopsforbots.com/api/openapi.json | OpenAPI 3.1 |
https://shopsforbots.com/mcp | MCP server (Streamable HTTP), tools: search_shops, get_shop, list_categories, get_stats |
https://shopsforbots.com/llms.txt | Description of this directory for agents |
https://shopsforbots.com/.well-known/shopsforbots.json | Machine-readable description and endpoint list |
Examples
# Best-scoring shops from the compact index
curl -s https://shopsforbots.com/api/index.json | jq '[.shops[]] | sort_by(-.s) | .[:20] | .[] | {d, n, s}'
# Shops with UCP and MCP signals, best score first (live search API)
curl -s 'https://shopsforbots.com/api/search?protocol=ucp,mcp&limit=20'
# One shop (works for every listed domain)
curl -s https://shopsforbots.com/api/shop/allbirds.com | jq '{score: .agent_readiness, caps: .capabilities}'Fields (excerpt)
| Field | Type | Meaning |
|---|---|---|
domain | string | Domain without www. |
status | verified | partial | unreachable | see methodology |
agent_readiness | 0–85 | heuristic score, breakdown in score_breakdown |
score_confidence | 0–1 | check coverage |
protocols | ["ucp","webmcp","mcp"] | protocols confirmed by our checks (webmcp = hint in homepage HTML, not tested) |
capabilities | ["search","cart","checkout","order",…] | from the UCP manifest |
ucp | object | null | valid, version, capabilities, mcp_endpoints, payment_handlers, manifest_url |
robots_ai | object | null | stance per AI bot |
country, eu | ISO-2 | null, bool | null | company country only with evidence (country_source) |
checks | object | state and timestamp per check |
last_checked | ISO 8601 | UTC |
Unknown values are null. The schema is versioned (schema_version) and may change.
MCP endpoints (ucp.mcp_endpoints) are taken from the manifest and not tested by a call.
Finding a chunk file
# JavaScript: file number for a domain
function fnv(s){let h=2166136261;for(const b of new TextEncoder().encode(s)){h^=b;h=Math.imul(h,16777619)>>>0}return h>>>0}
const n = String(fnv('example.com') % 256).padStart(3,'0'); // -> /api/chunks/<n>.json, object keyed by domainUsage and license
Please cache the files and fetch them at most once an hour. All data is collected by us (our own requests to each domain, see methodology) and may be used under fair use for private purposes. For commercial use, please get in touch: [email protected]. This covers the data and scores we generate. Shop names and trademarks remain with their owners.