# Lighthouse Audit: Bulk PageSpeed, Core Web Vitals & SEO Scores (`tidelane/lighthouse-audit`) Actor

Run Google Lighthouse on many URLs: performance, accessibility, best practices and SEO scores, Core Web Vitals (LCP, CLS, TBT, FCP), savings opportunities and every failed check, for mobile and desktop. Full HTML report per page. No API key needed.

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

## Pricing

from $8.40 / 1,000 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 Audit: Bulk PageSpeed, Core Web Vitals & SEO Scores

Run **Google Lighthouse** on a whole list of pages at once and get the four scores (**performance, accessibility, best practices, SEO**), the **Core Web Vitals** lab metrics, the biggest **savings opportunities** and every **failed check**, for mobile, desktop or both. Each audit also saves the **full interactive Lighthouse HTML report**, the same one you know from Chrome DevTools and PageSpeed Insights.

- ✅ **Bulk**: audit hundreds of URLs in one run, no API key and no PageSpeed quota
- ✅ **Mobile and desktop** with Lighthouse's standard settings (slow 4G and mid-range phone CPU for mobile, like PageSpeed Insights)
- ✅ **Core Web Vitals and more**: LCP, CLS, TBT, FCP, Speed Index, time to interactive, server response time, page weight, DOM size
- ✅ **What to fix first**: savings opportunities sorted by time saved, failed checks per category with the affected count
- ✅ **HTML report link** for every audit, easy to share with clients or developers
- ✅ **Choose categories**: run only SEO or accessibility for faster, cheaper audits
- ✅ **Fair billing**: per finished audit; pages that fail to load (404, DNS errors) and pages excluded by robots.txt are free

### Input example

```json
{
    "urls": ["https://books.toscrape.com/", "https://apify.com"],
    "device": "mobile",
    "categories": [],
    "saveHtmlReport": true
}
```

`device` can be `mobile`, `desktop` or `both` (two audits per URL). `categories` can be any of `performance`, `accessibility`, `bestPractices`, `seo`; empty means all four.

### Output example

Real output from a test run (lists shortened to two entries):

```json
{
    "url": "https://books.toscrape.com/",
    "finalUrl": "https://books.toscrape.com/",
    "device": "mobile",
    "scores": {"performance": 99, "accessibility": 87, "bestPractices": 75, "seo": 91},
    "metrics": {
        "firstContentfulPaintMs": 1403,
        "largestContentfulPaintMs": 1673,
        "totalBlockingTimeMs": 0,
        "cumulativeLayoutShift": 0,
        "speedIndexMs": 1403,
        "timeToInteractiveMs": 1673,
        "serverResponseTimeMs": 13,
        "totalByteWeight": 337718,
        "domElements": 529
    },
    "opportunities": [
        {"id": "unused-css-rules", "title": "Reduce unused CSS", "savingsMs": 270, "savingsBytes": 31417, "displayValue": "Est savings of 31 KiB"},
        {"id": "unused-javascript", "title": "Reduce unused JavaScript", "savingsMs": 0, "savingsBytes": 21175, "displayValue": "Est savings of 21 KiB"}
    ],
    "issues": {
        "performance": [
            {"id": "cache-insight", "title": "Use efficient cache lifetimes", "score": 0, "displayValue": "Est savings of 324 KiB"},
            {"id": "font-display-insight", "title": "Font display", "score": 50, "displayValue": "Est savings of 10 ms"}
        ],
        "accessibility": [
            {"id": "color-contrast", "title": "Background and foreground colors do not have a sufficient contrast ratio.", "score": 0, "displayValue": null},
            {"id": "heading-order", "title": "Heading elements are not in a sequentially-descending order", "score": 0, "displayValue": null}
        ],
        "bestPractices": [
            {"id": "is-on-https", "title": "Does not use HTTPS", "score": 0, "displayValue": "1 insecure request found"},
            {"id": "errors-in-console", "title": "Browser errors were logged to the console", "score": 0, "displayValue": null}
        ],
        "seo": [
            {"id": "meta-description", "title": "Document does not have a meta description", "score": 0, "displayValue": null}
        ]
    },
    "warnings": [],
    "benchmarkIndex": 2705,
    "lighthouseVersion": "12.8.2",
    "fetchTime": "2026-10-23T14:30:53.082Z",
    "reportUrl": "https://api.apify.com/v2/key-value-stores/…/records/report-000-mobile-books.toscrape.com?signature=…"
}
```

A summary per URL and device (`ok`, `error` with the reason, `blocked_by_robots`) is saved as `OUTPUT` in the key-value store.

### Pricing

A fixed price per finished audit (an audit is one URL on one device). In our test 3 full audits took 83 seconds with the default 4 GB memory.

Paid Apify plans pay less: 10% off on Starter, 20% on Scale and 30% on Business and higher plans.

### FAQ

**Why do my scores differ from PageSpeed Insights?** Lighthouse lab results always vary a little between runs and machines. PageSpeed Insights also shows field data from real Chrome users, which is not part of a Lighthouse audit. Each result includes `benchmarkIndex`, the CPU speed of the machine; when it is low, the run adds a warning, and giving the run more memory (and so more CPU) helps.

**Are audits run in parallel?** No, one after another. Parallel audits in one browser would slow each other down and distort the performance numbers.

**Can I audit pages behind a login?** No, only public pages.

### More tools from Tidelane Data

- [SEO Audit](https://apify.com/tidelane/seo-audit): on-page SEO checks for any list of URLs
- [Accessibility Checker](https://apify.com/tidelane/accessibility-checker): WCAG 2.2, EAA and ADA audits with axe-core
- [Broken Link Checker](https://apify.com/tidelane/broken-link-checker): find 404s, redirects and dead links
- [Tech Stack Detector](https://apify.com/tidelane/tech-stack-detector): CMS, frameworks and technologies of any website
- [Website Screenshot API](https://apify.com/tidelane/website-screenshots): full-page and mobile screenshots without cookie banners

All our tools: [apify.com/tidelane](https://apify.com/tidelane)

***

#### Impressum

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Pages to audit, one per line.

## `device` (type: `string`):

Mobile uses a slow 4G connection and a mid-range phone CPU, as Google's PageSpeed Insights does.

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

Leave empty for all four: performance, accessibility, bestPractices, seo. Fewer categories run faster.

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

Save the full interactive Lighthouse report for each audit and add its link to the result.

## `respectRobotsTxt` (type: `boolean`):

Skip pages that robots.txt forbids. Turn off only for your own sites.

## `timeoutSecs` (type: `integer`):

How long Lighthouse waits for a page to load.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com"
  ],
  "device": "mobile",
  "saveHtmlReport": true,
  "respectRobotsTxt": true,
  "timeoutSecs": 60
}
```

# Actor output Schema

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

All results of the run as dataset items.

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

Summary per input with status (ok, error and the reason).

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/lighthouse-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"] }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/lighthouse-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"
  ]
}' |
apify call tidelane/lighthouse-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidelane/lighthouse-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/23JedA7dabgNRDaaZ/builds/dSJIvVxACc4DZlsza/openapi.json
