Bulk PageSpeed Insights Checker: Lighthouse & Core Web Vitals avatar

Bulk PageSpeed Insights Checker: Lighthouse & Core Web Vitals

Pricing

from $2.00 / 1,000 page auditeds

Go to Apify Store
Bulk PageSpeed Insights Checker: Lighthouse & Core Web Vitals

Bulk PageSpeed Insights Checker: Lighthouse & Core Web Vitals

Run Google PageSpeed Insights on hundreds of URLs: Lighthouse performance, accessibility, best-practices and SEO scores, Core Web Vitals (lab + real-user CrUX incl. INP, LCP, CLS) and top fixes per page. Mobile, desktop or both. No API key needed to start. $3.00 per 1,000 audits.

Pricing

from $2.00 / 1,000 page auditeds

Rating

0.0

(0)

Developer

Aaron Allday

Aaron Allday

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

10 days ago

Last modified

Share

Who it's for: SEO agencies, web developers, site owners and performance teams who check page speed for many URLs.

The problem it solves: pagespeed.web.dev checks one URL at a time, and the raw API returns huge JSON. This Actor audits a whole URL list and gives you one row per page and device with scores, Core Web Vitals and the top fixes.

Use cases:

  • Core Web Vitals audits for a whole site (pair with Sitemap URL Extractor)
  • Weekly performance monitoring on a schedule
  • Agency client reports and competitor speed comparisons
  • Before/after checks for releases and migrations

Quick example: {"urls":[{"url":"https://example.com"}],"strategy":"mobile"} → one row per URL and device: performanceScore, accessibilityScore, seoScore, coreWebVitalsAssessment, lab and field metrics (LCP, INP, CLS…), opportunities.

Price: $3.00 per 1,000 audits. Comparable PageSpeed/Lighthouse Actors in the Store charge about $2 to $80 per 1,000 URLs. Failed, skipped and retried audits are free.

Run Google PageSpeed Insights on hundreds of URLs at once and get every result in one table: Lighthouse Performance, Accessibility, Best Practices and SEO scores, Core Web Vitals (lab data plus real-user Chrome UX Report field data), and the top fixes for each page, on mobile, desktop or both.

It uses Google's official PageSpeed Insights API v5, so you get the same numbers as pagespeed.web.dev. There's no browser to run and no proxies, which makes it cheap and reliable.

What you get for each URL and device

  • Scores (0–100): performance, accessibility, best practices, SEO
  • Core Web Vitals, field data: 28-day p75 from real Chrome users (CrUX) for LCP, INP, CLS, FCP and TTFB, each rated FAST / AVERAGE / SLOW, for both the page and the whole origin
  • Core Web Vitals verdict: PASSED / FAILED / NO_FIELD_DATA, the same pass/fail result PageSpeed shows
  • Lab metrics (Lighthouse): LCP, CLS, TBT (the lab stand-in for INP), FCP, Speed Index, TTI, server response time, total page weight
  • Top opportunities: ranked by estimated time saved, e.g. "Reduce unused JavaScript: 3,000 ms / 907 KiB"
  • Failed audits: accessibility, SEO and best-practices checks that failed
  • A link to the full report on pagespeed.web.dev

Use cases

  • SEO and Core Web Vitals audits of a whole site. Pair it with Sitemap URL Extractor to get every URL first.
  • Weekly performance monitoring: schedule runs and track scores over time.
  • Agency client reports and comparisons with competitors
  • Checks before and after a release or migration
  • No key needed for quick checks. Runs without a key use the Actor's built-in Google API key, up to 30 audits per run (one audit = one URL on one device). Extra URLs are listed as "status": "skipped" rows and are not charged. The limit keeps the shared quota fair for everyone.
  • Big jobs: bring your own free key. Paste your own Google API key into Google API key for unlimited audits per run, at up to 25,000 audits a day on Google's free quota. It takes about 2 minutes and needs no billing: get a key, click "Get a Key" and copy it. Your key is stored as a secret input.
  • If Google's quota is ever used up, the run still finishes cleanly with a clear message and an error row, and nothing is charged.

Input

FieldDefaultDescription
urlshttps://crawlee.devPages to audit (max 30 audits per run without your own key)
apiKey–Your free Google API key (stored as a secret)
strategymobilemobile, desktop or both (both = 2 audits per URL)
categoriesall fourperformance, accessibility, best-practices, seo
maxConcurrency4Parallel audits (capped at 4 when using the built-in key)
maxOpportunities5Top opportunities per audit
localeenLanguage of audit titles
maxRetries4Retries on 429, 5xx and timeouts, with exponential backoff
requestTimeoutSecs120Timeout per audit
includeRawResponsefalseAttach the full PSI JSON (large)
{
"urls": [{ "url": "https://example.com" }, { "url": "https://example.com/pricing" }],
"strategy": "both",
"apiKey": "AIza...",
"maxConcurrency": 8
}

Output example

This is a real result from a cloud run on 10 Oct 2026 (crawlee.dev, mobile; originField is omitted here for brevity):

{
"url": "https://crawlee.dev/",
"finalUrl": "https://crawlee.dev/",
"strategy": "mobile",
"status": "success",
"performanceScore": 47,
"accessibilityScore": 95,
"bestPracticesScore": 96,
"seoScore": 92,
"coreWebVitalsAssessment": "FAILED",
"lab": {"lcpMs": 11938, "cls": 0, "tbtMs": 823, "fcpMs": 1812, "speedIndexMs": 7838, "ttiMs": 22354, "serverResponseMs": 2, "totalByteWeight": 2674545},
"field": {"overallCategory": "AVERAGE", "isOriginFallback": false, "lcpMs": 2894, "lcpCategory": "AVERAGE", "inpMs": 305, "inpCategory": "AVERAGE", "cls": 0, "clsCategory": "FAST", "fcpMs": 2363, "fcpCategory": "AVERAGE", "ttfbMs": 880, "ttfbCategory": "AVERAGE"},
"opportunities": [
{"id": "cache-insight", "title": "Use efficient cache lifetimes", "displayValue": "Est savings of 782 KiB", "savingsMs": 2550, "savingsBytes": 0},
{"id": "unused-javascript", "title": "Reduce unused JavaScript", "displayValue": "Est savings of 866 KiB", "savingsMs": 1950, "savingsBytes": 886455},
{"id": "render-blocking-insight", "title": "Render-blocking requests", "displayValue": "Est savings of 1,200 ms", "savingsMs": 1200, "savingsBytes": 0}
],
"failedAudits": [
{"category": "accessibility", "id": "color-contrast", "title": "Background and foreground colors do not have a sufficient contrast ratio."},
{"category": "accessibility", "id": "landmark-one-main", "title": "Document does not have a main landmark."}
],
"lighthouseVersion": "13.5.0",
"fetchTime": "2026-10-10T17:14:35.441Z",
"reportUrl": "https://pagespeed.web.dev/analysis?url=https%3A%2F%2Fcrawlee.dev%2F&form_factor=mobile"
}

Failed URLs appear as "status": "error" rows that say why (for example, Lighthouse couldn't load the page), and they are never charged.

Pricing

Pay per event: $3.00 per 1,000 audits ($0.003 per audit). One audit = one URL on one device, so "strategy": "both" counts as 2 audits per URL. Platform usage is included. Failed audits, retries, skipped URLs and error rows are free. Set a maximum cost per run and the Actor stops starting new audits when it reaches that limit.

Examples: 100 pages on mobile cost $0.30. A 1,000-page site on mobile and desktop costs $6.00.

More no-login, pay-per-result tools from the same developer:

Use together

Extract a site's URLs with Sitemap URL Extractor (e.g. "includeRegex": "/products/", "maxUrls": 30), then pass the url column of its dataset as urls here. You can do this by hand, with an Apify integration ("Run another Actor when this one succeeds"), or in code:

const { defaultDatasetId } = await client.actor('aaronallday89/sitemap-url-extractor').call({ startUrls: [{ url: 'https://example.com' }], includeRegex: '/products/', maxUrls: 30 });
const { items } = await client.dataset(defaultDatasetId).listItems({ fields: ['url'] });
await client.actor('aaronallday89/pagespeed-bulk-audit').call({ urls: items.map((i) => ({ url: i.url })), strategy: 'both' });

FAQ

Why are the field data / Core Web Vitals empty? Google only has real-user (CrUX) data for pages and origins with enough Chrome traffic. Smaller sites show NO_FIELD_DATA, but you still get the lab metrics.

Why is my score different from the last run? Lighthouse lab scores naturally vary by a few points from run to run. Field data is a 28-day rolling average and changes slowly.

Where's lab INP? Lighthouse can't measure INP in a lab test, so it reports Total Blocking Time (TBT) instead. Real-user INP is in field.inpMs.

How fast is it? Each audit takes about 10–40 seconds on Google's side (the cloud test took 30 seconds). With your own key and concurrency 8, that's roughly 15–40 audits a minute.

Does it run Lighthouse itself? No. Google runs Lighthouse on its own servers through the official API, which is why it's cheap and matches pagespeed.web.dev.

Why is there a 30-audit limit? It applies only when you don't provide a key, because the built-in key's daily quota is shared by all users. Add your own free key and the limit goes away.

I got "Invalid API key" or "Access denied". Make sure the key is copied correctly and that the PageSpeed Insights API is enabled for its Google Cloud project.

More tools from the same developer