Bulk website tech, SEO & AI-readiness audit (Apify, paid)
web_batch_auditBulk audit up to thousands of websites in one call to uncover tech stacks, SEO issues, security headers, AI-bot rules, sitemaps, and llms.txt, with per-site scores for lead enrichment or market scans.
Instructions
Bulk audit up to thousands of websites in one call via the Fairquery Apify Actor fairquery/website-tech-seo-ai-readiness: technologies, on-page SEO, security headers, robots.txt AI-bot rules, XML sitemap, llms.txt, seo_score and ai_readiness_score per site. WHEN TO USE: lists of 20+ sites (lead enrichment, portfolio/market scans) where you want server-side parallelism and a dataset. For one or a few sites prefer the free tools: web_quick_check, web_seo_audit, web_ai_crawler_access, web_tech_stack, web_sitemap_info, web_security_headers. Rows can be stored and later diffed with web_compare_snapshots. BEHAVIOR: runs the Actor via the Apify API (run-sync), a few polite GET requests per site, respects robots.txt by default, no JS rendering. Requires APIFY_TOKEN (never logged). Typical 2-10 s per site, parallel. COST: paid (billed to your Apify account, pay-per-event): $0.00005 per run + $0.0015 per site row; error rows are free. 50 sites ~ $0.08. RETURNS: one "site" row per unique URL (a snapshot web_compare_snapshots accepts) or free "error" rows: code (INPUT_EMPTY, INVALID_URL, MAX_SITES_EXCEEDED, ROBOTS_DISALLOWED, FETCH_FAILED, HTTP_ERROR, BLOCKED_OR_RATE_LIMITED), message, retryable, input. Tool-level errors: APIFY_TOKEN_MISSING, APIFY_ACTOR_RUN_FAILED. WHEN NOT TO USE: for 1-20 sites or interactive questions use the free tools above (same checks). PARAMETERS: urls: bare domains use https, entries are deduped, and each unique URL is one billed site row; invalid, robots-disallowed or unreachable entries become free error rows. maxSites (default 500) caps unique URLs per run and is therefore your spend cap; extras get one free MAX_SITES_EXCEEDED row. The check* flags only remove work and fields, never change the price: checkRobots=false sets ai_bots / robots_txt_found to null, checkSitemap=false sitemap_*, checkLlmsTxt=false llms_txt_*; MISSING_ROBOTS_TXT / MISSING_SITEMAP issues are then not raised, so seo_score is not comparable across different flag settings. respectRobotsTxt is independent of checkRobots: robots.txt is still fetched when it is true, and a disallowed page yields a free ROBOTS_DISALLOWED row instead of an audit; set false only for sites you own or may audit. EXAMPLE: {"urls":["vercel.com","netlify.com"],"checkLlmsTxt":false} -> {count:2, items:[{type:"site", domain:"vercel.com", seo_score:..., ...}, ...]}
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Required. 1-5000 domains or http(s) URLs; bare domains use https; one billed row per unique URL. Example: ["vercel.com","https://www.python.org/about/"] | |
| maxSites | No | Optional integer 1-10000, default 500. Safety/spend cap on unique URLs per run; extras produce one free MAX_SITES_EXCEEDED error row. Example: 100 | |
| checkRobots | No | Optional boolean, default true. Fetch robots.txt and report allowed/partial/blocked per AI bot; false = ai_bots null | |
| checkLlmsTxt | No | Optional boolean, default true. Check /llms.txt and /llms-full.txt; false = llms_txt fields null | |
| checkSitemap | No | Optional boolean, default true. Find the XML sitemap and count its URLs; false = sitemap fields null | |
| respectRobotsTxt | No | Optional boolean, default true (recommended). Skip pages robots.txt disallows for generic crawlers, emitting a free ROBOTS_DISALLOWED row |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| count | Yes | Number of rows returned | |
| items | Yes | Result rows; each has a "type" field (data rows or machine-readable "error" rows) |