PageSpeed Insights & Core Web Vitals Checker - Bulk avatar

PageSpeed Insights & Core Web Vitals Checker - Bulk

Pricing

from $8.00 / 1,000 tested pages

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

PageSpeed Insights & Core Web Vitals Checker - Bulk

Run Google PageSpeed Insights in bulk for any list of URLs and export Lighthouse scores, Core Web Vitals (LCP, INP, CLS) and real-user CrUX field data for mobile and desktop through Google's official API. $10 per 1,000 tests, platform usage included.

Pricing

from $8.00 / 1,000 tested pages

Rating

0.0

(0)

Developer

Rosario Vitale

Rosario Vitale

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

What does PageSpeed Insights & Core Web Vitals Checker do?

Run Google PageSpeed Insights in bulk for any list of URLs and export Lighthouse scores, Core Web Vitals (LCP, INP, CLS) and real-user CrUX field data for mobile and desktop through Google's official API.

Paste up to 1,000 URLs and get one clean row per URL and device:

  • Lighthouse scores (0-100) for Performance, Accessibility, Best Practices and SEO.
  • Lab metrics from the Lighthouse run: LCP, CLS, TBT, FCP, Speed Index and Time to Interactive.
  • Real-user field data from the Chrome UX Report (CrUX): 75th-percentile LCP, INP, CLS, FCP and TTFB with Google's FAST / AVERAGE / SLOW rating, for the page and for the whole origin when Google has enough traffic data.
  • Core Web Vitals assessment (PASSED / FAILED) computed the same way PageSpeed Insights shows it.
  • Top opportunities: the Lighthouse fixes with the largest estimated savings in milliseconds and bytes.

It calls the official PageSpeed Insights API v5 only. There is no scraping, no browser to manage and no login wall. Every row has a status, and a URL that fails never stops the run and is never charged.

Who is it for?

  • SEO agencies and consultants who report Core Web Vitals for many client pages each month.
  • Technical SEO and web performance teams checking templates, landing pages or a whole sitemap after a release or migration.
  • Developers who want PageSpeed scores in CI, dashboards, Google Sheets or a data warehouse without writing a PSI client with retries and quota handling.
  • Marketers and growth teams benchmarking their speed against competitor pages.
  • AI agents that need structured, reliable page speed data on demand.

Output fields

FieldDescription
urlTested URL (normalized, fragment removed).
strategymobile or desktop.
statusCOMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT or UPSTREAM_FAILED (see FAQ).
finalUrlURL Lighthouse ended on after redirects.
fetchTimeWhen Google ran the Lighthouse test (ISO 8601).
scoresperformance, accessibility, bestPractices, seo (0-100, null if not requested).
performanceScorePerformance score, repeated at top level for easy sorting.
labMetricslcpMs, cls, tbtMs, fcpMs, speedIndexMs, ttiMs.
fieldData.pageCrUX URL-level lcp, inp, cls, fcp, ttfb (each {percentile, category}) and overallCategory, or null.
fieldData.originThe same CrUX metrics for the whole origin, or null.
coreWebVitalsPASSED / FAILED field assessment (page data first, origin data as fallback), or null without CrUX data.
coreWebVitalsSourcepage or origin: which field data the assessment uses.
opportunitiesTop fixes: id, title, savingsMs, savingsBytes, displayValue.
lighthouseVersionLighthouse version used by Google.
runWarningsLighthouse warnings, e.g. a redirect or a slow server.
errorCode, errorWhy a row is not COMPLETE.
attemptsAPI attempts used, including retries.

How much does it cost?

You pay $0.01 per successful test ($10 per 1,000). One test is one URL on one device, so a URL tested on mobile and desktop counts as two tests.

Example: 50 URLs on mobile and desktop = 100 tests = $1.00, plus a run start fee of $0.0001 per GB of run memory (the default 256 MB run pays $0.0001).

Subscriber discounts: on a paid Apify plan you pay less per test: Bronze −10%, Silver −15%, Gold and higher −20% ($8 per 1,000 tests on Gold).

Apify platform usage (compute, storage, data transfer) is included. You pay only the per-test price plus the small start fee.

Only successful results are charged. Rows with VALID_EMPTY, INVALID_INPUT or UPSTREAM_FAILED status (unreachable pages, bad URLs, Google quota errors) are free. Use the run's maximum charge setting to cap spending: the Actor stops starting new tests once the limit is reached.

How to use it

  1. Click Try for free and paste your URLs into URLs to test (one per line). A bare domain such as example.com is fine.
  2. Choose the Device strategy: mobile, desktop or both.
  3. Keep or trim the Lighthouse categories. Performance is enough if you only need Core Web Vitals.
  4. Optional: add your own free PageSpeed Insights API key to run up to 10 tests in parallel. Without one the Actor uses its built-in shared key (2 tests in parallel). If that shared daily quota is ever used up, you get UPSTREAM_FAILED rows with errorCode DAILY_QUOTA_EXCEEDED (free) and the run stops calling Google. Without your own key it also runs only two tests at a time. To get a key, open the Google Cloud console, enable the PageSpeed Insights API and create an API key. The key is stored as an encrypted secret and never appears in the dataset or log.
  5. Click Start. One URL on both devices usually finishes in under a minute. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

Rate limits are handled for you: HTTP 429 and 5xx answers are retried with exponential backoff (honouring Retry-After), and concurrency stays low without a key. If the daily quota is used up or the API key is rejected, the run stops calling Google at once and marks the remaining tests as not run (free).

Input example

{
"urls": ["https://example.com/", "https://www.wikipedia.org/"],
"strategy": "both",
"categories": ["performance", "accessibility", "best-practices", "seo"],
"includeFieldData": true,
"includeOpportunities": true,
"maxOpportunities": 5
}

Output example

{
"recordType": "result",
"url": "https://www.wikipedia.org/",
"strategy": "mobile",
"status": "COMPLETE",
"finalUrl": "https://www.wikipedia.org/",
"fetchTime": "2026-10-03T10:00:01.000Z",
"lighthouseVersion": "12.6.0",
"scores": { "performance": 91, "accessibility": 88, "bestPractices": 100, "seo": 92 },
"performanceScore": 91,
"labMetrics": { "lcpMs": 2346, "cls": 0.012, "tbtMs": 120, "fcpMs": 1100, "speedIndexMs": 1801, "ttiMs": 3200 },
"fieldData": {
"page": {
"lcp": { "percentile": 2100, "category": "FAST" },
"inp": { "percentile": 150, "category": "FAST" },
"cls": { "percentile": 0.05, "category": "FAST" },
"fcp": { "percentile": 1300, "category": "FAST" },
"ttfb": { "percentile": 600, "category": "FAST" },
"overallCategory": "FAST",
"originFallback": false,
"scope": "https://www.wikipedia.org/"
},
"origin": { "lcp": { "percentile": 2900, "category": "AVERAGE" }, "overallCategory": "AVERAGE" },
"available": true
},
"coreWebVitals": "PASSED",
"coreWebVitalsSource": "page",
"opportunities": [
{ "id": "unused-javascript", "title": "Reduce unused JavaScript", "savingsMs": 900, "savingsBytes": 122880, "displayValue": "Potential savings of 120 KiB" },
{ "id": "render-blocking-resources", "title": "Eliminate render-blocking resources", "savingsMs": 450, "savingsBytes": null, "displayValue": "Potential savings of 450 ms" }
],
"runWarnings": [],
"errorCode": null,
"error": null,
"attempts": 1
}

The values above are illustrative; the origin block is shortened. A run summary (counts per status, key source) is saved as SUMMARY in the run's key-value store.

API

One HTTP call runs the Actor and returns the results directly:

curl -X POST "https://api.apify.com/v2/acts/zenomastro~pagespeed-insights-bulk/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://example.com/"], "strategy": "mobile", "categories": ["performance"]}'

For long URL lists, start the run asynchronously (/runs) and read the dataset when it finishes, or attach a webhook. The same works from the Apify Python and JavaScript clients, Make, n8n, Zapier, LangChain and LlamaIndex, or on a schedule for weekly Core Web Vitals monitoring.

Use with AI agents (MCP)

Claude, ChatGPT, Cursor, VS Code, n8n AI agents and any MCP client can run this Actor through the official Apify MCP server. Add https://mcp.apify.com?tools=zenomastro/pagespeed-insights-bulk to your client, then ask, for example:

"Run PageSpeed Insights on these five landing pages for mobile and tell me which ones fail Core Web Vitals and the biggest fix for each."

The agent fills the input from the field descriptions and gets clean JSON with a status on every row, so it can tell a slow page from a failed test.

Frequently asked questions

Is this the same data as pagespeed.web.dev? Yes. The Actor calls Google's official PageSpeed Insights API v5, which runs the same Lighthouse test and returns the same CrUX field data as the PageSpeed Insights website.

Do I need a Google API key? No. The Actor works out of the box with its built-in shared key. Your own free key raises parallel tests from 2 to 10 and gives you a quota no other user can use up. If the shared quota is ever used up for the day, the affected rows come back as UPSTREAM_FAILED with errorCode DAILY_QUOTA_EXCEEDED, are not charged, and the run skips the remaining URLs instead of retrying. Your own key is free, gives you Google's much larger per-key quota and lets you raise Parallel tests up to 10.

What do the status values mean? COMPLETE: every requested score and lab metric was returned. PARTIAL: Lighthouse ran but some scores or metrics are missing (charged, because the test ran). VALID_EMPTY: Google could not measure the page, e.g. it returned an HTTP error, failed DNS or painted nothing (not charged). INVALID_INPUT: the URL is malformed, private or local, or Google rejected the request, e.g. an invalid API key (not charged). UPSTREAM_FAILED: Google's API failed, kept rate-limiting after all retries or the daily quota is used up (not charged; run those URLs again, ideally with your own API key).

Why is fieldData empty for my page? CrUX only has data for pages and origins with enough real Chrome traffic in the last 28 days. Low-traffic pages get lab scores only. fieldData.origin often still has data when the page itself does not.

Why do my scores change between runs? Lighthouse lab results vary with network and server conditions. Field data is a 28-day rolling window and changes slowly. For trends, schedule the same URL list weekly and compare.

How long does a run take? Google needs about 10-40 seconds per test. Without a key, two tests run in parallel; with a key, up to 10.

Is it allowed to test any site? The test is run by Google's public PageSpeed Insights service on publicly reachable URLs. The Actor does not log in, bypass paywalls or collect personal data.

Why use this Actor?

Run Google PageSpeed Insights in bulk for any list of URLs and export Lighthouse scores, Core Web Vitals (LCP, INP, CLS) and real-user CrUX field data for mobile and desktop through Google's official API. $10 per 1,000 tests, platform usage included.

Features

  • URLs to test — Public page URLs to run through Google PageSpeed Insights, e.g. https://example.com/. Up to 1,000 unique URLs per run; duplicates are tested once. Each URL is tested once per device strategy.
  • Device strategy — Lighthouse device emulation. "Mobile and desktop" produces two results (and two charges) per URL.
  • Lighthouse categories — Lighthouse category scores (0-100) to include. Lab Core Web Vitals metrics and opportunities come from the Performance category.
  • Google PageSpeed Insights API key (recommended) — Your free Google Cloud API key with the PageSpeed Insights API enabled (recommended). Without it the Actor uses a shared quota that can be used up for the day, and runs at most 2 tests in parallel; with your own key you get Google's much larger per-key quota and faster bulk runs. Stored encrypted and never written to the dataset or log.
  • Include real-user CrUX field data — Add Chrome UX Report 75th-percentile LCP, INP, CLS, FCP and TTFB with FAST/AVERAGE/SLOW categories for the page and its origin, when Google has enough real-user traffic data.
  • Include top opportunities — Add the Lighthouse opportunities with the largest estimated savings (id, title, savings in ms and bytes).
  • Maximum opportunities per result — How many opportunities to keep per URL and strategy, ordered by estimated time savings.
  • Report language — Locale for audit titles, e.g. en, de, it, pt-BR.
  • Parallel tests — PageSpeed tests running at the same time. Without your own API key this is capped at 2 to respect the shared quota; with your own key you can use up to 10.
  • Timeout per test (seconds) — Maximum time to wait for one PageSpeed Insights answer. Lighthouse usually needs 10-40 seconds per page.
  • Retries on rate limits and server errors — How often a test is retried after HTTP 429, 5xx, timeouts or network errors, with exponential backoff that honours Retry-After. Failed attempts are never charged.

Use cases

  • Bulk core web vitals audits.
  • Technical seo reporting.
  • Release and migration speed qa.
  • Competitor page speed benchmarking.

Example input

{
"urls": [
"https://example.com"
],
"strategy": "both",
"categories": [
"performance",
"accessibility",
"best-practices",
"seo"
],
"includeFieldData": true,
"includeOpportunities": true,
"maxOpportunities": 5
}

Pricing & cost control

The primary event costs $0.010000 per tested page (about $10.00 per 1,000 successful primary events). Only successful primary events are intentionally billed by this Actor; summary/status rows add context without adding primary-event charges.

Use the bounded input limits and filters to keep both event charges and platform usage predictable.

FAQ

What is this Actor for?
It is designed for bulk Core Web Vitals audits, technical SEO reporting, release and migration speed QA.

Can I run it on a schedule?
Yes. You can schedule Actor runs on Apify and send the resulting dataset into automations, webhooks, storage, or downstream APIs.

How do I control cost and run size?
Use the input limits and filters shown in the Actor input form. The Actor applies bounded defaults and hard caps so large jobs remain predictable.