Try the RankNibbler SEO API

Page metrics Beta

GET /api/v1/page-metrics

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.

Beta. This endpoint is new: it is live and safe to call on every plan, but its response shape may still change while we take feedback. Nothing here is scheduled for removal — if you depend on a particular field, tell us and we will keep it stable for you.

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

NameTypeDescription
url requiredstringThe page to analyse. Bare domains (example.com) default to https://.
key optionalstringYour API key, if not sent as the X-API-Key header.

Request

Response

200 · application/json
  1. {
  2. "url": "https://example.com", "statusCode": 200, "responseTimeMs": null,
  3. "htmlBytes": 1256, "contentType": "text/html", "depth": 0,
  4. "contentHash": "-3841029384710293847",
  5. "score": 65, "grade": "C", "issueCount": 7,
  6. "title": "Example Domain", "metaDescription": null, "h1": "Example Domain",
  7. "wordCount": 412, "internalLinks": 22, "externalLinks": 9,
  8. "imagesCount": 4, "imagesMissingAlt": 1,
  9. "schemaCount": 2, "schemaErrors": 0, "ogCount": 0,
  10. "noindex": false, "https": true,
  11. "a11yScore": 91, "a11yGrade": "A", "secGrade": "B", "secScore": 72,
  12. "issues": ["Meta description is missing"],
  13. "indexability": { "indexable": true, "reason": null, "metaNoindex": false,
  14. "xRobotsTag": null, "canonicalSelf": true },
  15. "titlePixels": 126, "metaDescriptionPixels": 0,
  16. "metrics": {
  17. "seo": { "score": 65, "grade": "C", "title": {}, "titlePixels": 126,
  18. "metaDescription": {}, "headings": {}, "images": {}, "links": {},
  19. "canonical": {}, "technical": {}, "content": {}, "textToHtmlRatio": 18.2,
  20. "openGraph": {}, "social": {}, "socialLinks": [], "feeds": [],
  21. "structuredData": {}, "schemaValidation": [], "i18n": {}, "markup": {} },
  22. "accessibility": { "score": 91, "grade": "A", "summary": {} },
  23. "security": { "grade": "B", "score": 72, "https": true, "headers": {} },
  24. "aiSearch": { },
  25. "indexability": { "indexable": true, "reason": null },
  26. "fetch": { "statusCode": 200, "responseTimeMs": null },
  27. "extra": { },
  28. "full": { }
  29. },
  30. "usage": { "used": 1, "dailyLimit": 100, "tier": "free" }
  31. }

Response fields

FieldTypeDescription
score / gradeinteger / stringOn-page SEO score (0–100) and letter grade.
a11yScore / a11yGradeinteger / stringStatic WCAG/axe accessibility score and grade.
secScore / secGradeinteger / stringSecurity-header score and A–F grade.
indexabilityobjectWhether the page is indexable and, if not, the reason — meta robots, X-Robots-Tag and canonical self-reference.
contentHashstringA 64-bit SimHash of the visible text, returned as a decimal string. Compare two pages by Hamming distance for near-duplicate detection.
responseTimeMsnullAlways null on this endpoint — use Page timing for load timing.
metricsobjectThe full per-analyser breakdown: seo, accessibility, security, aiSearch, indexability, fetch.
usageobjectYour current daily usage and limit.

Errors

StatusWhen
401Missing or invalid API key.
403The URL is a private, loopback or cloud-metadata address and was blocked by SSRF protection.
429Burst rate limit (60 req/10s per IP, 30 req/10s per key) or your daily quota. See Rate limits.
502The target URL could not be fetched.
503The 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.