Why status alone is insufficient
A response can return 200 while displaying a password page, JavaScript challenge, consent wall, or generic error. AI retrieval requires usable product content, not merely a successful TCP connection.
Synthetic-header baseline test
On July 27, 2026, SkuWatch AI Visibility infrastructure requested selected pages from The Woobles, Rhode, Ring Australia, HexClad UK, and MyFonts while substituting browser-like and crawler-associated User-Agent strings. The recorded requests returned HTTP 200.
That result means only that those URL/header combinations did not receive an obvious status-level rejection from the tested network location. The requests were not sent by OpenAI, Perplexity, Google, or Anthropic. A valid body check must additionally confirm final URL, content type, response size or hash, expected product title, canonical, structured product data, and the absence of challenge or password-page markers.
Step 1: classify headers and final URL
url='https://example.com/products/example-product'
curl -sSIL --max-redirs 10 "$url"
curl -sSL -D headers.txt -o body.html \
-w 'status=%{http_code} final=%{url_effective} type=%{content_type}\n' \
"$url"
Fail when the final URL is /password, an access-denied route, or an unrelated homepage.
Step 2: inspect the body
rg -ni 'password|enter using password|captcha|verify you are human|access denied|challenge-platform|cf-chl|temporarily unavailable' body.html
rg -ni '<h1|product|price|add to cart|sold out|application/ld\+json' body.html
A blocker signature without product identity is a hard stop for that request.
Step 3: compare user-agent responses
for agent in \
'Mozilla/5.0 (compatible; StoreAudit/1.0)' \
'OAI-SearchBot/1.0; +https://openai.com/searchbot' \
'PerplexityBot/1.0; +https://perplexity.ai/perplexitybot' \
'Claude-SearchBot'; do
curl -sSL -A "$agent" -o /dev/null \
-w "$agent -> %{http_code} %{url_effective} %{size_download}\n" \
"$url"
done
Large differences in status, final URL, or body size justify log inspection. User-agent strings are not authentication.
Step 4: identify the responsible layer
| Symptom | Likely owner |
|---|---|
/password Shopify page |
Shopify storefront password setting |
403 with Cloudflare rule ID |
WAF/custom firewall rule |
429 after several requests |
rate limiting |
200 challenge shell |
bot-management challenge |
| wrong country path | geolocation or market redirect |
| browser works, clean curl fails TLS | proxy, certificate, or client network |
In Shopify admin, check Online Store → Preferences for storefront password state. For Cloudflare or another CDN, review security event logs before changing rules.
Step 5: verify legitimate traffic safely
Do not whitelist OAI-SearchBot or another name from the header alone. Follow each provider’s current identification guidance. Perplexity publishes IP validation guidance; Anthropic currently documents robots controls and says it does not publish stable IP ranges.
Safe remediation
- remove unintended password protection when the store should be public
- narrow a WAF rule to the actual abusive path or behavior
- allow public products while retaining private account and checkout restrictions
- use bounded rates rather than disabling all protection
- retain security-event evidence and rollback rule IDs
Expected result
The public product URL returns meaningful HTML containing product identity and facts for approved traffic, while cart, checkout, admin, and customer pages remain appropriately protected.
Rollback
Export or record the previous firewall expression before changing it. If abuse increases or a rule becomes too broad, restore the exact previous rule rather than improvising a second exception.
Community discussion
Add to the article
Ask a technical question, share a storefront result, or challenge a conclusion with evidence.