# Bulk PageSpeed & Lighthouse Checker – Core Web Vitals (`mikumans/bulk-pagespeed-auditor`) Actor

Check PageSpeed Insights for many URLs or a whole sitemap: Lighthouse performance, accessibility, best practices and SEO scores, Core Web Vitals, real-user CrUX data, top fixes and alerts.

- **URL**: https://apify.com/mikumans/bulk-pagespeed-auditor.md
- **Developed by:** [Michiel Kustermans](https://apify.com/mikumans) (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

$2.00 / 1,000 audit results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 PageSpeed & Lighthouse Checker – Core Web Vitals

Run **Google PageSpeed Insights / Lighthouse on hundreds of URLs, or a whole sitemap, in one go.** Get the four Lighthouse scores, lab and **real-user Core Web Vitals**, and the **top fixes per page**, in one clean table. Built on Google's **official API**, so no hacks and no surprise blocks. No Google account needed.

### What can you use it for?

- **SEO & technical audits** of entire sites from their sitemap.
- **Core Web Vitals monitoring:** schedule weekly runs and flag pages below your thresholds.
- **Agency reporting:** mobile + desktop scores for every client page, exported to Sheets/Excel.
- **Pre/post-deploy regression checks** of key templates.
- **Lead qualification:** find prospects with slow websites.

### Features

| Feature | This Actor | Typical PageSpeed Actors |
|---|---|---|
| Bulk URLs **or a sitemap/domain** (robots.txt discovery, sitemap index, .gz) | ✅ | URLs only |
| Mobile **and** desktop in one run | ✅ | Often one |
| Performance, Accessibility, Best Practices, SEO scores | ✅ | ✅ |
| Lab metrics: LCP, CLS, TBT, FCP, Speed Index, TTFB | ✅ | ✅ |
| **Real-user field data** (CrUX LCP, INP, CLS p75) | ✅ | Sometimes |
| **Top failing audits as columns**, ranked by estimated savings | ✅ | Raw JSON |
| **Threshold flags** + "Flagged pages" view | ✅ | ❌ |
| Official Google API, retries with backoff, concurrency | ✅ | Varies |
| Bring your own API key (optional) | ✅ | Varies |
| **Failed audits are free** | ✅ | ❌ |

### How to use

1. Paste URLs, **or** enter a website/sitemap URL.
2. Choose mobile, desktop or both, and set your score thresholds.
3. Click **Start** and export the table.

#### Example input

```json
{ "sitemapUrl": "https://docs.apify.com", "maxSitemapUrls": 50, "strategies": ["mobile", "desktop"],
  "thresholds": { "performance": 50, "accessibility": 80, "bestPractices": 80, "seo": 80 } }
```

#### Example output (real run)

```json
{ "url": "https://apify.com", "strategy": "mobile", "performanceScore": 37, "accessibilityScore": 100, "bestPracticesScore": 73, "seoScore": 85,
  "labLcpMs": 13726, "fieldOverall": "AVERAGE", "fieldLcpMs": 2436, "fieldInpMs": 396, "fieldDataSource": "url",
  "failingAudit1": "Reduce unused JavaScript", "failingAudit1Savings": "Est savings of 1,368 KiB",
  "failingAudit2": "Minimize main-thread work", "failingAudit2Savings": "9.0 s",
  "flagged": true, "flags": ["performance 37 < 50", "bestPractices 73 < 80"],
  "reportUrl": "https://pagespeed.web.dev/analysis?url=https%3A%2F%2Fapify.com&form_factor=mobile" }
```

### Pricing

Pay per audit result (one URL × one strategy), with no platform usage fees on top. See the **Pricing** tab for the current price.

- 100 audits ≈ $0.20 · 1,000 audits ≈ $2 · a 500-page site on mobile + desktop = 1,000 audits ≈ $2
- **Failed audits are not charged.** Unreachable URLs are listed in the `FAILED` record.

### Integrations

- **API:** run via the [Apify API](https://docs.apify.com/api/v2) or the JavaScript/Python clients, and get results as JSON, CSV, Excel or XML.
- **No-code:** native Apify integrations for **Make**, **Zapier** and **n8n**, plus Google Sheets, Slack, webhooks and **schedules**.
- **AI agents:** available through the Apify MCP server, so Claude, ChatGPT and other agents can call it as a tool.

### FAQ

**Do I need a Google API key?** No, a built-in key is used. For very large or frequent jobs you can enter your own key to use your own Google quota.
**Why is there no field data for some pages?** Google only has real-user (CrUX) data for pages/origins with enough Chrome traffic. `fieldDataSource` shows whether it's page-level or origin-level.
**How long does it take?** Google needs about 10–30 s per audit. With concurrency 4, 100 audits take about 10 minutes. Raise `maxConcurrency` to go faster.
**Why do scores differ from my browser?** Lighthouse lab results vary run to run and by location. Use field data for real-user truth.
**Can I get the full Lighthouse JSON?** The table keeps the most useful fields. Open `reportUrl` for the full interactive report.

### Related Actors from the same developer

- 📸 **[Website Screenshot API](https://apify.com/mikumans/website-screenshot)**: full-page, mobile and PDF screenshots of any URL.
- 🗺️ **[Sitemap URL Extractor](https://apify.com/mikumans/sitemap-extractor-pro)**: every URL from a site's sitemaps, with new/removed URL monitoring.

**Workflow tip:** extract URLs with the Sitemap Extractor → audit them with the PageSpeed Checker → screenshot the flagged pages.

**Keywords:** PageSpeed Insights API, bulk Lighthouse, Core Web Vitals checker, site speed test, LCP INP CLS, CrUX, SEO audit, performance audit, sitemap audit.

# Actor input Schema

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

Pages to audit. Domains without https:// are accepted.

## `sitemapUrl` (type: `string`):

A sitemap (.xml or .xml.gz, index files supported) or just a website URL: sitemaps are then discovered via robots.txt.

## `maxSitemapUrls` (type: `integer`):

Cap on pages taken from the sitemap.

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

Device form factors to test.

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

Categories to score.

## `thresholds` (type: `object`):

Pages scoring below any threshold are flagged (keys: performance, accessibility, bestPractices, seo; 0–100).

## `topFailingAudits` (type: `integer`):

How many of the most impactful failing audits to flatten into columns.

## `maxConcurrency` (type: `integer`):

Parallel PageSpeed requests.

## `maxRetries` (type: `integer`):

Retries with exponential backoff on 429/5xx errors.

## `apiKey` (type: `string`):

Optional. Use your own PageSpeed Insights API key and quota. Leave empty to use the built-in key.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com",
    "https://www.wikipedia.org"
  ],
  "maxSitemapUrls": 50,
  "strategies": [
    "mobile",
    "desktop"
  ],
  "categories": [
    "performance",
    "accessibility",
    "best-practices",
    "seo"
  ],
  "thresholds": {
    "performance": 50,
    "accessibility": 80,
    "bestPractices": 80,
    "seo": 80
  },
  "topFailingAudits": 5,
  "maxConcurrency": 4,
  "maxRetries": 3
}
```

# Actor output Schema

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

One row per URL and strategy with scores, Core Web Vitals, field data, failing audits and flags

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

Counts of succeeded and failed audits

## `failed` (type: `string`):

URLs that could not be audited, with errors

# 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://www.wikipedia.org"
    ],
    "strategies": [
        "mobile",
        "desktop"
    ],
    "thresholds": {
        "performance": 50,
        "accessibility": 80,
        "bestPractices": 80,
        "seo": 80
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikumans/bulk-pagespeed-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": [
        "https://apify.com",
        "https://www.wikipedia.org",
    ],
    "strategies": [
        "mobile",
        "desktop",
    ],
    "thresholds": {
        "performance": 50,
        "accessibility": 80,
        "bestPractices": 80,
        "seo": 80,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mikumans/bulk-pagespeed-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": [
    "https://apify.com",
    "https://www.wikipedia.org"
  ],
  "strategies": [
    "mobile",
    "desktop"
  ],
  "thresholds": {
    "performance": 50,
    "accessibility": 80,
    "bestPractices": 80,
    "seo": 80
  }
}' |
apify call mikumans/bulk-pagespeed-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mikumans/bulk-pagespeed-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/7Wf2hddm9jgfEl7mL/builds/2fBc9K18K6fg87Wvh/openapi.json
