PageSpeed & Core Web Vitals Monitor avatar

PageSpeed & Core Web Vitals Monitor

Pricing

from $4.00 / 1,000 url auditeds

Go to Apify Store
PageSpeed & Core Web Vitals Monitor

PageSpeed & Core Web Vitals Monitor

Run Google PageSpeed Insights on a list of URLs (mobile, desktop or both). Get the performance score, LCP, CLS, TBT, FCP, TTFB, real-user Core Web Vitals, top fixes, and a regression flag versus the previous run.

Pricing

from $4.00 / 1,000 url auditeds

Rating

0.0

(0)

Developer

Matias Isnard

Matias Isnard

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Give it a list of URLs. For each URL and device (mobile, desktop or both) it runs one Google PageSpeed Insights audit and returns:

  • the Lighthouse performance score (0-100), plus accessibility, best practices and SEO scores if you ask for them
  • lab values from that run: LCP, CLS, TBT, FCP, TTFB (server response time) and Speed Index
  • real-user Core Web Vitals from the Chrome UX Report (LCP, CLS, INP, FCP, TTFB at the 75th percentile), for the URL and for the whole origin, when Google has enough traffic data
  • the 5 failed performance audits with the largest estimated time savings
  • the change since the previous run for the same URL and device, and a regressed flag when the score dropped by more than your threshold

Run it on a schedule and you have a simple performance monitor: filter the dataset on regressed = true to see which pages got slower.

The audits run on Google's servers through the official PageSpeed Insights API v5. The Actor does not load the pages itself.

Input

{
"urls": ["https://example.com/", "https://example.com/pricing"],
"apiKey": "YOUR_OWN_KEY",
"strategy": "both",
"categories": ["performance", "seo"],
"regressionThreshold": 5
}
  • urls (required): pages to audit. https:// is added when missing. Duplicates are audited once. Invalid lines are skipped with a warning and are not charged.
  • apiKey: your own PageSpeed Insights API key (free, see below). It is a secret input, stored encrypted, and only sent to Google. Optional, but requests without a key share one small global quota and usually fail with HTTP 429.
  • strategy: mobile (default), desktop or both. both means two audits and two results per URL.
  • categories: performance is always included. Add accessibility, best-practices or seo to get those scores too.
  • regressionThreshold (default 5): points of performance score the page may lose before regressed becomes true. Lighthouse scores move a few points between runs even when nothing changed, so values below 5 give false alarms.

How to get a free PSI API key

  1. Open https://console.cloud.google.com/ and sign in with a Google account.
  2. Create a project (top bar, project picker, New project). Any name works.
  3. Go to APIs & Services, Library, search for "PageSpeed Insights API" and click Enable.
  4. Go to APIs & Services, Credentials, Create credentials, API key. Copy the key.
  5. Recommended: click the new key, under API restrictions choose "Restrict key" and select only PageSpeed Insights API. Save.
  6. Paste the key into the apiKey field of this Actor.

The default quota is shown in the Cloud Console under APIs & Services, PageSpeed Insights API, Quotas (commonly 25,000 queries per day per project, check yours there).

Output

One dataset item per URL and device. Shortened example:

{
"url": "https://example.com/",
"strategy": "mobile",
"audited_at": "2026-10-29T06:00:12+00:00",
"final_url": "https://example.com/",
"lighthouse_version": "13.6.0",
"performance_score": 72,
"scores": { "performance": 72, "seo": 92 },
"lab": { "lcp_ms": 3850, "cls": 0.02, "tbt_ms": 310, "fcp_ms": 1900, "ttfb_ms": 420, "speed_index_ms": 3100 },
"field_url": {
"id": "https://example.com/",
"overall_category": "AVERAGE",
"lcp_ms": { "p75": 2900, "category": "AVERAGE" },
"cls": { "p75": 0.05, "category": "FAST" },
"inp_ms": { "p75": 180, "category": "FAST" },
"fcp_ms": { "p75": 1700, "category": "FAST" },
"ttfb_ms": { "p75": 900, "category": "AVERAGE" }
},
"field_origin": { "...": "same shape, for the whole origin" },
"opportunities": [
{ "id": "image-delivery-insight", "title": "Improve image delivery", "savings_ms": 1200, "savings_bytes": null, "display_value": "Est savings of 450 KiB" }
],
"warnings": [],
"previous_score": 81,
"previous_audited_at": "2026-10-22T06:00:09+00:00",
"score_delta": -9,
"lab_delta": { "lcp_ms": 900, "cls": 0.0, "tbt_ms": 120, "fcp_ms": 150, "ttfb_ms": 30, "speed_index_ms": 400 },
"regressed": true,
"errors": []
}

Notes on the fields:

  • Lab data has TBT instead of INP: INP needs real user interaction, so it only exists in field data.
  • field_url and field_origin are null when the Chrome UX Report has no data (common for small sites and new pages). When Google only has origin data, field_url is null and field_origin is filled.
  • savings_ms is Lighthouse's own estimate. Opportunities overlap, so the savings do not add up.
  • On the first run for a URL and device, previous_score and score_delta are null and regressed is false.

Problems are reported in errors for that URL instead of failing the run.

Comparison with the previous run

After each successful audit the Actor saves the score and lab values in a named key-value store called pagespeed-monitor-history in your Apify account, one record per URL and device. The next run reads it to compute score_delta, lab_delta and regressed. Only the last run is kept. Delete the store to start over.

Scheduling example

  1. In Apify Console open this Actor and fill in the input (URLs, your API key, strategy). Click Save as a new task.
  2. Go to Schedules, Create new schedule. Cron expression 0 6 * * 1 runs every Monday at 06:00 (UTC by default, you can pick a time zone).
  3. Add the task to the schedule and save.
  4. Optional: in the task's Integrations tab add an email or Slack integration on "Run succeeded", then open the run's dataset and filter on regressed.

You can also call the dataset API with ?clean=true&fields=url,strategy,performance_score,score_delta,regressed to get a small table for a dashboard or a spreadsheet.

Errors, retries and quota

  • HTTP 429 (per-minute limit) and 5xx responses are retried up to 3 times, waiting 10, 30 and 90 seconds (or what the Retry-After header says).
  • When the daily quota is used up, or the key is invalid or not enabled, the remaining URLs are not sent to Google. They get a result with the reason in errors.
  • A page Lighthouse cannot load (DNS error, 404, timeout on Google's side) returns an error from the API. It is reported for that URL and not charged.
  • At most 4 audits run at the same time.

Pricing

Pay per event: you pay for each URL and device that was audited successfully (url-audited event). Failed audits and skipped URLs are not charged. Using your own API key costs nothing on the Google side within the free quota. You can cap the cost of a run with the "Maximum cost per run" setting; the Actor stops sending new audits when the cap is reached.

Data source and terms

Results come from the Google PageSpeed Insights API and are subject to the Google APIs Terms of Service (https://developers.google.com/terms). The requests are made with your API key, so the usage counts against your own Google Cloud project. This Actor is not made by, affiliated with or endorsed by Google.

Google has announced that it plans to stop including Chrome UX Report field data in the PageSpeed Insights API, without a date (https://developers.google.com/speed/docs/insights/v5/get-started). When that happens field_url and field_origin will be null and the lab values, scores and opportunities keep working.

Limitations

  • Lab values come from a single Lighthouse run on Google's servers, with simulated throttling. They vary between runs. Use the threshold, and look at trends over several runs before acting.
  • Pages behind a login, on a private network or blocking Google's crawler cannot be audited.
  • Field data is a rolling 28-day window, so it changes slowly after a fix.
  • The history keeps only the previous run, not a full time series. Export the datasets if you want long-term charts.

Run locally

python -m venv .venv
.venv/Scripts/pip install -r requirements.txt # on Linux/macOS: .venv/bin/pip
# put input in storage/key_value_stores/default/INPUT.json
.venv/Scripts/python -m my_actor
python -m unittest discover -s tests -t .

Author: Matias Isnard.