How to check Core Web Vitals (one page or many)

Core Web Vitals are three numbers: loading (LCP), responsiveness (INP) and visual stability (CLS). Here is how to measure them, and which numbers Google actually uses.

The thresholds

MetricGoodPoor
LCP (Largest Contentful Paint)≤ 2.5 s> 4 s
INP (Interaction to Next Paint)≤ 200 ms> 500 ms
CLS (Cumulative Layout Shift)≤ 0.1> 0.25

A page passes when the 75th percentile of real visits is "good" on all three.

Lab data vs field data

Field data comes from real Chrome users (the Chrome UX Report) over the last 28 days. That is what Search Console and the top of PageSpeed Insights show, and what Google uses. Small sites often have none: there is not enough traffic. Lab data is one simulated load by Lighthouse. It is available for every page and good for finding causes, but it cannot measure INP, because nobody clicks anything. Total Blocking Time (TBT) is the lab stand-in for INP.

1. One page: PageSpeed Insights

Enter the URL at pagespeed.web.dev. The top section is field data (if Google has enough), the bottom is a Lighthouse lab run with a list of fixes.

2. From your computer: Lighthouse

npx lighthouse https://example.com/ --only-categories=performance --view
npx lighthouse https://example.com/ --only-categories=performance --preset=desktop --view

Needs Node.js and Chrome. The first command tests as a mid-range phone on a throttled connection (the default), the second as a desktop. --view opens the HTML report. For example.com both runs took about 11 seconds; scores vary a few points between runs, so compare several runs before and after a change.

3. A list of URLs to CSV (Lighthouse + jq)

Put one URL per line in urls.txt and run this with bash:

echo "url,score,lcp_ms,cls,tbt_ms" > vitals.csv
while read -r url; do
  npx lighthouse "$url" --only-categories=performance --chrome-flags="--headless=new" \
    --output=json --output-path=report.json --quiet
  jq -r --arg u "$url" '[$u, .categories.performance.score*100,
    (.audits["largest-contentful-paint"].numericValue|round),
    ((.audits["cumulative-layout-shift"].numericValue*1000|round)/1000),
    (.audits["total-blocking-time"].numericValue|round)] | @csv' report.json >> vitals.csv
done < urls.txt
cat vitals.csv

Each row is a mobile lab run: performance score (0–100), LCP and TBT in milliseconds, and CLS. Our test run of two URLs gave example.com 100 (LCP 0.8 s) and sitemaps.org 93 (LCP 2.2 s, TBT 236 ms) in about 25 seconds. Add --preset=desktop for desktop numbers.

Many URLs, with real-user data, without installing anything

Our Bulk PageSpeed Insights & Core Web Vitals Checker on Apify takes a list of URLs and returns one row per page and device: Lighthouse scores, lab metrics and the top fixes. Add your free Google API key and it also returns the real-user (field) LCP, INP and CLS with their ratings. Billed per tested page.

Frequently asked questions

How do I check Core Web Vitals for my whole site?

Search Console's Core Web Vitals report groups your pages by status using field data. For a list of specific URLs, run Lighthouse in a loop (script on this page) or a bulk checker.

Why is my PageSpeed score good but Core Web Vitals fail?

The score is a lab result from one simulated load. Core Web Vitals are measured on real visitors' devices and connections, which are often slower.

Why does PageSpeed Insights say there is no field data?

Your page or site does not have enough Chrome visits in the last 28 days for the Chrome UX Report. Use lab data until it does.

Does Lighthouse measure INP?

No. INP needs real interactions. Lighthouse reports Total Blocking Time as a lab proxy.

Written with AI assistance. The Lighthouse commands (Lighthouse 12.8.2, headless Chromium; without --view, which only opens the report) and the bulk script were run on example.com and sitemaps.org on 2026-10-01, mobile and desktop. The Apify tool is ours; the APIs are free to call directly.