DataBA-D-2026-08
Emerging AI-usage preference signals census 2026 (robots.txt signal layer)
One row per domain for the 1,381 domains whose robots.txt parsed cleanly in the crawler-access corpus BA-D-2026-01 (universities 398, news 429, e-commerce 303, government 251), recording the presence and value of four emerging AI-usage preference signals — Content-Signal, x-rsl, content-usage, license — the Cloudflare managed-robots.txt signature, the Server-header CDN fingerprint, two established directives (crawl-delay, sitemap), a comma-in-user-agent malformation flag, and the set of AI crawler tokens root-blocked in the same file.
Collection window: 2026-07-09 · License: CC-BY-4.0 · Published with BA-D-2026-08: Emerging AI-usage preference signals in robots.txt: a signal-layer census of 1,381 domains
Schema
| Column | Type | Description |
|---|---|---|
| sector | string (enum) | The frame the domain belongs to: universities, news, ecommerce, or government. The frames are those of BA-D-2026-01; this dataset carries only the 1,381 rows whose robots.txt parsed cleanly. |
| domain | string | The registrable domain (eTLD+1) that was fetched, as listed in the sector frame; lowercased. The (sector, domain) key matches the crawler-access-2026 dataset row-for-row for these parsed domains. |
| content_signal_present | boolean | Whether a Content-Signal line was found by raw-text line scan in the domain's robots.txt. True for 42 of the 1,381 domains. |
| content_signal_value_raw | string or empty | The literal Content-Signal value as it appears in the file (for example 'search=yes, ai-train=no, use=reference'), preserving the file's spacing and key order. Empty when content_signal_present is false. |
| content_signal_value_norm | string or empty | The Content-Signal value with whitespace removed (key order preserved as written), used for grouping identical values. Empty when content_signal_present is false. The 33 managed-default carriers all normalize to 'search=yes,ai-train=no,use=reference'. |
| content_signal_class | string (enum) or empty | Authorship classification of the Content-Signal line: 'cdn-default' when the Cloudflare managed-robots.txt signature is present AND the normalized value equals 'search=yes,ai-train=no,use=reference' (33 domains), else 'hand-authored' (9 domains). Empty when content_signal_present is false. |
| x_rsl_present | boolean | Whether an x-rsl field was found by line scan. True for 7 domains (all news). Recorded as an observed raw field name, not validated against any specification. |
| content_usage_present | boolean | Whether a content-usage field was found by line scan. True for 3 domains (all e-commerce). Recorded as an observed raw field name, not validated against any specification. |
| license_present | boolean | Whether a license field was found by line scan. True for 3 domains (all news). Recorded as an observed raw field name, not validated against any specification. |
| cf_managed_signature | boolean | Whether the file carries a known Cloudflare managed-robots.txt comment signature (a managed-content marker in the file's comments). True for the 33 cdn-default carriers and false for the 9 hand-authored carriers; a component of content_signal_class, not a substitute for the CDN Server header. |
| cdn_fingerprint | string (enum) | The Server response header mapped to one of cloudflare / akamai / other / none. Across the 1,381 parsed domains: cloudflare 288, akamai 8, other 786, none 299. The 'other' and 'none' buckets contain CDNs that do not self-identify in the Server header (e.g. cloudfront, varnish), so any CDN-penetration count read from this column is a lower bound. |
| server_header_raw | string or empty | The raw, lower-cased Server response header value backing cdn_fingerprint (for example 'cloudflare', 'nginx', 'cloudfront'). Empty when the response carried no Server header (cdn_fingerprint 'none'). |
| crawl_delay_present | boolean | Whether a crawl-delay directive was found by line scan. True for 228 domains. An established directive, included as context for the scale of the emerging signals; not an AI-usage preference. |
| sitemap_present | boolean | Whether a sitemap line was found by line scan. True for 914 domains. An established directive, included as context; not an AI-usage preference. |
| comma_in_ua_value_present | boolean | Whether a user-agent line contains a comma inside its value (for example 'User-agent: GPTBot, CCBot'), a construct a conformant RFC 9309 parser treats as a single unmatched token. True for 10 domains (all news). A malformation flag, not a preference signal. |
| ai_tokens_root_blocked | string (pipe-separated) or empty | The set of AI crawler tokens whose root path ('/') is blocked by the same robots.txt, joined by '|' (for example 'CCBot|ClaudeBot|GPTBot'). Reused from the BA-D-2026-01 RFC 9309 evaluation. Empty when no AI token is root-blocked. |
| ai_tokens_root_blocked_count | integer | The number of AI crawler tokens root-blocked in the same file (the count of ai_tokens_root_blocked). 40 of the 42 Content-Signal carriers have a value of at least 1. |
Known limitations
- Line scan, not a parser. Every *_present field is a raw-text line match, not an RFC 9309 parse. The dataset does not resolve directive grouping, precedence, or wildcard expansion, and does not judge whether a Content-Signal, x-rsl, content-usage, or license value is semantically valid. A true value means 'this line is present', not 'this preference is in force'.
- Deployment, not compliance. The fields record that an operator or a CDN deployed a signal, not that any AI crawler honors it. Content-Signal, x-rsl, content-usage, and license are emerging, non-mandatory fields with no broad enforcement guarantee; nothing here measures crawler behavior and no AI-visibility effect is implied.
- Parsed denominator is selective. The dataset carries only the 1,381 domains whose robots.txt parsed cleanly in BA-D-2026-01; the 383 unparseable_blocked, 154 fetch_error, and 82 no_robots_file domains are excluded. The unparseable_blocked domains — many behind a bot-challenge page — are plausibly heavy CDN users, so their absence biases the CDN-related counts (cdn_fingerprint, cf_managed_signature) downward. A false in a *_present field means 'a readable file without this line', not 'no file'.
- CDN fingerprint from the Server header only. cdn_fingerprint is derived from the Server response header, which some CDNs do not set or set to a non-CDN value; cloudfront and fully fronted origins fall into 'other'/'none'. Every CDN-penetration and managed-default figure derived from this column is a lower bound.
- Authorship split depends on a known signature. content_signal_class and cf_managed_signature match a known Cloudflare managed-robots.txt comment signature. If that vendor changes its managed comment text, newer managed files would miss the signature and shift from cdn-default toward hand-authored, understating the managed share — an error in the direction of a floor, not a ceiling.
- Single-day snapshot. Every row reflects the robots.txt served on 2026-07-09 (the reused BA-D-2026-01 fetch; the derived scan ran 2026-07-10). robots.txt files and their embedded signals change without notice; treat the data as perishable.
FAQ
- Why only 1,381 rows and not 2,000?
- An emerging signal is a line inside a robots.txt file, so the denominator is the domains that have a readable file: the 1,381 that BA-D-2026-01 classified 'parsed'. A domain with no file (no_robots_file) has nowhere to carry a signal, and a domain whose file could not be read (unparseable_blocked, fetch_error) has an unreadable file rather than an absent signal. Restricting to parsed files makes a false in a *_present field mean 'a readable file without this line'.
- What is the difference between cf_managed_signature and content_signal_class = cdn-default?
- cf_managed_signature is one of the two conditions for cdn-default. A carrier is classed cdn-default only when the managed signature is present AND the normalized Content-Signal value is the byte-identical managed default 'search=yes,ai-train=no,use=reference'. In this corpus the two conditions coincide on all 33 managed carriers, but they are recorded separately so a reader can apply either test independently.
- Why is authorship not just cdn_fingerprint = cloudflare?
- Because 41 of the 42 Content-Signal carriers sit behind that CDN by Server header, including 8 of the 9 hand-authored files. Splitting by the Server header would assign nearly every carrier to one bucket and reveal nothing about who wrote the line. The managed-comment signature plus the exact default value separates an injected default (33) from an operator-authored line (9); the Server header alone does not.
- A domain shows a Content-Signal line but also root-blocks AI crawlers. Is that a contradiction?
- No, and it is the common case: 40 of the 42 carriers also root-block at least one AI token (ai_tokens_root_blocked_count >= 1). A Content-Signal line expresses a purpose-based preference; a Disallow blocks a named crawler. In this corpus the two are layered in the same file far more often than a Content-Signal line appears alone.
- What is the license, and how should this be cited?
- The dataset is released under CC-BY-4.0. Cite the parent census BA-D-2026-08 and this datasheet, and state the collection date (2026-07-09), since the data is a single-day snapshot derived from the BA-D-2026-01 corpus.
Changelog
- 2026 — Initial release. CSV generated from the source JSONL (emerging_signals.jsonl, sha256 17f376a5…) by a deterministic serializer and verified cell-for-cell against the JSONL and the published aggregates.
How to cite
Barkhausen AI (2026). Emerging AI-usage preference signals census 2026 (robots.txt signal layer) (dataset). https://barkhausen.ai/data/ai-usage-signals-2026/
BibTeX
@techreport{BA-D-2026-08,
author = {{Barkhausen AI}},
title = {Emerging AI-usage preference signals census 2026 (robots.txt signal layer) (dataset)},
institution = {Barkhausen AI},
year = {2026},
url = {https://barkhausen.ai/data/ai-usage-signals-2026/}
}Published under the Creative Commons Attribution 4.0 International (CC-BY-4.0).