PageSpeed Insights Bulk Audit — Lighthouse & Core Web Vitals
Pricing
from $3.00 / 1,000 page audited (per device)s
PageSpeed Insights Bulk Audit — Lighthouse & Core Web Vitals
Audit many URLs with Google's official PageSpeed Insights API: Lighthouse scores, real-user Core Web Vitals (CrUX) next to lab metrics, mobile and desktop in one row, ranked fix suggestions, sitemap input and change tracking. Pay per audit plus a small start fee, no platform fees.
Pricing
from $3.00 / 1,000 page audited (per device)s
Rating
0.0
(0)
Developer
Aaron Tuttle
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Run Google PageSpeed Insights on hundreds of pages at once and get the results as clean JSON, CSV or Excel: the four Lighthouse scores (performance, accessibility, best practices, SEO), real-user Core Web Vitals from Chrome users (LCP, INP, CLS, FCP, TTFB) next to the lab metrics, mobile and desktop side by side, a ranked list of what to fix and the failed accessibility, SEO and best-practice checks for every page.
It uses Google's official PageSpeed Insights API, the same engine as pagespeed.web.dev, so the numbers match what you and your clients see there. No scraping, no browsers to babysit. You pay per audit plus a small start fee, with no platform fees, and failed audits are free.
Why use this PageSpeed Insights bulk checker
- Mobile and desktop in one row. Compare both devices without merging spreadsheets.
- Field data and lab data side by side. Google's real-user data (the Chrome UX Report) decides your Core Web Vitals; Lighthouse lab data tells you why. You get both, plus a clear
coreWebVitals: "passed" | "failed" | "no-data"verdict per device, and you're told whether the field data is for the page itself or its whole site. - A fix list, not just a score. The biggest improvement opportunities first, each with its estimated time saving, plus the titles of every failed accessibility, SEO and best-practice check.
- Whole sites in one go. Paste a sitemap, a sitemap index, a
.xml.gzsitemap or just the home page (we find the sitemap via robots.txt). - Monitoring built in. Turn on Compare with the previous run, schedule the Actor, and every row tells you what changed and whether the page regressed.
- Fair billing. Pages that can't be audited (404s, DNS errors, pages that never load, non-HTML files) are delivered with the reason and cost nothing. Google's own hiccups are retried automatically.
- No platform fees on top. One small fee per run plus one per successful audit. Compute is included.
What PageSpeed Insights data do you get?
One row per page (or one row per page and device, if you prefer). Per device:
| Field | Example |
|---|---|
performance, accessibility, bestPractices, seo | 64 · 38 · 92 · 82 (0–100, like pagespeed.web.dev) |
coreWebVitals, coreWebVitalsScope | failed · url (or origin when Google only has site-wide data) |
field | Real users, 75th percentile: lcpMs 2900 (needs-improvement), inpMs 180 (good), cls 0.05 (good), fcpMs, ttfbMs, overall rating |
originField | The same for the whole site |
lab | Lighthouse: fcpMs, lcpMs, tbtMs, cls, speedIndexMs, ttiMs, serverResponseMs, totalBytes, requestCount |
opportunities | e.g. "Render-blocking requests — est. savings 4,200 ms", biggest first, with LCP / FCP / TBT savings and bytes |
failedAudits | e.g. accessibility: "Image elements do not have [alt] attributes"; seo: "Document does not have a meta description" |
finalUrl, lighthouseVersion, auditedAt, runWarnings | Where the page ended up after redirects, and audit details |
change (optional) | Score and metric differences since the previous run, regressed, improved |
fullReportUrl (optional) | The complete PageSpeed Insights JSON for your own analysis |
status, error, errorCode | Why an audit failed (not charged), e.g. ERRORED_DOCUMENT_REQUEST with "(Status code: 404)" |
pageSpeedWebUrl | Opens the page in Google's own PageSpeed Insights web app, handy for client reports |
Every page you submit gets a row, so nothing silently disappears: if a run stops at your maximum cost, its timeout or your key's daily quota, the remaining pages are listed with status: "not-audited" and the reason (free).
The run's OUTPUT record summarises the run: audits succeeded and failed, error codes, sitemaps read, and any pages not audited.
How much does a bulk PageSpeed audit cost?
| Event | Price |
|---|---|
| Run start | $0.005 |
| Successful audit (one page on one device) | $0.003 ($3 per 1,000 audits) |
| Example | Approx. cost |
|---|---|
| 1 page, mobile + desktop | $0.011 |
| 100 pages, mobile + desktop | $0.605 |
| 1,000 pages, mobile only | $3.005 |
Failed audits are free. To cap any run, use Apify's Maximum cost per run setting; the Actor stops cleanly at the limit and lists the pages it didn't get to.
The price is the same on every Apify plan. Apify's $5 free plan is enough for about 1,600 audits (800 pages on mobile and desktop).
Google API key: optional for small runs, free for big ones
Small runs need no key. Leave the field empty and the Actor uses its shared built-in key, limited to 25 pages per run so it stays available for everyone.
For bigger or scheduled runs, add your own free key (2 minutes, once, no credit card). It gives you your own daily quota, not shared with anyone else:
- Open Google's PageSpeed Insights "Get started" page, click Get a Key, sign in with any Google account and pick or create a project. Google creates the key and shows it.
- Copy the key (it starts with
AIza) into the Google API key field. That's it.
Apify stores the key encrypted; this Actor sends it to Google in a request header and never logs it or writes it to your results. Save it once in an Apify Task (Actor → Create task) and you never paste it again.
If the key has a problem, the run stops straight away with a plain explanation of what to change (key not valid, API not enabled, wrong restrictions, daily quota used up), and nothing more is charged.
How to run PageSpeed Insights in bulk
- Paste your page URLs, one per line, and/or a sitemap.
- For more than 25 pages, paste your own free Google API key (see above).
- Choose devices (mobile + desktop by default) and, if you like, fewer categories.
- Click Start, then download the results as JSON, CSV or Excel, or get them through the API. In CSV and Excel the nested fields become columns like
mobile/performanceandmobile/field/lcpMs.
A page takes 10–30 seconds per device inside Google; with the default 8 parallel audits, 100 pages on both devices finish in roughly 5–12 minutes, and the default 4-hour run timeout fits about 2,500 pages on both devices. If a run gets close to its timeout it stops cleanly and lists the pages it didn't reach in the OUTPUT record.
Monitoring over time
Turn on Compare with the previous run and schedule the Actor (Apify → Schedules), for example weekly. Every row then carries a change object and a top-level regressed: true when any score dropped 10 points or more or Core Web Vitals went from passed to failed (smaller moves are normal run-to-run variation, but you still see them in change). Use a different History storage name per client so their histories stay apart.
PageSpeed Insights API: Python, JavaScript, Zapier, Make and AI agents (MCP)
One HTTP call that returns the results:
curl -X POST "https://api.apify.com/v2/acts/aaronoptimus~pagespeed-insights-bulk-audit/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"urls":["https://www.example.com/","https://www.example.com/pricing"],"apiKey":"YOUR_GOOGLE_API_KEY","devices":"mobile"}'
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("aaronoptimus/pagespeed-insights-bulk-audit").call(run_input={"sitemapUrls": ["https://www.example.com/"],"maxUrlsFromSitemaps": 50,"apiKey": "YOUR_GOOGLE_API_KEY",})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["url"], row["mobile"] and row["mobile"]["performance"], row["mobile"] and row["mobile"]["coreWebVitals"])
JavaScript (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('aaronoptimus/pagespeed-insights-bulk-audit').call({urls: ['https://www.example.com/'],apiKey: 'YOUR_GOOGLE_API_KEY',outputFormat: 'perDevice',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
AI agents (Claude, Cursor, ChatGPT and other MCP clients): add Apify's MCP server with this Actor as a tool, https://mcp.apify.com?tools=aaronoptimus/pagespeed-insights-bulk-audit, and ask for example "Audit the pages in example.com's sitemap and list the ones failing Core Web Vitals with their top fix."
Schedules, webhooks and integrations (Google Sheets, Slack, Zapier, Make, n8n) work from the Actor's Integrations tab, e.g. a weekly run that posts pages with regressed: true to Slack.
Tips
- Field data first.
coreWebVitalsandfieldcome from real Chrome users and are what Google Search uses; the labperformancescore is a diagnostic estimate. - Mobile is what Google ranks with. Choose Mobile only to halve the cost when desktop doesn't matter to you.
- Big lists: keep Parallel audits at 8 to 10. Higher values mostly run into Google's per-minute limit (the Actor then pauses briefly, so nothing breaks, but it isn't faster).
What this tool doesn't do
- No pages behind a login or on localhost: Google's servers must reach the page.
- No scraping of pagespeed.web.dev: it uses Google's official PageSpeed Insights API within its quotas.
- Without your own key, 25 pages per run on the shared built-in key. Your own free key removes the cap.
- No fixes applied: you get the ranked fix list and failed checks, not changed code.
FAQ
Why are my scores a few points different from yesterday? Lab scores vary a little from run to run on every Lighthouse tool, pagespeed.web.dev included. Field data (Core Web Vitals) is a 28-day average and is stable.
What does coreWebVitalsScope: "origin" mean? Google doesn't have enough real-user visits for that exact page, so it shows the data for the whole site, just like pagespeed.web.dev does. no-data means Google has no real-user data for the site at all; lab data is still there.
Is INP required to pass Core Web Vitals? LCP, INP and CLS must all be "good". When a page has too few interactions for INP, the verdict uses LCP and CLS, as PageSpeed Insights does.
Can I audit pages behind a login, or on localhost? No. Google's servers load the page, so it has to be publicly reachable.
What if Google's per-minute limit is hit? All audits pause together for a minute and continue. Only if Google keeps refusing for about ten minutes does an audit fail as RATE_LIMITED (not charged).
Why did an audit fail? The row says why: for example ERRORED_DOCUMENT_REQUEST (Status code: 404), DNS_FAILURE, NOT_HTML, or NO_FCP (the page painted nothing, often a bot-protection page). Failed audits are not charged.
Why did a run without a key stop at 25 pages, or say the built-in key's daily quota is used up? The built-in key is shared by everyone who runs the Actor without a key, so each run is capped at 25 pages and the key has a daily limit. Your own free key removes both limits.
Is this allowed? It uses Google's official, documented PageSpeed Insights API within Google's quotas, and never scrapes. For regular or large audits, use your own free key: it is yours, under your own Google account.
Related tools
By the same developer: Google Trends Scraper for search interest over time and by region, Google Autocomplete Scraper for long-tail keyword ideas, Google Analytics 4 Exporter for your own GA4 reports as flat rows, Google Ads Transparency Scraper for the ads competitors run, Google News Scraper for headlines by topic and city, Google Jobs Scraper for job listings with salaries, Google Hotels Scraper for hotel prices, Google Flights Scraper for airfare and price calendars.
Support
Found a problem or need a field that's missing? Open an issue on the Actor's Issues tab. If the Actor saves you time, a short review helps others find it.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google.