Page metrics Beta
One request, the whole picture for a single page: the SEO score and the accessibility score and the security-header grade and AI-search signals and an indexability verdict. This runs the identical engine as the RankNibbler site crawler, so a single-page call and a crawled page report the same numbers.
The HTML is fetched and parsed once and shared across all five analysers, so the whole roll-up costs one fetch and one request. This is a static analysis of the served HTML — no browser is involved.
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.
Query parameters
| Name | Type | Description |
|---|---|---|
url required | string | The page to analyse. Bare domains (example.com) default to https://. |
key optional | string | Your API key, if not sent as the X-API-Key header. |
Request
Response
- {
- "url": "https://example.com", "statusCode": 200, "responseTimeMs": null,
- "htmlBytes": 1256, "contentType": "text/html", "depth": 0,
- "contentHash": "-3841029384710293847",
- "score": 65, "grade": "C", "issueCount": 7,
- "title": "Example Domain", "metaDescription": null, "h1": "Example Domain",
- "wordCount": 412, "internalLinks": 22, "externalLinks": 9,
- "imagesCount": 4, "imagesMissingAlt": 1,
- "schemaCount": 2, "schemaErrors": 0, "ogCount": 0,
- "noindex": false, "https": true,
- "a11yScore": 91, "a11yGrade": "A", "secGrade": "B", "secScore": 72,
- "issues": ["Meta description is missing"],
- "indexability": { "indexable": true, "reason": null, "metaNoindex": false,
- "xRobotsTag": null, "canonicalSelf": true },
- "titlePixels": 126, "metaDescriptionPixels": 0,
- "metrics": {
- "seo": { "score": 65, "grade": "C", "title": {}, "titlePixels": 126,
- "metaDescription": {}, "headings": {}, "images": {}, "links": {},
- "canonical": {}, "technical": {}, "content": {}, "textToHtmlRatio": 18.2,
- "openGraph": {}, "social": {}, "socialLinks": [], "feeds": [],
- "structuredData": {}, "schemaValidation": [], "i18n": {}, "markup": {} },
- "accessibility": { "score": 91, "grade": "A", "summary": {} },
- "security": { "grade": "B", "score": 72, "https": true, "headers": {} },
- "aiSearch": { },
- "indexability": { "indexable": true, "reason": null },
- "fetch": { "statusCode": 200, "responseTimeMs": null },
- "extra": { },
- "full": { }
- },
- "usage": { "used": 1, "dailyLimit": 100, "tier": "free" }
- }
Response fields
| Field | Type | Description |
|---|---|---|
score / grade | integer / string | On-page SEO score (0–100) and letter grade. |
a11yScore / a11yGrade | integer / string | Static WCAG/axe accessibility score and grade. |
secScore / secGrade | integer / string | Security-header score and A–F grade. |
indexability | object | Whether the page is indexable and, if not, the reason — meta robots, X-Robots-Tag and canonical self-reference. |
contentHash | string | A 64-bit SimHash of the visible text, returned as a decimal string. Compare two pages by Hamming distance for near-duplicate detection. |
responseTimeMs | null | Always null on this endpoint — use Page timing for load timing. |
metrics | object | The full per-analyser breakdown: seo, accessibility, security, aiSearch, indexability, fetch. |
usage | object | Your current daily usage and limit. |
Errors
| Status | When |
|---|---|
401 | Missing or invalid API key. |
403 | The URL is a private, loopback or cloud-metadata address and was blocked by SSRF protection. |
429 | Burst rate limit (60 req/10s per IP, 30 req/10s per key) or your daily quota. See Rate limits. |
502 | The target URL could not be fetched. |
503 | The page-analysis engine is unavailable on this server. This check runs before authentication, so an unauthenticated call can see a 503. |
Errors return { "error": "…" }; see Errors.