Crawler engineering
How to check whether your site blocks ChatGPT, Claude, or Perplexity
A page can be allowed in robots.txt and still blocked by a firewall. Check one public URL and one excluded path, save their responses, and verify which provider made any real request.

Test one public page and one path you intend to exclude. Save the live robots policy and page response, then inspect real requests at the edge. I would report policy, delivery, and provider attribution individually: an allowed rule can coexist with a blocked article.
The pair tests both what you opened and what should stay closed. A homepage-only check can miss a named crawler group that accidentally reopens internal search or a service page still stopped by the firewall.
Method & limits
Provider and protocol documentation was checked October 21, 2026. The URL matrix is illustrative, not the result of an audit of a business or sulayman-bowles.dev. No new provider crawl, model query, IP-feed classification or referral measurement was performed. A local response describes the requesting client and time; provider access needs its own request evidence.
Which kind of access are you testing?
A checker that asks whether “ChatGPT is allowed” has already compressed several decisions. Search discovery, training collection and a person asking an assistant to open a URL can follow different policies. Use the product token in the report.
OpenAI says ChatGPT-User rules may not apply, Anthropic says its user fetcher honors robots, and Perplexity says its user fetcher generally ignores them. Select the exact product token before interpreting the policy.
| Service | Automatic search | Training collection | User-directed fetch |
|---|---|---|---|
| ChatGPT / OpenAI | OAI-SearchBot | GPTBot | ChatGPT-User |
| Claude / Anthropic | Claude-SearchBot | ClaudeBot | Claude-User |
| Perplexity | PerplexityBot | Neither listed agent is documented for foundation-model training | Perplexity-User |
What does the public host serve?
Use the final public URL, including its scheme and hostname. The policy on https://example.com does not cover a separate www or help hostname just because the pages share a logo. Google’s robots specification describes the host, protocol and port scope.
Save GET headers and bodies for the policy and page, including error responses and final redirect destinations. Run the commands from an empty working folder and replace both example URLs.
Two ordinary diagnostic requests. They do not impersonate or reproduce a provider crawler.
curl --connect-timeout 10 --max-time 30 --silent --show-error --location \
--dump-header robots.headers --output robots.body \
--write-out 'final_url=%{url_effective} status=%{http_code}\n' \
https://example.com/robots.txt
curl --silent --show-error --location \
--dump-header page.headers --output page.html \
--write-out 'final_url=%{url_effective} status=%{http_code}\n' \
https://example.com/services/A failed fetch may come from Cloudflare or host controls. Check the delivered response before changing the crawler policy.
Does the matching group allow the intended path?
Feed the saved policy into a parser that accepts a product token and full URL. Keep the parser name and version. Google publishes a robots.txt parser and matcher with a single-URL command; its documented build instructions provide one reproducible option, although another provider’s implementation may differ.
Test every selected search token against both paths, then test the training token against a public article if you decline training collection. RFC 9309’s group rules make * a fallback and combine repeated groups for one product token.
| Token | URL path | Expected policy result |
|---|---|---|
| OAI-SearchBot | /services/ | Allowed |
| OAI-SearchBot | /search/results | Disallowed |
| Claude-SearchBot | /services/ | Allowed |
| PerplexityBot | /services/ | Allowed |
| GPTBot | /services/ | Disallowed |
Did the request receive the article?
Inspect page.html for the main heading and a distinctive sentence from the intended article, because a login form, challenge, empty application shell, or error page can all make a technically successful HTTP response fail the publishing task while leaving the status at 200. Save that body with the classification.
If a browser displays the missing text after JavaScript runs, record that as a browser observation. It is an additional representation to inspect. The raw HTML and rendered DOM method explains how to capture a browser’s own document response without assuming a separate curl request received the same bytes.
For Cloudflare challenges, cf-mitigated: challenge identifies a Challenge Page response. Cloudflare’s header reference gives the documented signal. Preserve any request ID and time so you can find the corresponding security event.
What evidence comes from the provider itself?
Now inspect edge logs for the chosen path and time window. A request header naming a provider is a lead. Use the trusted client address and the provider’s current verification method before attributing it; OpenAI and Perplexity link product-specific IP feeds from their documentation. Preserve the evidence date instead of silently classifying historical requests against a new list.
Changing curl’s User-Agent tests a string-based routing difference on your network. Provider visits need their source network and request evidence, including any relevant TLS fingerprint, request sequence, or credentials. Keep the probe in a synthetic-check class.
The server-log verification guide covers proxy addresses and missing attribution evidence. If there is no attributable request in the window, mark provider delivery unverified. Do not turn silence into either a pass or a block.
What should the final access report say?
The report should locate the next repair. “Policy disallowed” points to robots.txt. “Policy allowed, edge denied” points to security rules. “Document delivered, no attributed provider request” calls for observation before another policy change.
Keep the exact URL, check time, token, saved policy and response, and attribution status together. The provider map supplies the choices. I would repair the failed control first, then measure citations under their own recorded conditions.
Sources
- OpenAI — Overview of OpenAI CrawlersOpenAIVerified Oct 21, 2026
Fetched with the official OpenAI documentation tool; no publication date is displayed.
- Anthropic — web crawlers and site-owner controlsAnthropic · April 7, 2026Verified Oct 21, 2026
- Perplexity — Perplexity CrawlersPerplexityVerified Oct 21, 2026
No publication date displayed. Current page links www.perplexity.com product-specific feeds; the feeds themselves were not fetched for a classification.
- Google — How Google interprets robots.txtGoogle · Updated August 31, 2026Verified Oct 21, 2026
- RFC 9309 — Robots Exclusion ProtocolIETF / RFC Editor · September 2022Verified Oct 21, 2026
- Google — open-source robots.txt parser and matcher READMEGoogleVerified Oct 21, 2026
README and single-URL CLI usage checked; no local build or provider-conformance test was run.
- Cloudflare — Detect a Challenge Page responseCloudflare · Updated May 5, 2026Verified Oct 21, 2026