Audit a URL

GET /api/v1/audit

Fetch any public URL and get the most comprehensive free on-page SEO audit available in one API call — a 0–100 score, a grade, a prioritised list of issues, and the detail behind 100+ on-page checks. Alongside the standard signals (title, meta, headings, images, canonical, structured data, links and content) it also returns readability scores (Flesch, Flesch–Kincaid, Gunning Fog, SMOG and more), keyword density (top words and phrases), tech-stack detection (CMS, framework, analytics, CDN), schema.org validation (missing required/recommended fields), accessibility checks (unlabelled forms, ARIA landmarks, skip-nav), social profile links and RSS/Atom feeds, document/meta validity, deprecated/legacy markup, internationalisation (hreflang, x-default, AMP), render-blocking resource counts, text-to-HTML ratio, lorem-ipsum detection and SEO-friendly-URL analysis. Everything the on-site browser tool returns, plus more, in a single live request — JSON response, no crawl task to manage.

Query parameters

NameTypeDescription
url requiredstringThe page to audit. 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",
  3. "score": 68,
  4. "grade": "C",
  5. "issueCount": 7,
  6. "issues": ["Title tag is short (<30 chars)", "Missing meta description", "No favicon"],
  7. "checks": {
  8. "title": { "value": "Example Domain", "length": 14, "count": 1 },
  9. "metaDescription": { "value": "", "length": 0, "count": 0 },
  10. "headings": {
  11. "h1": ["Example Domain"], "h2": [],
  12. "h1Count": 1, "h2Count": 0, "h3Count": 0, "h4Count": 0, "h5Count": 0, "h6Count": 0
  13. },
  14. "images": {
  15. "count": 0, "missingAlt": 0, "missingTitle": 0,
  16. "withoutDimensions": 0, "withLazy": 0, "withoutLazy": 0
  17. },
  18. "canonical": { "value": "", "present": false },
  19. "openGraph": { "count": 0, "hasTitle": false, "hasImage": false },
  20. "structuredData": { "count": 0, "types": [] },
  21. "technical": { "lang": "en", "viewport": true, "charset": false, "robots": "", "noindex": false },
  22. "https": true,
  23. "links": {
  24. "internal": 0, "external": 1, "total": 1,
  25. "nofollowCount": 0, "nofollowRatio": 0, "emptyLinks": 0
  26. },
  27. "content": { "wordCount": 17 },
  28. "meta": {
  29. "doctype": true, "favicon": false, "charset": null, "generator": null, "author": null,
  30. "metaKeywords": [], "metaRefreshRedirect": false, "doctypeType": "HTML5"
  31. },
  32. "markup": {
  33. "deprecatedTags": {}, "deprecatedTagCount": 0,
  34. "hasFrames": false, "hasFlash": false, "iframeCount": 0
  35. },
  36. "i18n": { "hreflangCount": 0, "hreflangs": [], "hasXDefault": false, "amp": false },
  37. "social": { "openGraphCount": 0, "twitterCardCount": 0, "hasTwitterCard": false },
  38. "performanceHints": {
  39. "renderBlockingScripts": 0, "renderBlockingStylesheets": 0,
  40. "inlineStyleTags": 1, "inlineScriptTags": 0
  41. },
  42. "url": { "seoFriendly": true, "issues": [] },
  43. "textToHtmlRatio": 24,
  44. "readability": {
  45. "fleschReadingEase": 14, "level": "Very Difficult", "fleschKincaidGrade": 13.4,
  46. "automatedReadabilityIndex": 12.5, "colemanLiauIndex": 17.7, "gunningFog": 17.5,
  47. "smogIndex": 13, "sentenceCount": 2, "avgWordsPerSentence": 8.5, "avgSyllablesPerWord": 2.2
  48. },
  49. "files": { "cssFiles": 0, "jsFiles": 0, "inlineScripts": 0 },
  50. "accessibility": {
  51. "formsWithoutLabels": 0, "imagesInLinksWithoutAlt": 0,
  52. "hasSkipNav": false, "ariaLandmarks": 0
  53. },
  54. "socialLinks": [
  55. // { "name": "twitter", "url": "https://twitter.com/example" }, …
  56. ],
  57. "feeds": [
  58. // { "type": "rss", "href": "https://example.com/feed", "title": "Example Feed" }, …
  59. ],
  60. "techStack": [
  61. // { "name": "WordPress", "category": "cms" }, { "name": "Google Analytics", "category": "analytics" }, …
  62. ],
  63. "loremIpsum": { "found": false, "count": 0, "inMeta": false },
  64. "schemaValidation": [
  65. // { "type": "Product", "errors": ["missing required field: name"], "warnings": ["recommended: brand"] }, …
  66. ],
  67. "keywords": {
  68. "totalWords": 12,
  69. "top": [
  70. { "word": "use", "count": 2, "density": 16.7 },
  71. { "word": "example", "count": 1, "density": 8.3 }
  72. // …
  73. ],
  74. "phrases": [
  75. // { "phrase": "illustrative examples", "count": 2 }, …
  76. ]
  77. }
  78. },
  79. "usage": { "used": 7, "dailyLimit": 100, "tier": "free" }
  80. }

Response fields

Every signal the RankNibbler on-page checker computes is returned — nothing trimmed. The checks object groups them as follows:

FieldTypeDescription
score / gradeinteger / stringOverall on-page score (0–100) and letter grade (A–F).
issuesstring[]Human-readable issues, ordered by impact.
checks.title / metaDescriptionobjectValue, length and tag count.
checks.headingsobjectH1 text plus H1/H2/H3 counts.
checks.imagesobjectTotal, missing alt text, missing title, missing width/height dimensions, and lazy-loaded vs non-lazy counts.
checks.canonicalobjectCanonical URL, presence and whether it's self-referencing.
checks.openGraph / twitterCardobjectSocial meta coverage.
checks.structuredDataobjectJSON-LD block count and schema types.
checks.hreflangobjecthreflang annotations and target languages.
checks.technicalobjectLang, viewport, charset, robots, noindex, favicon, doctype.
checks.httpsbooleanWhether the page is served over HTTPS.
checks.linksobjectInternal, external and total link counts, plus nofollow count, nofollow ratio and empty (no-href/empty-anchor) link count.
checks.contentobjectOn-page word count.
checks.textToHtmlRationumberVisible-text to HTML ratio, as a percentage — a low ratio flags bloated markup.
checks.readabilityobjectReadability scores: Flesch Reading Ease and human level, Flesch–Kincaid grade, Automated Readability Index, Coleman–Liau, Gunning Fog, SMOG, plus sentence count and average words/syllables per sentence.
checks.keywordsobjectKeyword density: totalWords, top words (with count and density %) and multi-word phrases.
checks.filesobjectResource counts: external CSS files, external JS files and inline scripts.
checks.accessibilityobjectAccessibility checks: forms without labels, images-in-links without alt, skip-nav presence and ARIA landmark count.
checks.socialLinksarrayDetected social profile links — { name, url } per platform.
checks.feedsarrayDiscovered RSS/Atom feeds — { type, href, title }.
checks.techStackarrayDetected technologies — { name, category } across CMS, framework, analytics and CDN.
checks.schemaValidationarrayschema.org validation per JSON-LD type — { type, errors, warnings } listing missing required and recommended fields.
checks.loremIpsumobjectPlaceholder-text detection: whether lorem-ipsum was found, occurrence count, and whether it appears in meta tags.
checks.metaobjectDocument/meta validity: doctype presence, favicon, declared charset, generator tag, meta keywords, and meta-refresh redirects.
checks.markupobjectDeprecated/legacy markup: <font>/<center>/<marquee> and similar tag counts, plus frames, Flash and iframe usage.
checks.i18nobjectInternationalisation: hreflang annotation count and targets, x-default presence, and AMP detection.
checks.socialobjectSocial tag coverage: Open Graph tag count plus Twitter Card count and presence.
checks.performanceHintsobjectRender-blocking resource counts: blocking scripts and stylesheets, plus inline style and script tag counts.
checks.urlobjectSEO-friendly-URL analysis: whether the URL is clean and a list of any issues found.
usageobjectYour current daily usage and limit.

Only public URLs are supported — private/internal addresses are blocked (403). Errors return { "error": "…" }; see Errors.