Skip to main content
GET
/
api
/
v1
/
brands
/
{brandId}
/
technical-analysis
Site Readiness
curl --request GET \
  --url https://api.example.com/api/v1/brands/{brandId}/technical-analysis \
  --header 'Authorization: <authorization>'
{
  "success": true,
  "brand": {},
  "analyzed": true,
  "aiReadiness": {
    "score": 123,
    "issuesCount": 123,
    "optimizationsCount": 123
  },
  "robotsUrl": "<string>",
  "llmsUrl": "<string>",
  "sitemapUrl": "<string>",
  "robotsAnalysis": {
    "status": "<string>",
    "finalUrl": "<string>",
    "error": "<string>",
    "content": "<string>",
    "crawlers": {}
  },
  "llmsAnalysis": {},
  "sitemapAnalysis": {},
  "lastAnalyzedAt": "<string>",
  "generatedLlmsTxt": "<string>"
}

Documentation Index

Fetch the complete documentation index at: https://docs.qwairy.co/llms.txt

Use this file to discover all available pages before exploring further.

Returns the stored technical analysis for a brand - the robots.txt, llms.txt and sitemap.xml checks - plus the AI Readiness Score (0-100), the exact value shown on the dashboard Optimize > AI Readiness tab. This endpoint is read-only: it serves the last stored analysis, it does not trigger a fresh crawl.
The analysis is generated the first time a brand’s AI Readiness tab is opened in the app. If it has never been opened, analyzed is false and the analysis fields are null.
Authorization
string
required
Bearer token. Example: Bearer qw-api-xxx

Path Parameters

brandId
string
required
The unique identifier of the brand

AI Readiness Score formula

Out of 100:
  • robots.txt present: +20
  • crawlers allowed: +round((allowed / total) × 40) over GPTBot, ChatGPT-User, Claude-Web, ClaudeBot, Google-Extended, PerplexityBot. Crawlers are only parsed when robots.txt is present, so a missing robots.txt scores 0 here.
  • llms.txt present: +20
  • sitemap.xml present: +20
A missing or invalid robots.txt therefore caps the score at 40.

Response

success
boolean
Indicates if the request was successful
brand
object
id, name, domain
analyzed
boolean
false when no analysis has been generated yet (all analysis fields are then null)
aiReadiness
object
robotsUrl
string
URL checked for robots.txt
llmsUrl
string
URL checked for llms.txt
sitemapUrl
string
URL checked for sitemap.xml
robotsAnalysis
object
llmsAnalysis
object
Same shape as robotsAnalysis (no crawlers)
sitemapAnalysis
object
Same shape as robotsAnalysis (no crawlers)
lastAnalyzedAt
string
Last analysis timestamp (ISO 8601) or null
generatedLlmsTxt
string
Generated llms.txt template, or null if never generated

Example Request

curl -X GET "https://www.qwairy.co/api/v1/brands/cm1234567890abcdef/technical-analysis" \
  -H "Authorization: Bearer qw-api-your-token-here"

Example Response

{
  "success": true,
  "brand": { "id": "cm1234567890abcdef", "name": "My Brand", "domain": "mybrand.com" },
  "analyzed": true,
  "aiReadiness": {
    "score": 80,
    "issuesCount": 0,
    "optimizationsCount": 1
  },
  "robotsUrl": "https://mybrand.com/robots.txt",
  "llmsUrl": "https://mybrand.com/llms.txt",
  "sitemapUrl": "https://mybrand.com/sitemap.xml",
  "robotsAnalysis": {
    "status": "present",
    "finalUrl": "https://mybrand.com/robots.txt",
    "crawlers": {
      "GPTBot": { "status": "Allowed", "reason": "No matching disallow rule" },
      "ClaudeBot": { "status": "Allowed", "reason": "No matching disallow rule" }
    }
  },
  "llmsAnalysis": { "status": "missing" },
  "sitemapAnalysis": { "status": "present", "finalUrl": "https://mybrand.com/sitemap.xml" },
  "lastAnalyzedAt": "2026-05-12T08:30:00.000Z",
  "generatedLlmsTxt": null
}