Datasets API endpoint
Searches the AI-readiness census of the top 1M sites (dataset id enum value `llms`) — one record per site describing whether it serves a real `/llms.txt` or `/llms-full.txt` (who produced it, what it links to and mentions) and what its `/robots.txt` says to 17 AI crawlers, next to a homepage control request. Search results omit the file bodies; read one site with the item endpoint. `blocked` and `error` states mean unknown, never absent. Sort enum: `relevance`, `rank_asc`, `links_desc`, `bytes_desc`, `domain_asc`, `crawled_desc`. state and robots_state enum: `present`, `absent`, `blocked`, `error`, `skipped`. source_kind enum: `shopify_agent_template`, `seo_plugin`, `platform_default`, `parked`, `custom`. generator enum: `yoast`, `aioseo`, `rankmath`, `wix`, `shopify`, `parked`. robots_default enum: `allowed`, `partial`, `blocked`. content_signal_train enum: `yes`, `no`. Crawler enum for blocks_all, blocks_any and not_blocked: `GPTBot`, `OAI-SearchBot`, `ChatGPT-User`, `ClaudeBot`, `Claude-SearchBot`, `Claude-User`, `anthropic-ai`, `Google-Extended`, `PerplexityBot`, `Perplexity-User`, `CCBot`, `Bytespider`, `Applebot-Extended`, `Amazonbot`, `meta-externalagent`, `cohere-ai`, `Diffbot`. Site owners can ask for removal at privacy@crawlora.net. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/llms/searchSearches the AI-readiness census of the top 1M sites: one record per site describing
whether it serves a real /llms.txt or /llms-full.txt (who produced it, what it links
to and mentions) and what its /robots.txt says to 17 AI crawlers, next to a homepage
control request from the same session. Search results omit the file bodies; read one
site with the item endpoint. Site owners can ask for their domain to be removed at privacy@crawlora.net; a removed domain is deleted from the dataset and not scanned again.
Dataset id enum:
llmsQuery parameters:
q: optional substring match on the site domain, max 256 characters.text: optional full-text match on the /llms.txt title and summary, max 256 characters.state: optional /llms.txt state. Allowed values: present, absent, blocked, error, skipped. blocked and error mean unknown, not absent; skipped means the site's homepage control did not answer, so the file was not requested.valid: optional filter; true keeps only sites serving a valid /llms.txt (state present), false keeps the rest.source_kind: optional producer of a valid /llms.txt. Allowed values: shopify_agent_template, seo_plugin, platform_default, parked, custom.generator: optional generator detected in a valid /llms.txt. Allowed values: yoast, aioseo, rankmath, wix, shopify, parked.bot: optional AI crawler named inside a valid /llms.txt, e.g. GPTBot. Use facet=bot for the values.min_links: optional minimum number of links in a valid /llms.txt, 0 or greater.mentions_mcp: optional filter; true keeps only valid files that mention the Model Context Protocol.mentions_openapi: optional filter; true keeps only valid files that mention OpenAPI or Swagger.placeholder: optional filter; true keeps only valid files that still hold template placeholder text.injection: optional filter; true keeps only valid files containing instruction-override text aimed at AI readers.full_valid: optional filter; true keeps only sites serving a valid /llms-full.txt.robots_state: optional /robots.txt state. Allowed values: present, absent, blocked, error, skipped.robots_default: optional default stance of robots.txt toward AI crawlers. Allowed values: allowed, partial, blocked.blocks_all: repeatable AI crawler that robots.txt must block (AND). Allowed values: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot.blocks_any: repeatable AI crawler; robots.txt must block at least one (OR). Same allowed values as blocks_all.not_blocked: repeatable AI crawler that robots.txt must not block. Same allowed values as blocks_all.all_ai_blocked: optional filter; true keeps only sites whose robots.txt blocks all 17 tracked AI crawlers.min_train_blocked: optional minimum number of AI training crawlers (of 11 tracked) that robots.txt blocks, 0 or greater.content_signal_train: optional Content-Signal ai-train value declared in robots.txt. Allowed values: yes, no. A robots.txt that writes anything else there is treated as declaring neither.tld: optional exact top-level-domain filter, e.g. com, org, io.category: optional exact category label carried by the source list. The top-1M run has none, so the filter matches nothing and facet=category is empty for it.reachable: optional filter; true keeps only sites whose homepage control request answered, false only sites that did not.home_blocked: optional filter; true keeps only sites whose homepage was walled off from the scan (a block or challenge).is_infrastructure: optional filter; false (the common case) excludes backend CDN/DNS/cloud-vendor hostnames that rank highly but serve no public homepage; true keeps only those.run_id: optional scan run id; defaults to the latest run.sort: optional sort order. Allowed values: relevance, rank_asc, links_desc, bytes_desc, domain_asc, crawled_desc. Defaults to relevance with q or text, otherwise rank_asc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20, max 100; page * page_size must be <= 10000.How to read the states:
present: a valid file was served. Validity is judged from the body, not from the status code or content type.absent: the site answered 404/410, or answered 200 with something that is not a file (a soft-404 page, HTML, an empty body).blocked: the site refused the request (401, 403, 429, a bot challenge). This is unknown, not absent.error: a transport failure or a 5xx. This is unknown, not absent.skipped: the homepage control request did not answer, so the path was not requested.present over present plus absent.Response behavior:
domain, tld, rank, category, is_infrastructure), the homepage control (reachable, home_status, home_blocked, home_challenge), the /llms.txt result in llms and /llms-full.txt in full (state, status, bytes, kind, valid, source_kind, generator, title, summary, sections, links, MCP/OpenAPI mentions, named bots, policy terms), the /robots.txt result in robots (state, default_stance, per-crawler stance in crawlers, train_blocked, all_ai_blocked, content_signal, sitemaps), and provenance (run_id, run_date, probed_at).robots.crawlers covers: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot.items array (not an error) when nothing matches or the dataset has no data yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| domain | 20 | |
| tld | 20 | |
| rank | 20 | 3 to 175, median 120 |
| is_infrastructure | 20 | true in 1 of 20 |
| reachable | 20 | true in 20 of 20 |
| home_status | 20 | 200 to 403, median 200 |
| home_blocked | 20 | true in 2 of 20 |
| home_challenge | 20 | true in 2 of 20 |
| origin | 20 | cloudflare.com and 19 other hosts |
| llms | 20 | |
| full | 20 | |
| robots | 20 | |
| analyzer_version | 20 | |
| method_version | 20 | |
| seed_source | 20 | |
| probed_at | 20 | 2026-10-11 |
| run_id | 20 | |
| run_date | 20 | 2026-10-11 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Substring match on the site domain, max 256 characters | ||
| text | string | No | Full-text match on the /llms.txt title and summary, max 256 characters | ||
| state | string | No | /llms.txt state. Enum: present, absent, blocked, error, skipped. blocked and error mean unknown, not absent Allowed values: present, absent, blocked, error, skipped. | ||
| valid | boolean | No | true keeps only sites serving a valid /llms.txt, false keeps the rest | ||
| source_kind | string | No | Producer of a valid /llms.txt. Enum: shopify_agent_template, seo_plugin, platform_default, parked, custom Allowed values: shopify_agent_template, seo_plugin, platform_default, parked, custom. | ||
| generator | string | No | Generator detected in a valid /llms.txt. Enum: yoast, aioseo, rankmath, wix, shopify, parked Allowed values: yoast, aioseo, rankmath, wix, shopify, parked. | ||
| bot | string | No | AI crawler named inside a valid /llms.txt, e.g. GPTBot (see facet=bot for the values) | ||
| min_links | integer | No | Minimum number of links in a valid /llms.txt, 0 or greater | ||
| mentions_mcp | boolean | No | true keeps only valid /llms.txt files that mention the Model Context Protocol | ||
| mentions_openapi | boolean | No | true keeps only valid /llms.txt files that mention OpenAPI or Swagger | ||
| placeholder | boolean | No | true keeps only valid /llms.txt files that still hold template placeholder text | ||
| injection | boolean | No | true keeps only valid /llms.txt files containing instruction-override text aimed at AI readers | ||
| full_valid | boolean | No | true keeps only sites serving a valid /llms-full.txt | ||
| robots_state | string | No | /robots.txt state. Enum: present, absent, blocked, error, skipped Allowed values: present, absent, blocked, error, skipped. | ||
| robots_default | string | No | Default stance of robots.txt toward AI crawlers. Enum: allowed, partial, blocked Allowed values: allowed, partial, blocked. | ||
| blocks_all | array<string> | No | Repeatable AI crawler that robots.txt must block (AND). Enum: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot Allowed values: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot. | ||
| blocks_any | array<string> | No | Repeatable AI crawler; robots.txt must block at least one (OR). Enum: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot Allowed values: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot. | ||
| not_blocked | array<string> | No | Repeatable AI crawler that robots.txt must NOT block. Enum: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot Allowed values: GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-SearchBot, Claude-User, anthropic-ai, Google-Extended, PerplexityBot, Perplexity-User, CCBot, Bytespider, Applebot-Extended, Amazonbot, meta-externalagent, cohere-ai, Diffbot. | ||
| all_ai_blocked | boolean | No | true keeps only sites whose robots.txt blocks all 17 tracked AI crawlers | ||
| min_train_blocked | integer | No | Minimum number of AI training crawlers (of 11 tracked) that robots.txt blocks, 0 or greater | ||
| content_signal_train | string | No | Content-Signal ai-train value declared in robots.txt. Enum: yes, no Allowed values: yes, no. | ||
| tld | string | No | Exact top-level-domain filter, e.g. com, org, io | ||
| category | string | No | Exact category label carried by the source list; the top-1M run has none, so this is empty for it | ||
| reachable | boolean | No | true keeps only sites whose homepage control request answered, false only sites that did not | ||
| home_blocked | boolean | No | true keeps only sites whose homepage was walled off from the scan (a block or challenge) | ||
| is_infrastructure | boolean | No | false (the common case) excludes backend CDN/DNS/cloud-vendor hostnames that rank highly but serve no public homepage; true keeps only those | ||
| run_id | string | No | the latest run | Scan run id; defaults to the latest run | |
| sort | string | No | Sort enum: relevance, rank_asc, links_desc, bytes_desc, domain_asc, crawled_desc Allowed values: relevance, rank_asc, links_desc, bytes_desc, domain_asc, crawled_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/llms/search?q=coffee&state=present&valid=true&source_kind=shopify_agent_template&generator=yoast&mentions_mcp=true&mentions_openapi=true&placeholder=true&injection=true&full_valid=true&robots_state=present&robots_default=allowed&blocks_all=GPTBot&blocks_any=GPTBot¬_blocked=GPTBot&all_ai_blocked=true&content_signal_train=yes&reachable=true&home_blocked=true&is_infrastructure=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "llms",
"items": [
{
"domain": "example.com",
"tld": "com",
"rank": 1204,
"reachable": true,
"llms": {
"state": "present",
"status": 200,
"bytes": 4120,
"valid": true,
"source_kind": "custom",
"title": "Example Docs",
"links": 18
},
"full": {
"state": "absent",
"status": 404
},
"robots": {
"state": "present",
"default_stance": "allowed",
"train_blocked": 3,
"all_ai_blocked": false
},
"run_id": "top1m-2026-10",
"probed_at": "2026-10-20T04:11:09Z"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "rank_asc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.llmsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.LlmsSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | LlmsRecord record, 104 fields: analyzer_version, category, domain, full, home_blocked, home_challenge, home_status, is_infrastructure, llms, method_version, origin, probe_error and 8 more. Described under LLMs.txt Dataset Item API. | |||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.sort | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/llms/search?q=coffee&state=present&valid=true&source_kind=shopify_agent_template&generator=yoast&mentions_mcp=true&mentions_openapi=true&placeholder=true&injection=true&full_valid=true&robots_state=present&robots_default=allowed&blocks_all=GPTBot&blocks_any=GPTBot¬_blocked=GPTBot&all_ai_blocked=true&content_signal_train=yes&reachable=true&home_blocked=true&is_infrastructure=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"