# Bulk Lighthouse & PageSpeed Audit – Core Web Vitals (`chris_elder/lighthouse-batch-auditor`) Actor

Run Google Lighthouse on many URLs or a whole sitemap, mobile and desktop. Get performance, SEO, accessibility and best-practice scores, Core Web Vitals, top fixes, budget pass/fail and HTML reports. No API key needed. Failed audits are free.

- **URL**: https://apify.com/chris_elder/lighthouse-batch-auditor.md
- **Developed by:** [Chris Elder](https://apify.com/chris_elder) (community)
- **Categories:** SEO tools, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 lighthouse audits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bulk Lighthouse & PageSpeed Audit – Core Web Vitals, SEO & Accessibility for many URLs

**Bulk Lighthouse Auditor** runs Google **Lighthouse** on a list of URLs, or on every page in a **sitemap**, for **mobile and desktop**, and gives you one clean table: **Performance, Accessibility, Best Practices and SEO scores**, **Core Web Vitals** (LCP, CLS, TBT, FCP, Speed Index), the **top fixes ranked by time saved**, every **failed audit**, **pass/fail budgets** and optional full **HTML reports**.

✅ **Pay per result: $0.015 per audit** ($0.004 with your own free Google key) · 🆓 **Failed audits are never charged** · 🔑 No API key needed

[▶ Try it with one click](#how-to-use-it) · [📄 Real example output](#output-example-from-a-real-public-run) · [💲 Pricing](#how-much-does-a-bulk-lighthouse-audit-cost) · [🔌 API & integrations](#integrations-api-ai-agents-make-zapier) · [❓ FAQ](#faq) · [🛟 Support](#support-reliability-and-feature-requests)

### What does Bulk Lighthouse Auditor do?

- 📋 **Batch audits** – hundreds of URLs, or pull them straight from your **XML sitemap**
- 📱💻 **Mobile and desktop** in one run
- 🚦 **Core Web Vitals** plus all four Lighthouse category scores (0–100)
- 🛠️ **Actionable output** – top opportunities (ms and KB saved) and failed audits per category (e.g. `color-contrast`, `meta-description`, `image-alt`)
- ✅ **Performance budgets** – e.g. performance ≥ 80, LCP ≤ 2.5 s, CLS ≤ 0.1 – with `budget.passed` and plain-English reasons; good for CI checks and client reports
- 📄 **Full HTML Lighthouse reports**, stored and linked per audit (optional)
- 🌍 **Real-user field data** (CrUX p75 LCP / INP / CLS / FCP / TTFB) with the PageSpeed Insights engine
- 🔁 **Reliable** – transient Lighthouse errors are retried with a fresh browser; failed audits are listed with the exact error and are free
- 🤝 **Polite** – one audit at a time per site with a delay

### Use cases

- **SEO agencies and consultants** – audit whole client sites, export to Google Sheets, schedule monthly reports
- **Developers** – catch performance regressions after deploys with budgets, schedules and webhooks
- **E-commerce teams** – check category and product templates on mobile
- **Accessibility reviews** – find pages failing automated accessibility checks at scale
- **AI agents** – "audit these pages and tell me what to fix" as one tool call

### How to use it

1. Click **Try for free** – the input is prefilled (gov.uk, mobile, with a sample budget), so **Start** works straight away and costs about $0.035.
2. Paste page URLs and/or a sitemap URL and choose **Mobile**, **Desktop** or both.
3. Optional: set budgets, turn on HTML reports, or add a PageSpeed Insights API key.
4. Click **Start**, then export CSV, Excel or JSON, or read results via API.

#### Input example

```json
{
  "urls": [{ "url": "https://www.gov.uk" }],
  "strategies": ["mobile"],
  "budget": { "minPerformanceScore": 80, "maxLcpMs": 2500, "maxCls": 0.1 },
  "saveHtmlReports": true
}
```

More options: `sitemapUrls`, `maxUrls`, `categories`, `engine` (`auto`, `lighthouse`, `psi`), `psiApiKey`, `sameHostDelayMs`, `pageTimeoutSecs`, `locale`.

#### Output example (from a real public run)

The example run above (gov.uk, mobile, 9 Oct 2026). Note the budget catching a layout-shift problem. **See it yourself:** [full HTML Lighthouse report](https://api.apify.com/v2/key-value-stores/3HTI990QMXF3km56E/records/report-1-mobile?signature=IQ5YDaqpqAKPnuxE49t8) · [dataset JSON](https://api.apify.com/v2/datasets/WlTXBEU8oTpT77ajt/items?format=json\&clean=1) · [CSV](https://api.apify.com/v2/datasets/WlTXBEU8oTpT77ajt/items?format=csv\&clean=1)

```json
{
  "url": "https://www.gov.uk",
  "strategy": "mobile",
  "engine": "lighthouse",
  "lighthouseVersion": "12.8.2",
  "scores": { "performance": 77, "accessibility": 100, "bestPractices": 100, "seo": 100 },
  "metrics": {
    "firstContentfulPaintMs": 1434,
    "largestContentfulPaintMs": 1696,
    "totalBlockingTimeMs": 23,
    "cumulativeLayoutShift": 0.565,
    "speedIndexMs": 1434,
    "timeToInteractiveMs": 1732,
    "serverResponseTimeMs": 14
  },
  "diagnostics": { "totalByteWeightKb": 200, "requestCount": 17, "domSize": 580, "mainThreadWorkMs": 668 },
  "opportunities": [
    { "id": "unused-css-rules", "title": "Reduce unused CSS", "savingsMs": 150, "savingsKb": 39 },
    { "id": "unused-javascript", "title": "Reduce unused JavaScript", "savingsMs": 150, "savingsKb": 26 }
  ],
  "failedAudits": {
    "performance": [{ "id": "cumulative-layout-shift", "title": "Cumulative Layout Shift", "score": 12 }],
    "accessibility": [], "bestPractices": [], "seo": []
  },
  "budget": { "passed": false, "failures": ["performance 77 < 80", "CLS 0.565 > 0.1"] },
  "htmlReportUrl": "https://api.apify.com/v2/key-value-stores/3HTI990QMXF3km56E/records/report-1-mobile?signature=...",
  "auditDurationMs": 9748
}
```

Lab scores move a few points between runs on any machine; that's normal Lighthouse behaviour.

### How much does a bulk Lighthouse audit cost?

Pay-per-event pricing: you pay per successful audit (one URL × one device). No platform usage charges on top.

| Event | Price | Notes |
|---|---|---|
| **Lighthouse audit** (default engine, no key) | **$0.015** ($15 per 1,000) | Silver $0.012, Gold and above $0.01 |
| **PageSpeed Insights audit** (your free Google key) | **$0.004** ($4 per 1,000) | Adds CrUX real-user data. Silver $0.0035, Gold $0.003 |
| Run start | $0.005 per GB of memory | Default 4 GB = $0.02 per run; 2 GB (the minimum) = $0.01 |

**Worked examples (Free/Starter prices):**

| Job | Calculation | Total |
|---|---|---|
| One-click example (1 URL, mobile, 4 GB) | $0.015 + $0.02 start | **$0.035** |
| 100 pages × mobile + desktop, Lighthouse engine | 200 × $0.015 + $0.02 | **$3.02** |
| Same 200 audits with your PSI key, 2 GB memory | 200 × $0.004 + $0.01 | **$0.81** |
| Monthly check of a 1,000-page sitemap, mobile | 1,000 × $0.015 + $0.02 | **$15.02** (Gold: $10.02) |

**Never charged:** failed audits (timeouts, DNS errors, HTTP errors, Lighthouse crashes). Cap spending with **Max URLs** or Apify's **Max cost per run**. Apify's Free plan includes $5 of monthly credit.

#### How do I get a free PageSpeed Insights API key?

Open [Google's PSI "Get started" page](https://developers.google.com/speed/docs/insights/v5/get-started), click **Get a Key**, choose or create a Google Cloud project, and paste the key into *PageSpeed Insights API key*. The field is encrypted and the key is never logged.

### Integrations (API, AI agents, Make, Zapier)

**API** – audit and get results in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/chris_elder~lighthouse-batch-auditor/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"urls":[{"url":"https://www.gov.uk"}],"strategies":["mobile"]}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("chris_elder/lighthouse-batch-auditor").call(run_input={"urls": [{"url": "https://www.gov.uk"}], "strategies": ["mobile", "desktop"]})
for audit in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(audit["url"], audit["strategy"], audit.get("scores"))
```

**AI agents (MCP)** – add `https://mcp.apify.com/?tools=chris_elder/lighthouse-batch-auditor` to Claude, Cursor, VS Code or any MCP client.

**Make, Zapier, n8n** – use the Apify app's **Run Actor** action with `chris_elder/lighthouse-batch-auditor` and send scores to Google Sheets, Slack or Looker Studio. Use **Schedules** for weekly audits and **webhooks** to alert on failed budgets.

### Limits and good to know

- Lab scores vary a few points between runs. For trends, compare medians or give budgets some headroom. The PSI engine runs on Google's servers and matches pagespeed.web.dev.
- Pages behind logins, CAPTCHAs or bot walls can't be audited.
- Each audit takes about 10–20 seconds with the Lighthouse engine; audits of one site run one at a time.
- Lighthouse version and settings are included in every result for reproducibility.

### Is it legal?

The Actor loads each page you list once per device, like a visitor's browser, and measures how it performs. It doesn't collect personal data or content. Only audit sites you own, manage or are allowed to test, and keep the default polite delays. With the PSI engine, requests go to Google under your own API key and Google's terms.

### FAQ

**Is this the same as PageSpeed Insights?** PSI is Lighthouse plus CrUX field data. The PSI engine returns exactly that; the default engine runs the same open-source Lighthouse on Apify.

**Can I audit a whole website?** Yes. Put its sitemap in *Sitemap URLs* and set *Max URLs*. To pick pages first, use [Sitemap URL Extractor](https://apify.com/chris_elder/sitemap-url-extractor).

**Can I schedule it?** Yes. Use Apify Schedules (e.g. weekly) and send results to Slack, email, Google Sheets or a webhook.

**An audit failed.** Failed audits include the exact Lighthouse error code and aren't charged. If it keeps happening, open an issue.

### Support, reliability and feature requests

- **Failed audits are free.** You pay only for completed audits.
- **Tested on real sites before every release** (gov.uk, crawlee.dev, mobile and desktop, budgets, HTML reports, DNS failures).
- **Issues answered within 2 business days.** Open an issue on the **Issues** tab with the URL and device.
- **Feature requests welcome** – open an issue titled "Feature request: …".
- Built by Chris Elder with AI-assisted development; every release is reviewed and tested before it ships.

### Need the data done for you?

If you'd rather not set up runs yourself, the UK company behind these tools (GPT Shop Ltd) offers a fixed-price done-for-you scrape. Tell us the website and the fields you need, and you get a clean CSV or Google Sheet within 48 hours of the confirmed brief, up to 5,000 rows, for £149 or $179. If we can't get the data, you're refunded in full. [See the done-for-you scraper service](https://sme-free-tools.pages.dev/done-for-you-scraper/?utm_source=apify\&utm_medium=readme\&utm_campaign=lighthouse-batch-auditor)

### More tools by Chris Elder

- [Sitemap URL Extractor](https://apify.com/chris_elder/sitemap-url-extractor) – every URL from a website's sitemaps, with optional broken-link check
- [PDF to Markdown & Text Converter (with OCR)](https://apify.com/chris_elder/pdf-to-markdown) – LLM- and RAG-ready Markdown from any PDF
- [Bulk WHOIS Domain Lookup](https://apify.com/chris_elder/bulk-whois-domain-lookup) – registrar, expiry, availability and DNS for many domains via official RDAP
- [Image to Text OCR](https://apify.com/chris_elder/image-to-text-ocr) – bulk text extraction from images in 100+ languages
- All tools: [apify.com/chris_elder](https://apify.com/chris_elder)

# Actor input Schema

## `urls` (type: `array`):

Pages to audit.

## `sitemapUrls` (type: `array`):

Audit the pages listed in these XML sitemaps (sitemap indexes are followed). Combined with Page URLs, up to 'Max URLs'.

## `maxUrls` (type: `integer`):

Maximum number of unique pages to audit (each page is audited once per selected device).

## `strategies` (type: `array`):

Mobile (Moto G Power emulation, slow 4G throttling) and/or desktop. Each device is a separate audit.

## `categories` (type: `array`):

Lighthouse categories to score.

## `engine` (type: `string`):

lighthouse = run Lighthouse on Apify (no key needed). psi = Google PageSpeed Insights API with YOUR free API key (cheaper per audit, adds real-user CrUX field data). auto = psi if a key is given, else lighthouse.

## `psiApiKey` (type: `string`):

Your own free Google API key with the PageSpeed Insights API enabled. Stored encrypted; never logged.

## `budget` (type: `object`):

Optional thresholds. Each audit gets budget.passed true/false with reasons. Keys: minPerformanceScore, minAccessibilityScore, minSeoScore, minBestPracticesScore (0-100), maxLcpMs, maxTbtMs, maxCls.

## `saveHtmlReports` (type: `boolean`):

Store the full interactive Lighthouse HTML report for every audit in the key-value store and link it from the results.

## `sameHostDelayMs` (type: `integer`):

Politeness delay so the audited website isn't loaded heavily.

## `pageTimeoutSecs` (type: `integer`):

How long to wait for a page to load before the audit is marked as failed (failed audits are not charged).

## `locale` (type: `string`):

Locale for audit titles, e.g. en-US, en-GB, de, fr, es.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://www.gov.uk"
    }
  ],
  "maxUrls": 50,
  "strategies": [
    "mobile"
  ],
  "categories": [
    "performance",
    "accessibility",
    "bestPractices",
    "seo"
  ],
  "engine": "auto",
  "budget": {
    "minPerformanceScore": 80,
    "maxLcpMs": 2500,
    "maxCls": 0.1
  },
  "saveHtmlReports": false,
  "sameHostDelayMs": 1000,
  "pageTimeoutSecs": 60,
  "locale": "en-US"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        {
            "url": "https://www.gov.uk"
        }
    ],
    "strategies": [
        "mobile"
    ],
    "budget": {
        "minPerformanceScore": 80,
        "maxLcpMs": 2500,
        "maxCls": 0.1
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("chris_elder/lighthouse-batch-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": [{ "url": "https://www.gov.uk" }],
    "strategies": ["mobile"],
    "budget": {
        "minPerformanceScore": 80,
        "maxLcpMs": 2500,
        "maxCls": 0.1,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("chris_elder/lighthouse-batch-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    {
      "url": "https://www.gov.uk"
    }
  ],
  "strategies": [
    "mobile"
  ],
  "budget": {
    "minPerformanceScore": 80,
    "maxLcpMs": 2500,
    "maxCls": 0.1
  }
}' |
apify call chris_elder/lighthouse-batch-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chris_elder/lighthouse-batch-auditor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jR1V2NHBtTZCfmBQQ/builds/ZzapO3QCL3dfwPgcm/openapi.json
