# SEO Site Audit: Website Crawler and Lighthouse

> SEO Site Audit is an Apify actor (API) by CheapAPI Labs. Crawls a site and reports status codes, titles, broken links, duplicates, speed and Lighthouse scores. It costs $6.90 per 1,000 audited pages on the Apify Free plan and $3.40 on Gold, plus $0.002 per website, billed through your Apify account with no API key. Compared with the most used SEO audit crawler on Apify Store (about 670 users): 1,000 pages of one website costs $6.90 on Free and $3.40 on Gold here and $40 and $30 there (Apify Store listing prices, checked September 2026). Apify platform usage is billed on top here.

- Page: https://cheapapilabs.com/actors/seo-site-audit/
- Run on Apify: https://apify.com/cheapapi/seo-site-audit
- Publisher: CheapAPI Labs (Apify username cheapapi)
- Main price: $6.90 per 1,000 audited pages on Free, $3.40 on Gold
- Our prices updated: 2026-10-30

## Prices per event (USD)

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| Audited page | $0.0069 | $0.0055 | $0.0045 | $0.0034 |
| Website summary | $0.002 | $0.002 | $0.002 | $0.002 |
| JavaScript rendering (add on) | $0.002 | $0.002 | $0.002 | $0.002 |
| Full browser rendering with Core Web Vitals (add on) | $0.0065 | $0.0065 | $0.0065 | $0.0065 |
| Lighthouse audit | $0.07 | $0.021 | $0.014 | $0.007 |
| Crawled page not delivered | $0.0009 | $0.0009 | $0.0009 | $0.0009 |
| Website crawled without delivered pages | $0.0003 | $0.0003 | $0.0003 | $0.0003 |
| Lighthouse test without result | $0.0065 | $0.0065 | $0.0065 | $0.0065 |

Platinum and Diamond pay the Gold price. Apify platform usage: billed separately by Apify.

## Call it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/cheapapi~seo-site-audit/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://books.toscrape.com"}],"maxPagesPerSite":20,"runLighthouse":false,"crawlSpeed":"normal"}'
```

## Example output row

```json
{
  "website": "https://example-shop.com",
  "url": "https://example-shop.com/",
  "pageType": "html",
  "statusCode": 200,
  "redirectUrl": null,
  "onpageScore": 97.07,
  "issuesCount": 4,
  "issues": [
    "Links from HTTPS to HTTP pages",
    "Meta keywords not relevant to page content",
    "Low text-to-HTML ratio",
    "Images without alt text"
  ],
  "issueCodes": [
    "httpsToHttpLinks",
    "irrelevantMetaKeywords",
    "lowContentRate",
    "noImageAlt"
  ],
  "issueDetails": [
    {
      "code": "httpsToHttpLinks",
      "priority": "medium",
      "fixHint": "Change links on this HTTPS page that point to http:// URLs to their https:// versions."
    },
    {
      "code": "irrelevantMetaKeywords",
      "priority": "low",
      "fixHint": "Remove the meta keywords tag (search engines ignore it) or make it match the content."
    },
    {
      "code": "lowContentRate",
      "priority": "low",
      "fixHint": "Little visible text compared with HTML code. Add content or reduce inline code, scripts and markup."
    },
    {
      "code": "noImageAlt",
  …
}
```

## Fields

One row per crawled page (HTML pages, broken URLs and redirects) in the dataset:

| Field | Type | Example |
|---|---|---|
| `id` | string | `3f9c1a0b7d2e4c61` (stable across runs: hash of website + URL) |
| `url` | string | `https://example-shop.com/` |
| `statusCode` | number | `200` |
| `pageType` | string | `html` / `broken` / `redirect` |
| `redirectUrl` | string | `https://example-shop.com/` (for redirects) |
| `onpageScore` | number (0 to 100) | `97.07` |
| `issuesCount`, `issues`, `issueCodes` | number, array | `4`, `["Images without alt text", …]`, `["noImageAlt", …]` |
| `issueDetails` | array | `[{"code": "noImageAlt", "priority": "medium", "fixHint": "Add descriptive alt text…"}]`, one entry per issue code, same order |
| `title`, `titleLength`, `titleMissing`, `titleTooShort`, `titleTooLong`, `duplicateTitle` | string, number, boolean | `"Example Shop – Running Shoes…"`, `55`, `false` |
| `metaDescription`, `metaDescriptionLength`, `metaDescriptionMissing`, `duplicateMetaDescription` | string, number, boolean | `"Shop running shoes…"`, `123` |
| `h1`, `h1Count`, `h1Missing`, `h1List`, `h2Count`, `h3Count` | string, number, boolean, array | `"Running shoes for every runner"`, `1` |
| `wordCount`, `textToHtmlRatio`, `readabilityScore` | number | `1165`, `0.047`, `31.26` |
| `canonicalUrl`, `canonicalIsSelf` | string, boolean | `https://example-shop.com/`, `true` |
| `indexable`, `nonIndexableReason` | boolean, string | `false`, `robots_txt` / `meta_tag` / `redirect` / `canonicalized_to_other_url` |
| `duplicateContent` | boolean | `false` |
| `hasBrokenLinks`, `brokenLinksCount`, `brokenLinks` | boolean, number, array | `true`, `2`, `[{"url": "…/missing", "statusCode": 404, "anchorText": "Old offer"}]` |
| `hasBrokenResources` | boolean | broken images, scripts or CSS |
| `clickDepth`, `internalLinksCount`, `externalLinksCount`, `inboundLinksCount` | number | `0`, `130`, `33`, `11` |
| `imagesCount`, `imagesWithoutAlt`, `scriptsCount`, `renderBlockingScripts` | number, boolean | `58`, `true`, `48`, `12` |
| `pageSizeBytes`, `totalTransferSizeBytes`, `domSize` | number | `148362`, `2184530`, `162918` |
| `loadTimeMs`, `timeToFirstByteMs`, `timeToInteractiveMs`, `largestContentfulPaintMs`, `cumulativeLayoutShift` | number (Core Web Vitals: null without Full browser rendering) | `486`, `112`, `512` |
| `isHttps`, `hasStructuredData`, `socialTags`, `misspelledWords`, `deprecatedTags` | mixed | `true`, `{"og:type": "website"}` |
| `lighthousePerformanceScore`, `lighthouseAccessibilityScore`, `lighthouseBestPracticesScore`, `lighthouseSeoScore`, `lighthouse` | number, object | `45`, `75`, `54`, `85` (when Lighthouse is on) |
| `checks` | object | all 60+ true/false checks |
| `changedSinceLastRun`, `changeType` | boolean, string | `true`, `new` / `changed` / `unchanged` / `baseline` (first run) |
| `changedFields`, `previousOnpageScore`, `previousStatusCode` | array, number, number | `["title", "onpageScore"]`, `92.5`, `200` |
| `website`, `fetchedAt`, `scrapedAt` | string | context |




**Full field reference, all 99 fields of a page row</b> (generated from the dataset schema)**


| # | Field | Type | Description |
|---|---|---|---|
| 1 | `id` * | string | Stable row ID: first 16 hex characters of SHA-256 of website + page URL. Same page of the same website gets the same ID in every run. |
| 2 | `website` * | string | The website exactly as you entered it in the input. |
| 3 | `url` * | string | Crawled page URL. |
| 4 | `pageType` | string or null | "html" (normal page), "broken" (4xx/5xx or unreachable) or "redirect" (3xx). |
| 5 | `statusCode` | number or null | HTTP status code of the page. |
| 6 | `redirectUrl` | string or null | Redirect target (Location header) for redirect pages. |
| 7 | `onpageScore` | number or null | Onpage score 0 to 100 computed from the page checks (100 = no issues). |
| 8 | `issuesCount` * | number | Number of issues found on the page. |
| 9 | `issues` * | array | Issues in plain English, e.g. "Images without alt text". |
| 10 | `issueCodes` | array | Machine readable issue codes matching "issues", e.g. "noImageAlt". |
| 11 | `issueDetails` | array | One entry per issue code, in the same order: {code, priority (high / medium / low), fixHint (one sentence fix suggestion)}. |
| 12 | `title` | string or null | Content of the <title> tag. |
| 13 | `titleLength` | number or null | Title length in characters. |
| 14 | `titleMissing` | boolean or null | True if the page has no title (HTML pages only). |
| 15 | `titleTooShort` | boolean or null | True if the title is shorter than "Title too short below" (default 30). |
| 16 | `titleTooLong` | boolean or null | True if the title is longer than "Title too long above" (default 65). |
| 17 | `duplicateTitle` | boolean or null | True if another crawled page of the website has the same title. |
| 18 | `metaDescription` | string or null | Content of the meta description tag. |
| 19 | `metaDescriptionLength` | number or null | Meta description length in characters. |
| 20 | `metaDescriptionMissing` | boolean or null | True if the page has no meta description (HTML pages only). |
| 21 | `duplicateMetaDescription` | boolean or null | True if another crawled page has the same meta description. |
| 22 | `h1` | string or null | First H1 heading on the page. |
| 23 | `h1Count` | number or null | Number of H1 headings. |
| 24 | `h1Missing` | boolean or null | True if the page has no H1 (HTML pages only). |
| 25 | `h1List` | array or null | All H1 headings on the page. |
| 26 | `h2Count` | number or null | Number of H2 headings. |
| 27 | `h3Count` | number or null | Number of H3 headings. |
| 28 | `wordCount` | number or null | Words of visible text on the page. |
| 29 | `textToHtmlRatio` | number or null | Visible text size divided by HTML size (0 to 1). |
| 30 | `readabilityScore` | number or null | Flesch Kincaid readability index of the page text. |
| 31 | `titleRelevance` | number or null | How well the title matches the page content (0 to 1). |
| 32 | `descriptionRelevance` | number or null | How well the meta description matches the page content (0 to 1). |
| 33 | `canonicalUrl` | string or null | URL in the canonical link tag. |
| 34 | `canonicalIsSelf` | boolean or null | True if the canonical URL points to the page itself. |
| 35 | `indexable` | boolean or null | True if search engines may index the page. |
| 36 | `nonIndexableReason` | string or null | Why the page is not indexable, e.g. robots_txt, meta_tag, redirect, canonicalized_to_other_url, error_status_code. |
| 37 | `metaRobotsFollow` | boolean or null | False if the meta robots tag says nofollow. |
| 38 | `duplicateContent` | boolean or null | True if another crawled page has (nearly) the same content. |
| 39 | `hasBrokenLinks` | boolean or null | True if the page links to a broken URL. |
| 40 | `brokenLinksCount` | number | Number of broken links listed for the page. |
| 41 | `brokenLinks` | array or null | Broken link targets (URL, status code, anchor text), up to 100 per page. |
| 42 | `hasBrokenResources` | boolean or null | True if an image, script or stylesheet on the page is broken. |
| 43 | `clickDepth` | number or null | Clicks from the start page (0 = start page). |
| 44 | `internalLinksCount` | number or null | Links to pages of the same website. |
| 45 | `externalLinksCount` | number or null | Links to other websites. |
| 46 | `inboundLinksCount` | number or null | Links from other crawled pages to this page. |
| 47 | `imagesCount` | number or null | Number of images on the page. |
| 48 | `imagesSizeBytes` | number or null | Total size of the page images in bytes. |
| 49 | `imagesWithoutAlt` | boolean or null | True if at least one image has no alt text. |
| 50 | `scriptsCount` | number or null | Number of scripts on the page. |
| 51 | `stylesheetsCount` | number or null | Number of stylesheets on the page. |
| 52 | `renderBlockingScripts` | number or null | Number of render blocking scripts. |
| 53 | `renderBlockingStylesheets` | number or null | Number of render blocking stylesheets. |
| 54 | `pageSizeBytes` | number or null | HTML size in bytes (uncompressed). |
| 55 | `compressedSizeBytes` | number or null | HTML size in bytes as transferred (compressed). |
| 56 | `totalTransferSizeBytes` | number or null | Total transferred bytes including resources. |
| 57 | `domSize` | number or null | Size of the rendered DOM. |
| 58 | `loadTimeMs` | number or null | Total page load time in ms. |
| 59 | `timeToFirstByteMs` | number or null | Time to first byte (server waiting time) in ms. |
| 60 | `downloadTimeMs` | number or null | HTML download time in ms. |
| 61 | `connectionTimeMs` | number or null | Connection time in ms. |
| 62 | `timeToInteractiveMs` | number or null | Time to interactive in ms. |
| 63 | `domCompleteMs` | number or null | Time until the DOM is complete in ms. |
| 64 | `largestContentfulPaintMs` | number or null | Largest Contentful Paint in ms (with Full browser rendering only). |
| 65 | `firstInputDelayMs` | number or null | First Input Delay in ms (with Full browser rendering only). |
| 66 | `cumulativeLayoutShift` | number or null | Cumulative Layout Shift (with Full browser rendering only). |
| 67 | `isHttps` | boolean or null | True if the page is served over HTTPS. |
| 68 | `hasStructuredData` | boolean or null | True if the page has schema.org / microdata markup. |
| 69 | `metaKeywords` | string or null | Content of the meta keywords tag. |
| 70 | `charset` | any | Character set of the page (code or name). |
| 71 | `generator` | string or null | Content of the meta generator tag (CMS). |
| 72 | `faviconUrl` | string or null | Favicon URL. |
| 73 | `socialTags` | object or null | Open Graph and Twitter Card tags as key/value pairs. |
| 74 | `misspelledWords` | array or null | Misspelled words (with "Check spelling" on). |
| 75 | `deprecatedTags` | array or null | Deprecated HTML tags used on the page. |
| 76 | `duplicateMetaTags` | array or null | Meta tags that appear more than once. |
| 77 | `contentEncoding` | string or null | Content Encoding header, e.g. gzip or br. |
| 78 | `mediaType` | string or null | Content Type media type, e.g. text/html. |
| 79 | `server` | string or null | Server header. |
| 80 | `cacheable` | boolean or null | True if the page may be cached. |
| 81 | `cacheTtlSeconds` | number or null | Cache lifetime in seconds. |
| 82 | `urlLength` | number or null | URL length in characters. |
| 83 | `lastModified` | object or null | Last modified dates from the HTTP header, sitemap and meta tag. |
| 84 | `customJsResult` | any | Result of your "Custom JavaScript" snippet. |
| 85 | `checks` | object or null | All 60+ page checks as true/false (with "Include all check results" on). |
| 86 | `lighthousePerformanceScore` | number or null | Lighthouse performance score 0 to 100 (Lighthouse pages only). |
| 87 | `lighthouseAccessibilityScore` | number or null | Lighthouse accessibility score 0 to 100. |
| 88 | `lighthouseBestPracticesScore` | number or null | Lighthouse best practices score 0 to 100. |
| 89 | `lighthouseSeoScore` | number or null | Lighthouse SEO score 0 to 100. |
| 90 | `lighthouse` | object or null | Lighthouse details: device, scores, FCP, LCP, TBT, CLS, Speed Index, TTI, server response time, failed audits, version. |
| 91 | `changedSinceLastRun` | boolean or null | True if the page is new or changed since the previous run (null on the first run). |
| 92 | `changeType` | string or null | new, changed, unchanged or baseline (first run). |
| 93 | `changedFields` | array | Which fields changed since the previous run, e.g. ["title", "onpageScore"]. |
| 94 | `previousOnpageScore` | number or null | Onpage score in the previous run. |
| 95 | `previousStatusCode` | number or null | Status code in the previous run. |
| 96 | `javascriptRendered` | boolean | True if the page was crawled with JavaScript rendering. |
| 97 | `browserRendered` | boolean | True if the page was crawled with full browser rendering. |
| 98 | `fetchedAt` | string or null | When the page was fetched (ISO 8601). |
| 99 | `scrapedAt` * | string | When this run started (ISO 8601). |

\* always present and never null. Other fields are `null` (or an empty array) when the value does not apply to the page, e.g. Lighthouse fields on pages without a Lighthouse audit. `checks` is left out when **Include all check results** is off.




**Issue priorities and fix hints:** `issueDetails` gives every issue code a `priority`, `high` (hurts indexing, rankings or visitors directly, e.g. broken pages, `notIndexable`, duplicate content), `medium` (worth fixing soon, e.g. missing meta description, slow server) or `low` (minor, e.g. missing image title attributes), and a one sentence `fixHint`. They come from a fixed table per issue code, so they are free and consistent between runs; sort by priority to build a to do list.

That is 99 fields per page, all declared in the dataset schema (see the reference above). Plus a **site summary** per website in the key value store record `SITE_SUMMARY`: overall onpage score, pages crawled, top issues with page counts, broken links/resources, duplicate titles/descriptions/content, not indexable pages, redirect loops, CMS, server, SSL validity/expiry, sitemap/robots.txt/HTTPS/www redirect/404 checks, and, with change monitoring, new/changed/unchanged page counts and the previous run's onpage score.

## Compared with alternatives

A typical run: **1,000 pages of one website**. Prices are the per page charge × 1,000 on the Free and Gold plans (event fees only). For this Actor, Apify platform usage is billed separately by Apify (at the default 256 MB a small run typically uses about $0.001 to $0.005), on top of the price shown.

| | 1,000 pages (Free / Gold) | Crawls the whole site | Fields per page (as listed) | Broken link targets | Site wide duplicates | Lighthouse | JavaScript rendering | Change tracking |
|---|---|---|---|---|---|---|---|---|
| Most used SEO audit crawler (~670 users) | $40 / $30 | ✓ | ~40 (as listed) | ✓ | titles, headings | lab speed metrics | ✗ | ✗ |
| Most used SEO data extractor (~480 users) | $300 / $10 | ✗ (your URLs only) | 11 (as listed) | ✗ | ✗ | ✗ | ✓ | ✗ |
| Budget SEO audit crawler (~110 users) | $10 / $5 | ✓ | 28 (as listed) | ✗ | ✗ | ✗ | ✗ | ✗ |
| Low cost per page auditor (~190 users) | **$5 / $3** | optional | not stated (structured data focus) | ✗ | ✗ | ✗ | ✗ | ✗ |
| **This Actor** | $6.90 / $3.40 **plus platform usage** | ✓ | **99** + 60+ checks | ✓ (URL, status, anchor) | titles, descriptions, content | ✓ ($0.007 to $0.07 per URL) | ✓ (+$0.002 per page) | ✓ free |

The low cost per page auditor costs $1.90 (Free) / $0.40 (Gold) less per 1,000 pages. It checks structured data, social tags and headings of the URLs you give it; this Actor adds broken link targets, duplicate titles/descriptions/content across the site, indexability reasons, Lighthouse, JavaScript rendering, a site summary (sitemap, robots.txt, SSL, redirects) and free change tracking between runs. Our total includes the $0.002 website summary fee. Rival field counts are as listed on their Store pages, not independently verified.

**Cheaper still:** a very new crawler with about 4 users charges $0.50 per 1,000 pages (plus a small start fee and platform usage) for a basic audit, status, title/description, canonical, headings, word count, links, image alt gaps, indexability and structured data. If that is all you need, it costs less; it does not list broken link targets, site wide duplicates, Lighthouse, JavaScript rendering or change tracking.

**Lighthouse only?** If you just need Lighthouse / PageSpeed scores for URLs you already know, a PageSpeed API Actor (~90 users) is cheaper at about $0.002 per URL versus our $0.007 (Gold) – $0.07 (Free), and a free Lighthouse Actor (~200 users) charges only platform usage. Use this Actor when you also need the crawl, issues, broken links and duplicates.

Prices, user counts and feature lists from public Apify Store listings, checked September 2026.

### Not included

- **Keyword rankings and search volumes**, this Actor audits pages, not Google positions. Use [Domain SEO Analyzer](https://cheapapilabs.com/actors/domain-seo-analyzer/) for the keywords a domain ranks for, or [Keyword Research Tool](https://cheapapilabs.com/actors/keyword-research-tool/) for volumes and ideas.
- **Backlinks** (who links to the site), only links *on* the crawled pages are analysed. Use [Backlink Checker](https://cheapapilabs.com/actors/backlink-checker/).
- **Real user (field) Core Web Vitals**, Lighthouse and full browser rendering measure lab values from one test run, not visitor data.
- **Pages behind a login**, only publicly reachable pages are crawled.
- **Automatic fixes**, you get issues and data, not changes to your website.

## Not included

- **Keyword rankings and search volumes**, this Actor audits pages, not Google positions. Use [Domain SEO Analyzer](https://cheapapilabs.com/actors/domain-seo-analyzer/) for the keywords a domain ranks for, or [Keyword Research Tool](https://cheapapilabs.com/actors/keyword-research-tool/) for volumes and ideas.
- **Backlinks** (who links to the site), only links *on* the crawled pages are analysed. Use [Backlink Checker](https://cheapapilabs.com/actors/backlink-checker/).
- **Real user (field) Core Web Vitals**, Lighthouse and full browser rendering measure lab values from one test run, not visitor data.
- **Pages behind a login**, only publicly reachable pages are crawled.
- **Automatic fixes**, you get issues and data, not changes to your website.

## Limits

- Lighthouse runs only on crawled HTML pages with status 2xx (the start page first); URLs outside the crawl are not tested.
- The crawler identifies itself with its own user agent; sites with aggressive bot protection may block it (try **Use extra crawler network** or a **Custom user agent**).
- Core Web Vitals per page (`largestContentfulPaintMs`, `cumulativeLayoutShift`, `firstInputDelayMs`) are measured only with **Full browser rendering**; otherwise they are `null`. Lighthouse always measures them.
- Broken link details are listed for up to 5,000 broken links per website (100 per page).
- If the crawl reaches **Max crawl time**, it is stopped and the pages crawled so far are delivered (site wide duplicate checks may then be incomplete).
- When several websites share a small budget, pages are allocated in input order, so the last websites may be skipped.
- URL patterns match the URL path and query from its start (robots.txt style `*` and `$`), not full regular expressions. Pages behind excluded URLs can still be reached if other links point to them through included sections.
- Change monitoring compares with the last run of the same website in the same monitoring store; changing thresholds or skipped checks changes onpage scores and shows up as changes. `pagesNotCrawledAgain` can include pages that were simply outside this run's page limit. Up to 40,000 URLs per website are remembered.

## FAQ

**Is there a limit on the Apify Free plan?**
Yes: up to $0.25 of this Actor's results per calendar month, enough to try it. Apify pays developers nothing for Free plan usage while our data costs are real, so this keeps the Actor sustainable. Runs that reach the allowance stop cleanly and keep everything collected so far; the allowance resets on the 1st of the month. Any paid Apify plan has no limit.

**Is it legal?**
Crawling publicly available pages for SEO analysis is generally fine, but only audit websites you own or have permission to audit, respect the website's terms, and keep a gentle crawl speed for sites you don't control. Turning off **Respect robots.txt** should be limited to your own sites.

**How fresh is the data?**
Every run crawls the website live, so results reflect the site at the time of the run (`fetchedAt` per page).

**Why did I get fewer pages than "Max pages per website"?**
The website may have fewer reachable pages, robots.txt or your URL patterns may exclude parts of it, the crawl may have hit **Max crawl time** or **Max crawl depth**, or your **Maximum cost per run** capped it. Images, scripts and CSS files are checked but not returned as rows. See `RUN_SUMMARY` (including `pagesFilteredOutByUrlPatterns`) and `crawlStopReason` in `SITE_SUMMARY`.

**How do I audit only part of a website?**
Put a section URL into **Websites** (e.g. `https://example.com/blog/`) and add `/blog/` to **Only URLs matching**. Use **Exclude URLs matching** for carts, filters, tag pages or PDFs.

**How does change monitoring work?**
After each run, a compact fingerprint of every page (status, onpage score, title, meta description, H1, canonical, indexability, word count, issues) is saved in the named key value store `seo-site-audit-monitor` in your account. The next run of the same website compares against it and fills `changedSinceLastRun`, `changeType` and `changedFields`. The first run is the baseline. It is free; switch it off with **Track changes since the last run**.

**How do I control the budget?**
Set **Maximum cost per run** in the run options: the page limit is reduced up front so the run never goes over it. Rendering add ons and Lighthouse are only charged when you switch them on.

**Why was I charged for "Crawled page not delivered" or "Website crawled without delivered pages"?**
The crawler visited those pages, which costs the same whether or not you keep them. With **Only pages with issues** or URL patterns, pages that do not qualify cost $0.0009 each instead of the full page price. A website that could not be reached still costs $0.0003 + one checked page. If the crawl results could not be read, or the crawl start got no answer (the crawl may still have run), the pages up to the crawl's page limit are charged as checked pages; `RUN_SUMMARY` lists `pagesChecked`, `websitesChecked` and the error. With JavaScript or browser rendering on, the rendering add on applies to checked pages too, because they were rendered.

**Why was I charged $0.0065 for a Lighthouse test without result?**
The test ran (or may have run, when no answer arrived) but returned no usable report, for example because the page did not load in the test browser. Tests that could not be started are free. `RUN_SUMMARY.lighthouseChecked` counts them.

**Is Apify platform usage included?**
No. Apify platform usage (compute) is billed separately by Apify, on top of the event fees. At the default 256 MB memory a small run typically uses about $0.001 to $0.005; long crawls wait longer and use more. Each run's usage is shown in Apify Console.

**Can I schedule it?**
Yes, create an Apify Schedule (e.g. every Monday) and a webhook or Make/Zapier scenario that sends you the rows where `changeType` is `new` or `changed`.

**Which export formats are available?**
JSON, CSV, Excel, XML, HTML and RSS from the Output tab or the API, plus Google Sheets through the integration.

**How long does an audit take?**
Roughly 1 to 3 minutes for 20 pages and 5 to 10 minutes for a few hundred pages at the normal crawl speed. Choose **Fast** only for sites that can handle it.

**Something doesn't work, where do I get help?**
Open an issue on the Actor's **Issues** tab with the run link and your input (without private data) and we will look into it.
