> ## 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.

# Site Readiness

> AI Readiness Score and robots.txt / llms.txt / sitemap.xml analysis

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.

<Note>
  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`.
</Note>

<ParamField header="Authorization" type="string" required>
  Bearer token. Example: `Bearer qw-api-xxx`
</ParamField>

### Path Parameters

<ParamField path="brandId" type="string" required>
  The unique identifier of the brand
</ParamField>

### 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

<ResponseField name="success" type="boolean">Indicates if the request was successful</ResponseField>

<ResponseField name="brand" type="object">`id`, `name`, `domain`</ResponseField>

<ResponseField name="analyzed" type="boolean">
  `false` when no analysis has been generated yet (all analysis fields are then `null`)
</ResponseField>

<ResponseField name="aiReadiness" type="object">
  <Expandable title="AI Readiness">
    <ResponseField name="score" type="number">AI Readiness Score (0-100)</ResponseField>
    <ResponseField name="issuesCount" type="number">Number of detected issues</ResponseField>
    <ResponseField name="optimizationsCount" type="number">Number of suggested optimizations</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="robotsUrl" type="string">URL checked for robots.txt</ResponseField>
<ResponseField name="llmsUrl" type="string">URL checked for llms.txt</ResponseField>
<ResponseField name="sitemapUrl" type="string">URL checked for sitemap.xml</ResponseField>

<ResponseField name="robotsAnalysis" type="object">
  <Expandable title="File analysis">
    <ResponseField name="status" type="string">`present`, `missing`, `error` or `invalid`</ResponseField>
    <ResponseField name="finalUrl" type="string">Final URL after redirects</ResponseField>
    <ResponseField name="error" type="string">Error message when status is `error`</ResponseField>
    <ResponseField name="content" type="string">Fetched file content</ResponseField>
    <ResponseField name="crawlers" type="object">Per-crawler `{ status: "Allowed" | "Disallowed", reason }` map (robots.txt only)</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="llmsAnalysis" type="object">Same shape as `robotsAnalysis` (no `crawlers`)</ResponseField>
<ResponseField name="sitemapAnalysis" type="object">Same shape as `robotsAnalysis` (no `crawlers`)</ResponseField>

<ResponseField name="lastAnalyzedAt" type="string">Last analysis timestamp (ISO 8601) or `null`</ResponseField>
<ResponseField name="generatedLlmsTxt" type="string">Generated llms.txt template, or `null` if never generated</ResponseField>

### Example Request

```bash theme={null}
curl -X GET "https://www.qwairy.co/api/v1/brands/cm1234567890abcdef/technical-analysis" \
  -H "Authorization: Bearer qw-api-your-token-here"
```

### Example Response

```json theme={null}
{
  "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
}
```
