✨ This endpoint analyzes a webpage and extracts key SEO information.
Make a POST request to /analyze-page with the following JSON body:
{
"url": "https://example.com",
"render_js": false,
"check_robots_txt": true,
"user_agent": "Googlebot"
}
🧩 render_js (optional, default false): set to true to render JavaScript in a headless browser before analysis. Use this for single-page apps whose content is loaded by JS; leave it off for faster analysis of server-rendered pages.
🕷️ check_robots_txt (optional, default true): fetch the site's robots.txt to compute the crawlability verdict. This makes one extra request — set it to false to skip it. user_agent (optional, default Googlebot) picks which bot's robots.txt rules to evaluate.
The API returns a JSON object containing:
indexable verdict combining HTTP status, meta robots, the X-Robots-Tag header and canonical — with the reasons behind itcrawlable verdict based on robots.txt (for the chosen bot) plus HTTP status
{
"title": "Example Domain",
"meta_description": "This is an example page",
"url": "https://example.com",
"body_text": "This domain is for use in illustrative examples...",
"heading_structure": {
"h1": ["Example Domain"],
"h2": ["Section 1", "Section 2"]
},
"internal_links": ["https://example.com/about"],
"external_links": ["https://external-site.com"],
"canonical": "https://example.com",
"meta_robots": "index,follow",
"http_status": 200,
"structured_data": {
"json_ld": [{"@type": "WebPage", "name": "Example Domain"}],
"json_ld_types": ["WebPage"],
"open_graph": {"og:title": "Example Domain"},
"twitter_card": {"twitter:card": "summary"},
"counts": {"json_ld": 1, "open_graph": 1, "twitter_card": 1}
},
"indexability": {
"indexable": true,
"reasons": ["No indexing blockers detected"],
"notes": [],
"signals": {"http_status": 200, "meta_robots": "index,follow", "noindex": false}
},
"crawlability": {
"crawlable": true,
"verdict": "allowed",
"reasons": ["No crawl blockers detected"],
"signals": {"checked_user_agent": "Googlebot", "robots_txt_found": true}
}
}
Errors use a consistent envelope: {"error": {"code": "...", "message": "...", "details": "..."}}
400: Missing/invalid URL, non-JSON body, or invalid options429: Rate limit exceeded4xx/5xx: Upstream fetch failure (status mirrors the crawler)