AI Crawler Checker
REST endpoints for AI Crawler Checker. Base URL https://api.competlab.com; every request needs a CL-API-Key header (see Authentication). Responses wrap in { item } or { items }; errors in { error }.
Check AI crawler accessibility for a domain
/v1/tools/ai-crawler-checkerCheck which AI crawlers are allowed, disallowed, or unconfigured on any public domain. Inspects robots.txt for major AI bots (GPTBot, ClaudeBot, Google-Extended, PerplexityBot, and more), checks meta tags and the presence of /llms.txt, and surfaces an accessibility verdict, opt-in/opt-out strategy detection, and how the domain compares to industry peers. Optionally tailor the analysis to a specific industry. Stateless live check — no project required, no data is persisted. Suitable for AI readiness audits, content-strategy reviews, and pre-launch compliance checks.
Request body — application/json
| Field | Type | Description |
|---|---|---|
domain | string | Target domain to check for AI-crawler accessibility. Accepts a bare hostname or a full URL — normalized (lowercased, scheme and path stripped) before checking. |
industry | string | Industry context used to tailor crawler recommendations and benchmarks. Defaults to “other” when omitted. Values: news-media, arts-entertainment, law-government, finance-healthcare, saas-tech, ecommerce, other. |
Request
curl -X POST "https://api.competlab.com/v1/tools/ai-crawler-checker" \
-H "CL-API-Key: YOUR_COMPETLAB_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"stripe.com","industry":"saas-tech"}'Response 200 OK
Example
{
"item": {
"domain": "competlab.com",
"fetchedAt": "2026-05-16T14:30:00.000Z",
"industry": "saas-tech",
"crawlers": [
{
"userAgent": "GPTBot",
"displayName": "GPTBot",
"operator": "OpenAI",
"category": "training",
"status": "blocked",
"matchingDirective": "Disallow: /"
}
],
"robotsTxt": {
"found": true,
"content": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nAllow: /\n",
"statusCode": 200
},
"metaTags": [
{
"name": "robots",
"content": "noai, noimageai"
}
],
"headers": {
"xRobotsTag": "noai, noimageai"
},
"llmsTxt": {
"found": true,
"sectionCount": 12,
"linkCount": 47,
"approxTokens": 1850
},
"llmsFullTxt": {
"found": true,
"sectionCount": 12,
"linkCount": 47,
"approxTokens": 1850
},
"accessibility": {
"score": 65,
"label": "Mixed Access",
"interpretation": "Selective access — training bots blocked, retrieval bots allowed. Common pattern for content-led brands protecting IP while staying answer-engine visible.",
"color": "orange"
},
"strategy": {
"type": "block-training-allow-retrieval",
"label": "Block training, allow retrieval",
"description": "You're blocking AI model training crawlers (GPTBot, ClaudeBot) while allowing retrieval bots (ChatGPT-User, PerplexityBot). Protects IP, maintains answer-engine visibility."
},
"industryPosition": {
"industryLabel": "SaaS / Tech",
"industryAvgBlockRate": 42,
"typicalScoreRange": [
55,
80
],
"position": "average",
"insight": "Your access score of 65 sits in the typical SaaS / Tech range (55–80). 42% of peers block at least one AI bot."
},
"recommendations": [
{
"id": "ip-protection",
"title": "Add llms.txt for retrieval-bot context",
"description": "ChatGPT-User and PerplexityBot can fetch your homepage but lack a curated context file. Add /llms.txt with key pages and definitions to improve citation quality.",
"priority": "medium"
}
],
"robotsSnippet": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: ClaudeBot\nDisallow: /\n"
}
}Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_parameters | Bad request — the payload failed validation. |
| 401 | api_key_missing · api_key_invalid · api_key_revoked · api_key_expired · insufficient_scope | The CL-API-Key is missing, malformed, revoked, expired, or lacks the required scope. |
| 429 | rate_limit_exceeded | Rate limit exceeded — retry with backoff. |
| 502 | bad_gateway | Upstream fetch failed (e.g. the target page could not be retrieved). |
Every error uses the shared { error: { code, message, status } } envelope; code is one of the values listed above.
{
"error": {
"code": "invalid_parameters",
"message": "Domain is required",
"status": 400
}
}Transient failures (429, 5xx) are safe to retry with exponential backoff.