Technical research note
Hostinger's CDN blocks GPTBot with HTTP 429 on every cache miss: the evidence, the diagnosis and the ticket
Hostinger's CDN blocks GPTBot before a request ever reaches the site. On 2026-09-14, 8 of 8 cache-miss requests carrying OpenAI's training crawler identity returned HTTP 429, while 56 of 56 requests from seven other identities returned 200 from the same machine in the same minutes. Hostinger has confirmed in writing that this is deliberate: a rate limit applied to OpenAI's training crawler across their platform, not configurable per domain, and not something they will make an exception for on shared hosting. This page is the full record, and it includes a method you can run against any host in five minutes.
Status: closed by Hostinger, unchanged in effect
- 2026-09-15
- Hostinger CLOSED ticket #21396332 as resolved. Their final answer: the 429s are "intentional and server-wide", a rate limit applied "specifically to OpenAI's training crawler (GPTBot/1.x) at the infrastructure level" to "protect shared server resources for all customers on the platform", and "not configurable per domain". They will not make an exception on shared hosting. This corrects one claim below, see the note in section 05.
- 2026-09-14
- Ticket #21396332 escalated to Hostinger's infrastructure team with written confirmation of a platform-level edge rule. No timeline given. Reproduction on this page run the same day: 8 of 8 GPTBot cache-miss requests returned 429.
- 2026-09-12
- Workaround live: CDN TTL raised to four hours and Vary: User-Agent removed, so GPTBot can read pages another visitor has already warmed. Cache misses still 429.
- 2026-09-11
- Hostinger live chat confirms GPTBot is absent from their verified-crawler allowlist, which Googlebot and Bingbot are on.
Measured figures on this page were last regenerated from the run files on 2026-09-14. When the rule changes, this log changes first.
0 of 8
cache-miss requests GPTBot got through
56 of 56
from the seven other identities, same machine, same minutes
0
real GPTBot fetches in the production log, against 373 from OpenAI's other two bots
What Hostinger's CDN does to GPTBot, measured
Any request that reaches Hostinger's edge with the versioned GPTBot user agent and no cached copy to
serve gets HTTP 429 with an empty body. The response carries Server: hcdn and a CDN
request ID and never touches the origin server, so nothing in the site's own configuration is
involved. Requests that hit a warm cache pass, which is why the block hides from casual checks.
| Identity | What it is | 200 | 429 |
|---|---|---|---|
| GPTBot/1.2 | OpenAI training crawler, full versioned string | 0 | 8 |
| GPTBot bare | The bare word only, no version, no Mozilla prefix | 8 | 0 |
| OAI-SearchBot | OpenAI, builds the index behind ChatGPT search | 8 | 0 |
| ChatGPT-User | OpenAI, live fetch when a user question triggers browsing | 8 | 0 |
| Googlebot | Google search | 8 | 0 |
| ClaudeBot | Anthropic | 8 | 0 |
| PerplexityBot | Perplexity | 8 | 0 |
| Chrome | An ordinary browser, the control | 8 | 0 |
One detail worth stating exactly. The bare word GPTBot with no version and no Mozilla prefix passed
8 of 8 on this run.
On 11 September the string GPTBot/1.2 on its own failed 5 of 5. The rule matches something in
the real crawler's string, and OpenAI's real crawler sends the full string, so the practical effect is total.
Why ChatGPT still cites a site whose GPTBot access is blocked
OpenAI runs three crawlers with three jobs, and this rule blocks only one. GPTBot builds the training corpus, the part of the model that knows things without searching. OAI-SearchBot builds the index behind ChatGPT search. ChatGPT-User fetches a page live when a question triggers browsing. The last two returned 200 on every request, so ChatGPT can still find, read and quote this site in real time.
The production log settles it independently of any test we ran. In 01/Sep/2026 to 14/Sep/2026, after removing our own testing IPs, OAI-SearchBot fetched 134 pages and ChatGPT-User fetched 239. GPTBot fetched 0. Every GPTBot line in the raw file came from our own reproduction runs.
What is lost is being part of what the model knows without searching. What survives is everything ChatGPT looks up. A site in this state is cited on questions where the engine searches and absent from the ones where it answers from memory.
How we proved it was not our site
A host will assume the customer's configuration is at fault, reasonably, so the job was to remove every customer-side variable by direct test before asking anyone to look at the edge. Six checks did it, and the sixth is the one that ended the argument.
- The 429 never reaches origin. It carries
Server: hcdn, a CDN request ID andContent-Length: 0. No PHP, no.htaccess, no logging script can be in the path. - CDN security level Medium and Off produce identical 429s. The setting is irrelevant to the rule.
- hPanel exposes no user-agent rule of any kind. Zero IP blocks, zero country blocks. A rule that matches a user agent cannot be something the customer configured.
- No Cloudflare in front. Nameservers and IPs are Hostinger's, and no
cf-header appears anywhere. - Hostinger's own edge diagnostic clears the client.
/hcdn-cgi/myipreturns every classification flag at zero, and it returns 200 under the GPTBot identity while content paths return 429 in the same minute. The TLS fingerprint is identical across identities. The rule is on the user agent and the path, not the client. - A second, unrelated domain on the same host fails identically. Different site, different configuration, same 429, 8 of 8. Two unrelated domains failing the same way is not customer configuration, and Hostinger listed both in the escalation.
The response headers, request by request
| Identity | Status | Cache | Edge node | CDN request ID |
|---|---|---|---|---|
| GPTBot/1.2 | 429 | none | edge9 | 9a013787e41e1890e2e1a9c94a96235c |
| GPTBot/1.2 | 429 | none | edge7 | c66b16cd88681b51638b42aa2984da81 |
| GPTBot/1.2 | 429 | none | edge10 | 6fb289e5e6d5aa1ae81b46a2f2f55eac |
| GPTBot/1.2 | 429 | none | edge6 | 5027ef225ecb6408b40df7b049e14b5b |
| OAI-SearchBot | 200 | DYNAMIC | edge7 | e071afd1a2e076309db26d1906015a16 |
| OAI-SearchBot | 200 | DYNAMIC | edge8 | 3750884ba1fe044cf694aca6ab644fd8 |
| OAI-SearchBot | 200 | DYNAMIC | edge8 | 01f36b1ae0177c8a713aa217574b5842 |
| OAI-SearchBot | 200 | DYNAMIC | edge6 | 615ab0f946b4608b44037c527917fb63 |
| Googlebot | 200 | DYNAMIC | edge7 | ef0bf4a6c619c20e4b2918cd8bb6d592 |
| Googlebot | 200 | DYNAMIC | edge10 | f9ec0a6981b1d37417097231d548ff4c |
| Googlebot | 200 | DYNAMIC | edge8 | 9ce2ab2e059b3adafe84a52f00a48ff5 |
| Googlebot | 200 | DYNAMIC | edge8 | add0b5e6c707d8566e8827d0a6ef2a97 |
| Chrome | 200 | DYNAMIC | edge7 | f3fd37b0786f233d1a1e37aed5ddd667 |
| Chrome | 200 | DYNAMIC | edge10 | b7b96e4e3994b16b91aac37782ef8bfa |
| Chrome | 200 | DYNAMIC | edge8 | 02d1226b644dc2a5be68297c0a1f8c84 |
| Chrome | 200 | DYNAMIC | edge7 | a04a26659b915df64de494ce272ab510 |
Four different edge nodes (edge10, edge6, edge7, edge8, edge9) returned the same result, so it is not one misbehaving node. Every 200 is marked DYNAMIC, meaning it went to origin; every 429 has no cache status at all, because it was refused before the cache was consulted.
The diagnosis, including the two wrong turns
The diagnosis took a month and was wrong twice, and both wrong turns are in the record because they are the useful part. The first blamed our own logging detour for AI crawlers. The second was a kill switch that removed it and changed nothing. What finally worked was refusing to theorise and measuring the same request under different identities in the same second.
- 2026-08-12
- Full crawler sweep: 16 AI user agents, all HTTP 200. GPTBot passed on a CDN cache HIT, so this test never actually reached the rule.
- 2026-08-22
- Audit finds GPTBot receiving HTTP 429 on every cache-miss page. First attribution, to our own .htaccess routing AI crawlers through a logging script, was wrong.
- 2026-08-28
- Kill switch removes the logging detour entirely. GPTBot still 429s identically. Origin was never the mechanism.
- 2026-09-01
- UA-scoped, not IP-scoped: Chrome 200 and OAI-SearchBot 200 from the same IP in the same second as GPTBot 429. Response carries Server: hcdn and a CDN request ID, never reaching origin.
- 2026-09-11
- 15 consecutive cache-busted GPTBot requests, 15 of 15 returned 429. Controls in the same minute from the same IP: Chrome 15 of 15, OAI-SearchBot 15 of 15, Googlebot 15 of 15, all 200. Reproduced on a second, unrelated domain on the same host. Hostinger live chat confirms GPTBot is absent from their verified-crawler allowlist.
- 2026-09-12
- Workaround shipped: CDN TTL raised from 10 minutes to 4 hours and Vary: User-Agent removed, so GPTBot can read pages another visitor has already warmed. Cache misses still 429.
- 2026-09-14
- Ticket #21396332 escalated to Hostinger infrastructure. Written confirmation: platform-level edge rule matching GPTBot, no customer-side setting, no timeline. Reproduction on this page run the same day.
- 2026-09-15
- Hostinger closes the ticket. Final answer: the 429s are intentional and server-wide, a rate limit applied specifically to OpenAI training crawler GPTBot/1.x at the infrastructure level, to protect shared server resources, not configurable per domain. No exception on shared hosting. This corrected our own earlier claim that it was not rate limiting.
What Hostinger confirmed in writing
Ticket #21396332, opened 2026-09-11 and escalated to the infrastructure team on 2026-09-14. The support agent's confirmation, quoted from the ticket:
"The 429 is being generated at the Hostinger CDN edge, before your origin is ever reached."
"It affects two unrelated domains on our platform with no shared configuration."
"Security level and traffic blocking rules have no effect."
"Every other major crawler passes without issue; only GPTBot is affected."
"This points to a platform-level edge rule that is specifically matching GPTBot, something that exists at the infrastructure layer and is not configurable from hPanel. There is no setting available to you (or to us at the support level) that can whitelist a bot UA or IP range at the CDN edge."
"Googlebot and Bingbot are on a verified crawler allowlist that bypasses CDN security checks. GPTBot is not currently on that list."
"We cannot commit to a timeline or outcome."
Correction, 15 September 2026
This page originally said the mechanism was "not rate limiting" and described it as a verified-crawler allowlist with the largest AI crawler missing from it. That came from the first agent's explanation, and Hostinger's final answer supersedes it. On 15 September they closed the ticket and stated that their servers "apply a rate limit specifically to OpenAI's training crawler (GPTBot/1.x) at the infrastructure level", that the rule exists to "protect shared server resources for all customers on the platform", and that it is "not configurable per domain".
Every measurement on this page still stands. What changed is the label. A rate limit set low enough that 15 consecutive cache-busted requests all fail, and that still refuses the first request after nine idle hours, is indistinguishable from a blanket block when you are testing it from outside. We could not tell the difference from the client side, and we should have said so rather than ruling one out.
"The 429 responses for GPTBot are intentional and server-wide, this is not caused by anything on your website or your hPanel configuration."
"A different User-Agent string returning 200, it simply doesn't match the rate-limit rule; it does not mean your site behaves differently for that crawler."
"The issue appearing on multiple domains, because the rule is server-wide, not domain-specific."
"While we are unable to allowlist GPTBot on shared/cloud hosting, here are your available options."
"We're sorry we can't offer a per-domain exception on the current hosting plan."
The three options they offered: raise the cache TTL so more requests hit a warm cache, upgrade to a VPS or dedicated server where "you have full control over server-level rules, including the ability to remove or adjust crawler rate limits entirely", or do nothing, on the grounds that OAI-SearchBot and ChatGPT-User already reach the site. Their own words on that last point: "Your site is not invisible to ChatGPT", which matches what we measured in section 02.
So the finding is narrower and more deliberate than we first described, and in one way worse. It is not an oversight in a list. A major shared host has chosen to rate-limit OpenAI's training crawler across its platform, will not make exceptions, and prices the remedy as an upgrade. Anyone publishing on shared hosting is opted into that by default and has no way to see it.
The workaround, and what it does not fix
Cache hits pass, so the only customer-side lever is making more requests hit. Two changes did that:
the CDN TTL went from ten minutes to four hours, and Vary: User-Agent was removed from the
response, because it had been giving every distinct crawler string its own cache key. GPTBot could never
warm its own key, so it was locked out of a cache other visitors had already filled.
Why the cache ratio mattered
Hostinger's own CDN analytics for the 30 days to 2026-09-11: 49 hits, 328 misses, 391 dynamic, 772 requests. A hit ratio of 6.3% on a static site. Since GPTBot succeeds only on hits, roughly 94% of the site was unreachable to it before the change.
What it does not fix is the thing that matters most to a publisher. A newly published page has no cached copy, so GPTBot's first attempt is always a miss, and always 429. Hostinger said the same in the ticket: the cache changes are a workaround, and every new cache miss still returns 429. New content stays invisible to the training crawler until the rule is removed, which is the opposite of what a site that publishes for a living needs.
How to check whether GPTBot can crawl your site
Five minutes, one terminal, no tool. The method has three rules: defeat the cache with a random query string on every request, send the real crawler's full user-agent string rather than the bare name, and run the controls from the same machine within the same minute so nothing but the identity differs.
# 1. GPTBot, full string, cache-busted
curl -sI -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.2; +https://openai.com/gptbot" \
"https://YOURSITE.com/?miss=$RANDOM" | head -n 1
# 2. Control: an ordinary browser, same second
curl -sI -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0 Safari/537.36" \
"https://YOURSITE.com/?miss=$RANDOM" | head -n 1
# 3. Control: OpenAI's other crawler
curl -sI -A "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot" \
"https://YOURSITE.com/?miss=$RANDOM" | head -n 1
# 4. Control: Googlebot
curl -sI -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
"https://YOURSITE.com/?miss=$RANDOM" | head -n 1
Read the result in this order. If all four return 200, you are fine. If GPTBot alone returns 429 or 403,
look at the response headers: a Server value naming the CDN and a request ID with no cache
status means the edge refused it before your site was involved. Repeat GPTBot ten times to rule out a
budget. Then run the same four commands against a second site on the same host, ideally one you did not
build. If it fails identically, you have the evidence a support agent needs, and the words to use are
"reproduced on two unrelated domains, controls pass from the same IP in the same minute."
Two traps. A 200 on a page you visited a minute ago proves nothing, because the CDN served the copy it already had; the random query string is not optional. And a short sequence of 200s from a cold start proves nothing either; we saw first requests pass and then everything fail. Ten cache-busted requests is the minimum for a claim.
The raw run files behind this page are published alongside it: the 64-request run, the header capture and the log split. CC BY 4.0.
Where Claude fit, and where it did not
This was diagnosed with Claude Code driving the terminal, and it is worth being precise about what that bought. It did not fix anything, because the fix is a rule on someone else's infrastructure. What it did was run the elimination sequence above as scripts rather than as guesses, capture headers on every request so the CDN request IDs existed when support asked for them, and write the ticket from the measurements instead of from memory.
It also produced both wrong turns. The first attribution to our own logging script was a plausible theory that a script wrote up confidently and that a month of evidence then disproved. The lesson from that is not about the tool. It is that a theory about a 429 is worth nothing until the same request has been sent under two identities in the same second, and no amount of reasoning substitutes for that one measurement.
Method and limits
- Measured
- 2026-09-14 10:59:13 UTC
- Client
- One IP, 103.147.86.116, Pakistan
- Requests
- 64 across 4 paths, all cache-busted
- Identities
- 8, full user-agent strings as sent, listed above
- Edge nodes
- edge10, edge6, edge7, edge8, edge9
- Ticket
- #21396332, quoted verbatim
- Single vantage point. Everything here was measured from one IP in Pakistan. The UA-scoped result, with seven identities passing from the same IP in the same minutes, makes an IP-reputation explanation very unlikely, and Hostinger's own diagnostic showed the IP clean, but the test has not been run from OpenAI's published crawler ranges.
- The production log undercounts. After the cache change, hits never reach origin, so the server-side log undercounts every crawler equally. The zero for GPTBot is against 373 for OpenAI's other bots in the same log, so the comparison holds; the absolute numbers do not.
- The bare-word result is reported, not explained. We do not know the exact pattern the rule matches, only that the string OpenAI's crawler actually sends is caught.
- This is one host. Whether other hosts' edges behave the same way is exactly what the method in section 07 is for.
Written by Abdul Subkhan. Published 2026-09-14. Our measurement rules are on the methodology page. Figures regenerate from the run files, so the page and the data cannot disagree.
Questions about GPTBot being blocked
Does Hostinger block GPTBot?
On the site measured here, yes, at the CDN edge and only on cache misses. 8 of 8 cache-miss requests carrying the versioned GPTBot user agent returned HTTP 429 on 2026-09-14, while 56 of 56 requests from seven other identities, including two other OpenAI crawlers, returned 200 from the same IP in the same minutes. Hostinger confirmed in writing that this is an intentional, server-wide rate limit on OpenAI's training crawler, not configurable per domain.
Why does ChatGPT still cite a site GPTBot cannot crawl?
Because OpenAI runs three crawlers and only one is blocked. GPTBot builds the training corpus. OAI-SearchBot builds the index behind ChatGPT search, and ChatGPT-User fetches a page live when a question triggers browsing. Both of those returned 200 on every request. In 01/Sep/2026 to 14/Sep/2026 of production logs they fetched 373 pages between them; GPTBot fetched 0.
How do I check whether GPTBot can crawl my site?
Request a page with a random query string, so the CDN cannot serve it from cache, once with the full versioned GPTBot user agent and once with an ordinary browser string, from the same machine within the same minute. If the first returns 429 and the second returns 200, the rule is on the user agent. Repeat with OAI-SearchBot and Googlebot as further controls. The exact commands are on this page.
Is this a rate limit?
Yes, and Hostinger confirmed it on 15 September: their servers "apply a rate limit specifically to OpenAI's training crawler (GPTBot/1.x) at the infrastructure level" to protect shared resources. It is set low enough to be indistinguishable from a block in testing. Fifteen consecutive cache-busted requests returned 429, and so did the first request after nine idle hours. Cache hits always pass, which is why casual spot checks look fine. This page originally said it was not a rate limit; see the correction in section 05.
Can I fix this from hPanel?
No. Hostinger stated the rule is "not configurable per domain" and that "there is no setting in hPanel that can remove or bypass this limit for GPTBot". Security level, IP rules and bot protection had no effect when tested. On shared hosting the only customer-side mitigation is cache warming, which does not help newly published pages. Their own remedy is to upgrade to a VPS or dedicated server, where crawler rate limits can be removed.
Was this caused by the site itself?
No, and the proof was a second, unrelated domain on the same host failing identically, plus the response headers: the 429 carries the CDN server header and a CDN request ID and never reaches origin. Hostinger listed both domains in the escalation.
Find out what the engines can and cannot read on your site.
Two fields. We check crawler access at the edge for every major AI bot, then run your buyers' real questions across ChatGPT, Gemini, Perplexity and Google AI Overviews and email the report inside 48 hours.
Prefer to talk first? 15 minutes with Abdul, not a sales rep.
Three named. None of them you.