How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table
Updated 2026-10-28 · Tool used: Bulk Lighthouse Audit - Core Web Vitals, SEO, Accessibility on Apify · Price: $10 per 1,000 successful audits (1 URL on 1 device); unreachable pages are free
PageSpeed Insights is the usual way to check Core Web Vitals, but it tests one URL at a time and its keyless API quota is shared and often answers HTTP 429. Comparing a whole site section, a list of landing pages or a set of competitors quickly turns into a lot of copy and paste.
This guide shows how to run real Lighthouse audits (the open-source tool from Google Chrome) on a list of URLs inside an Apify actor, on mobile, desktop or both, and get one row per page with the four category scores, lab metrics such as LCP, CLS, TBT, FCP and Speed Index, page weight and the failing audits with the largest estimated savings.
Open Bulk Lighthouse Audit on Apify →Steps
- Add pages to
urls(bare domains work) and pickformFactor:mobilematches PageSpeed Insights,bothcounts as two audits. - Optionally limit
categories, setmaxIssuesfor the topIssues list, and turn onsaveHtmlReportto get a link to the full Lighthouse report. - Export as CSV, sort by
performanceorlargestContentfulPaintMs, and schedule weekly runs to track scores over time.
Example input
{
"urls": [
"https://example.com"
],
"formFactor": "mobile"
}
Example output (one item, shortened)
{
"input": "https://example.com",
"url": "https://example.com/",
"formFactor": "mobile",
"finalUrl": "https://example.com/",
"statusCode": 200,
"performance": 100,
"accessibility": 96,
"bestPractices": 100,
"seo": 80,
"reportHtmlUrl": null,
"reportJsonUrl": null,
"durationMs": 7903,
"charged": true,
"error": null,
"auditedAt": "2026-10-21T07:10:44.517Z",
"firstContentfulPaintMs": 906,
"largestContentfulPaintMs": 906,
"totalBlockingTimeMs": 0,
"cumulativeLayoutShift": 0,
"speedIndexMs": 906,
"timeToInteractiveMs": 906,
"serverResponseTimeMs": 8,
"totalByteWeight": 2143,
"failedAuditCount": 6,
"topIssues": [
{
"id": "render-blocking-insight",
"category": "performance",
"title": "Render-blocking requests",
"score": 0,
"displayValue": "Est savings of 140Â ms",
"savingsMs": 150,
"savingsBytes": null
},
{
"id": "landmark-one-main",
"category": "accessibility",
"title": "Document does not have a main landmark.",
"score": 0,
"displayValue": null,
"savingsMs": null,
"savingsBytes": null
},
{
"id": "meta-description",
"category": "seo",
"title": "Document does not have a meta description",
"score": 0,
"displayValue": null,
"savingsMs": null,
"savingsBytes": null
},
"..."
],
"lighthouseVersion": "13.5.0",
"runWarnings": []
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"urls": [
"https://example.com"
],
"formFactor": "mobile"
}
run = client.actor("tinyrex/lighthouse-audit").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/lighthouse-audit').call({
"urls": [
"https://example.com"
],
"formFactor": "mobile"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~lighthouse-audit/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com"], "formFactor": "mobile"}' > results.csv
Get your API token in Apify Console → Settings → API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/lighthouse-audit",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Bulk lighthouse audit for this list and give me a table".
Use cases
- Performance monitoring: weekly scores for your key landing pages in one sheet.
- Agency audits: compare a client's pages with competitors on the same device and settings.
- Release checks: audit staging URLs before and after a deploy.
- SEO reports: combine with the on-page SEO checker for one technical report.
Pricing
Pay per result: $10 per 1,000 successful audits (1 URL on 1 device); unreachable pages are free. You can cap the cost of every run in the run options.
FAQ
Is this the same as PageSpeed Insights?
It runs the same Lighthouse engine with the mobile preset that PageSpeed Insights uses for lab data, so scores are comparable. It does not include the field data (CrUX) section, which comes from real Chrome users.
Do I need a Google API key?
No. Lighthouse runs inside the actor in headless Chrome, so there is no key and no shared quota.
Why do scores differ between runs?
Lab scores vary a little with network and CPU conditions, as in Chrome DevTools. For tracking, compare trends over several runs rather than single numbers.
Can I get the full Lighthouse report?
Yes. saveHtmlReport stores the full HTML report with a public link, and saveJsonReport stores the raw JSON result.
Related guides
- How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once
- How to find every broken link and redirect on a website, with the pages to fix
- How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to extract emails, phone numbers and social links from a list of company domains
- How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
- How to export US federal (SAM.gov) and UK (Contracts Finder) tenders to CSV or JSON
- How to look up French companies by SIREN or SIRET and build a B2B list from Sirene
- How to look up Norwegian companies by organisation number and build lead lists from Brreg
- How to download SEC filings (10-K, 10-Q, 8-K, Form 4) by ticker and search EDGAR full text
- How to validate NPI numbers in bulk and build US healthcare provider lists from NPPES
- How to look up hundreds of UK companies on Companies House at once (profile, officers, PSC)
- How to look up Finnish companies by Y-tunnus and build B2B lead lists from the YTJ register
- How to extract all URLs from a website's sitemap (and find broken links)
- How to transcribe hundreds of audio and video files to text and subtitles with Whisper
- How to extract text from hundreds of PDFs, including scanned ones, in one run
- How to clean an email list before a campaign: bulk MX, disposable and typo check
- How to get Dutch public tenders from TenderNed into a spreadsheet, with daily alerts
- How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once
- How to find every broken link and redirect on a website, with the pages to fix
- How to validate LEI codes and find the LEI for a list of companies in bulk