# Lighthouse & PageSpeed Bulk Audit — $0.01/page · Web Vitals (`tidydata/lighthouse-bulk-audit`) Actor

Bulk Google Lighthouse / PageSpeed Insights audit of many URLs or a whole sitemap: performance score, Core Web Vitals (LCP, CLS, TBT), website speed test metrics, accessibility, best practices and SEO scores, top fixes and HTML report. Mobile & desktop.

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

## Pricing

from $8.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

## ⚡ Lighthouse & PageSpeed Bulk Audit — Core Web Vitals, SEO

Run **Google Lighthouse** — the engine behind **PageSpeed Insights** and Chrome DevTools — on **many URLs or a whole sitemap** at once. For every page you get the **performance score**, **Core Web Vitals** (**LCP, CLS, TBT**), **FCP, Speed Index, TTI and server response time**, the **accessibility, best practices and SEO scores**, the **top fixes with estimated savings**, the list of **failed checks**, and a link to the **full interactive HTML report**. Mobile, desktop or both.

**$0.01 per audit** (one URL on one device). Pages that can't be loaded are free. No Google API key and no daily quota.

- ✅ **Bulk**: paste a list of URLs or **a sitemap.xml** (sitemap indexes too) — audit every page of a site in one run
- ✅ **Mobile** (the same throttled phone profile PageSpeed Insights uses) and/or **desktop**
- ✅ **All four Lighthouse categories**: Performance, Accessibility, Best Practices, SEO — or just the ones you need
- ✅ **Core Web Vitals in milliseconds** plus a simple `good` / `needs_improvement` / `poor` verdict
- ✅ **What to fix**: top 10 opportunities (render-blocking resources, unused JavaScript, image formats…) with estimated time and byte savings
- ✅ **Failed accessibility, best-practice and SEO checks** as readable lists (missing meta description, images without alt, low-contrast text…)
- ✅ **Page weight, number of requests, DOM size** and the **LCP element**
- ✅ **Full HTML report** for every audit — the same interactive report as Chrome DevTools, ready to share with a client
- ✅ Runs the **open-source Lighthouse 12** in a real Chrome on Apify — no API key, no 25,000/day quota, no "quota exceeded" errors

### Who uses it

- **SEO agencies & consultants** — audit all pages of a client site, sort by worst LCP, send the HTML reports.
- **Web developers** — check performance before and after a release; schedule it to catch regressions.
- **E-commerce & marketing teams** — track Core Web Vitals of product and landing pages.
- **Lead generation** — audit prospects' websites and pitch them the fixes.
- **Accessibility reviews** — quick list of failing checks across many pages.

### How to use it

1. Paste **URLs** (`https://example.com/page` or just `example.com`) or a **sitemap.xml** link.
2. Pick the **device** (mobile, desktop or both) and the **categories**.
3. Keep **fixes and failed checks** and the **HTML report** on (both free).
4. Run, sort the table by `performance` or `lcpMs`, and export to **CSV, Excel or JSON** — or schedule it weekly and send results to Slack, email or Google Sheets.

#### Input example

```json
{
  "urls": ["https://example.com/sitemap.xml"],
  "strategy": "both",
  "categories": ["performance", "accessibility", "best-practices", "seo"],
  "maxUrls": 200
}
```

### Output example

```json
{
  "url": "https://example.com/",
  "finalUrl": "https://example.com/",
  "strategy": "mobile",
  "performance": 100,
  "accessibility": 100,
  "bestPractices": 100,
  "seo": 80,
  "coreWebVitals": "good",
  "lcpMs": 917,
  "cls": 0,
  "tbtMs": 0,
  "fcpMs": 767,
  "speedIndexMs": 767,
  "serverResponseMs": 13,
  "totalBytes": 2145,
  "requests": 2,
  "opportunities": [],
  "failedSeo": ["Document does not have a meta description", "Links do not have descriptive text"],
  "reportUrl": "https://api.apify.com/v2/key-value-stores/…/records/report-0001-mobile?signature=…",
  "lighthouseVersion": "12.8.2"
}
```

### Pricing

**$0.01 per audit** — one URL on one device ($10 per 1,000 audits). Auditing a URL on mobile *and* desktop counts as two audits. Pages that fail to load (DNS errors, timeouts, blocked pages) are free. Higher Apify plans get an automatic discount, and you can set a **maximum cost per run**.

### Tips

- Get every URL of a site first with [Sitemap URL Extractor](https://apify.com/tidydata/sitemap-url-extractor), or paste the sitemap directly here.
- For on-page technical SEO (titles, canonicals, broken links, redirects) use [SEO Audit Crawler](https://apify.com/tidydata/seo-audit-crawler).
- Full-page screenshots of the same URLs: [Website Screenshot & PDF API](https://apify.com/tidydata/website-screenshot-pdf).

### FAQ

**Are the scores the same as PageSpeed Insights?**
They use the same Lighthouse engine and the same mobile throttling profile, so they are directly comparable. Like any lab test, scores vary a few points between runs, and PageSpeed Insights additionally shows field data from real Chrome users (CrUX), which this Actor doesn't include.

**Why is the mobile score lower than desktop?**
Mobile simulates a mid-range phone on a slow 4G connection, as PageSpeed Insights does. That's the score Google shows for mobile.

**How long does an audit take?**
Usually 10–25 seconds per URL and device. Audits run one at a time so they don't slow each other down and skew the scores.

**Can it audit pages behind a login?**
No — it audits public URLs.

**A page failed — am I charged?**
No. Pages that can't be loaded return a free row with the error message.

Something doesn't work? Open an issue in the **Issues** tab with the URL — we answer fast.

# Actor input Schema

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

One per line: https://example.com/page, example.com, or a sitemap.xml link to audit every page in it.

## `strategy` (type: `string`):

Mobile uses Lighthouse's standard throttled phone profile, the same one PageSpeed Insights uses.

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

Leave all four for a full audit; performance only is a bit faster.

## `includeAudits` (type: `boolean`):

Top 10 opportunities with estimated savings, plus the failed accessibility, best-practice and SEO checks.

## `saveHtmlReport` (type: `boolean`):

The same interactive report as Chrome DevTools, with a link in each row.

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

Limit for sitemaps and long lists.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://example.com"
  ],
  "strategy": "mobile",
  "categories": [
    "performance",
    "accessibility",
    "best-practices",
    "seo"
  ],
  "includeAudits": true,
  "saveHtmlReport": true,
  "maxUrls": 100
}
```

# Actor output Schema

## `results` (type: `string`):

One row per URL and device.

# 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": [
        "https://apify.com",
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/lighthouse-bulk-audit").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": [
        "https://apify.com",
        "https://example.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tidydata/lighthouse-bulk-audit").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": [
    "https://apify.com",
    "https://example.com"
  ]
}' |
apify call tidydata/lighthouse-bulk-audit --silent --output-dataset

```

## MCP server setup

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

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/JdAbQxmhYkrP55xVe/builds/butPxaVV9rSMSehsE/openapi.json
