AI citability Beta
Scores how likely an AI answer engine — ChatGPT, Perplexity, Google AI Overviews — is to quote a piece of content, across seven weighted dimensions. Use GET to score a live URL, or POST to score an unpublished draft you have not shipped anywhere yet, so you can fix it before it goes live.
engine.aiUsed is always false and every dimensions[].aiScore is null. The AI-blended judgement (quotable-claim extraction, FAQ suggestions, missing entities) is an in-app feature, so quotableClaims, faqSuggestions, missingEntities and directAnswer come back empty here.The seven dimensions are answerability, quotability, structure, structuredData, authority, semanticCoverage and freshness. Each is weighted, scored and given a pass/warn/fail status; together they produce an overall 0–100 score, an A–F grade, a measured snapshot of the content, and a severity-ranked list of fixes.
Authentication
Send your API key as an X-API-Key header, or as a key query parameter. Available on every plan, including Free — plans differ only in requests per day. This call costs one request against your daily quota, which is shared across every key on the account. See Authentication.
Score a live URL
| Name | Type | Description |
|---|---|---|
url required | string | The page to score. |
topic optional | string | The question or topic to judge the content against. Truncated at 255 characters. |
key optional | string | Your API key, if not sent as the X-API-Key header. |
Response
- {
- "score": 51, "grade": "D",
- "summary": "This content scores 51/100 (D) for AI citability. …",
- "topic": "how to brew coffee", "title": "Coffee Brewing Guide",
- "url": "https://example.com/guide", "inputType": "url",
- "dimensions": [{ "key": "answerability", "label": "Answerability", "weight": 3,
- "score": 55, "status": "warn", "rationale": "",
- "detScore": 55, "aiScore": null }],
- "snapshot": { "wordCount": 1240, "paragraphs": 18, "avgParaWords": 62,
- "headings": 9, "questionHeadings": 3, "hasH1": true,
- "lists": 2, "listItems": 11, "tables": 0, "images": 4,
- "statDensity": 1.8, "avgSentenceLen": 19, "hasTldr": false,
- "schemaTypes": ["Article"], "schemaBlocks": [],
- "hasAuthor": true, "hasDate": true, "maxYear": 2026,
- "outboundCitations": 2, "internalLinks": 14,
- "metaTitle": "…", "metaDescription": "…" },
- "directAnswer": null, "quotableClaims": [], "missingEntities": [],
- "fixes": [{ "severity": "high", "dimension": "structuredData",
- "title": "Add FAQPage schema", "why": "…", "fix": "…",
- "example": "", "source": "rule" }],
- "faqSuggestions": [], "schemaSuggestions": ["FAQPage"],
- "engine": { "aiUsed": false, "fetchedVia": "direct", "statusCode": 200 }
- }
Score an unpublished draft
Send the draft as JSON. No URL is involved, so there is no fetch and no SSRF check. Raw text, light Markdown (headings, lists, paragraphs) and HTML are all accepted.
| Body field | Type | Description |
|---|---|---|
text required | string | The draft. Minimum 30 words. |
topic optional | string | Target topic or question. Truncated at 255 characters. |
The response has the same shape as the GET form, with inputType: "text" and url: null.
- { "score": 36, "grade": "F", "inputType": "text", "url": null,
- "dimensions": [ /* 7 entries */ ],
- "fixes": [{ "severity": "high", "title": "Add a TL;DR summary", "…": "…" }],
- "engine": { "aiUsed": false, "fetchedVia": null, "statusCode": null } }
Response fields
| Field | Type | Description |
|---|---|---|
score / grade | integer / string | Overall citability score (0–100) and A–F grade. |
dimensions[] | array | The seven dimensions, each with a weight, score, status and the deterministic detScore. aiScore is always null from the API. |
snapshot | object | What was measured — word and paragraph counts, headings and question headings, lists, tables, images, statistic density, schema types, author/date signals, citations and links. |
fixes[] | array | Severity-ranked fixes: severity, the dimension it improves, a title, the why and the fix. |
engine | object | aiUsed (always false), how the content was fetched and the upstream status code. |
Errors
| Status | When |
|---|---|
400 | POST only — the draft is under 30 words: { "error": "Draft is too short to analyse — send at least 30 words." } |
401 | Missing or invalid API key. |
403 | The URL is a private, loopback or cloud-metadata address and was blocked by SSRF protection. |
422 | GET only — the page was fetched but has fewer than 30 readable words to analyse. |
429 | Burst rate limit (60 req/10s per IP, 30 req/10s per key) or your daily quota. See Rate limits. |
502 | GET only — the URL could not be fetched. |
503 | The citability engine is unavailable on this server. This check runs before authentication. |
Errors return { "error": "…" }; see Errors.