Lighthouse Audit API: Core Web Vitals and Performance Scores avatar

Lighthouse Audit API: Core Web Vitals and Performance Scores

Pricing

from $6.00 / 1,000 page auditeds

Go to Apify Store
Lighthouse Audit API: Core Web Vitals and Performance Scores

Lighthouse Audit API: Core Web Vitals and Performance Scores

Run Lighthouse on any public page and get Performance, Accessibility, Best Practices and SEO scores, lab Core Web Vitals and the biggest savings. No Google key, robots.txt obeyed, pay only per page audited.

Pricing

from $6.00 / 1,000 page auditeds

Rating

0.0

(0)

Developer

Rowcraft

Rowcraft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Run Lighthouse on any public web page without a Google API key. Give the actor a list of addresses and it audits each one in its own headless Chrome: the Performance, Accessibility, Best Practices and SEO scores, the lab Core Web Vitals (Largest Contentful Paint, Total Blocking Time, Cumulative Layout Shift), the other speed metrics, the five biggest time savings and the audits that failed. You get one dataset row per page and device as JSON, CSV or Excel, and the complete Lighthouse HTML report of every page in the key-value store of the run.

It is built for the checks that come back every week: a performance budget for the pages of a site, a before-and-after comparison around a release, mobile against desktop, a client report with real numbers, or a schedule that tells you when a page drops below a score you set. Nothing is installed, no quota is shared with other users, and you pay only for pages that were actually audited.

Input form of Lighthouse Audit API: Core Web Vitals and Performance Scores

What you get

One row per page audited, with 25 fields:

  • The page: the address you gave, the address Lighthouse ended on after redirects, the HTTP status and the device (mobile or desktop)
  • The four scores: performanceScore, accessibilityScore, bestPracticesScore and seoScore, whole numbers from 0 to 100, or null for a category you did not ask for
  • The lab metrics: First Contentful Paint, Largest Contentful Paint, Total Blocking Time, Cumulative Layout Shift, Speed Index, Time to Interactive, server response time, total transfer size in bytes and the number of requests
  • What to fix: topOpportunities, the five biggest time savings Lighthouse found with the estimated milliseconds, and failedAudits, the ids of the audits that scored below 0.9
  • The full report: reportUrl, a link to the complete Lighthouse HTML report of that page, the same report you would get from DevTools
  • The audit itself: the Lighthouse version, the time of the audit and any warnings Lighthouse gave about the run

The run also writes a COVERAGE record with one line per page and device you asked for (ok, blocked, robots_disallowed, not_found, timeout, error or not_checked, with the reason) and a RUN_SUMMARY with the counts, the average audit time, the browser and Lighthouse version, the pages below your performance threshold and any warnings.

Why this actor

  • No Google key and no shared quota. The audit is run by Lighthouse in a Chrome of our own, not fetched from a Google service, so there is no API key to create, no daily limit to hit and no rate limit shared with other users.
  • Pay for audits, not attempts. A page that answers with an anti-bot page, an HTTP error, a robots.txt refusal or a timeout is listed in COVERAGE and costs nothing. So do duplicates, invalid entries and, with Only new rows, pages whose scores did not change.
  • Mobile, desktop or both in one run. The mobile audit uses the same phone profile that Google tests first (a slow 4G connection and a 4x slower processor); the desktop audit uses a wide screen on a fast connection. With Both every page gets two rows.
  • The report comes with the numbers. Every row links to the full Lighthouse report: filmstrip, every audit with its explanation and the list of resources behind each saving. Switch it off if you only need the numbers.
  • A threshold for schedules. Set alertBelowPerformance and the end-of-run notification lists the pages delivered in that run whose Performance score is under it.
  • Polite by design. robots.txt is read for every site (and every redirect target) before the page is opened, audits run one at a time, requests to the same site are spaced out and the visit carries a user agent that names Rowcraft so site owners can recognise it.

How to use it

  1. Open the Actor and fill in Pages to audit (the other fields are optional filters).
  2. Set Maximum pages to a small number for a first try (the default is a safe start).
  3. Click Start. The status line shows progress; the run stops cleanly at your limit or at the charge limit you set in the run options.
  4. Open the Dataset tab and download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
  5. To run it on a schedule, use Schedules in Apify Console and turn on Only new rows since the last run below: every run then costs only the new rows, and a webhook URL tells you when something new came in.

For the first try keep the list short: one audit takes roughly 10 to 30 seconds, depending on the page. The full report of each page is in the key-value store of the run, under the key that starts with lighthouse- and ends .html; the same link is in the reportUrl column of the dataset.

Input

FieldWhat it does
startUrlsPages to audit, one per line: a full address (https://example.com/pricing) or a domain (example.com). Every page is audited on its own; the actor never follows links. Up to 20,000 per run.
formFactormobile (default), desktop or both. Both gives two rows per page and counts as two pages in the price and in maxItems.
categoriesWhich of performance, accessibility, best-practices and seo to score. Empty = all four. Lighthouse runs only the audits of the categories you pick, so fewer categories are faster.
saveHtmlReportSave the complete Lighthouse report of each page in the key-value store and put its link in reportUrl (default on). Each report is about 0.4 to 1 MB.
alertBelowPerformanceOptional, 0 to 100. Pages delivered in this run with a Performance score under this number are listed in the notification and in RUN_SUMMARY.
maxItemsStop after this many audits are delivered. 0 = the whole list.
onlyNew, stateNameDeliver a page again only when one of its four scores changed since the last run with the same state name.
notifyUrl, notifyWhenEmptyA webhook that receives one message when the run ends; see Automation below.
requestIntervalMsPause between the requests the actor makes to the same site before an audit, default 1000 ms, minimum 250 ms.

Example: three documentation pages on mobile, all four categories.

{
"startUrls": [
"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",
"https://web.dev/",
"https://nodejs.org/en/learn"
]
}

Example: the same two pages on phone and desktop, with an alert under 80.

{
"startUrls": ["https://books.toscrape.com/", "https://webscraper.io/test-sites/e-commerce/static"],
"formFactor": "both",
"alertBelowPerformance": 80
}

Example: only SEO and Accessibility, numbers only, no report files.

{
"startUrls": ["https://www.wikipedia.org/", "https://www.iana.org/"],
"categories": ["seo", "accessibility"],
"saveHtmlReport": false
}

Output

25 fields per row. Empty values are null, never missing, so CSV and Excel columns are stable.

FieldTypeExample
idstringmobile:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
urlstringhttps://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
finalUrlstringhttps://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
formFactorstringmobile
statusCodeinteger200
performanceScoreinteger94
accessibilityScoreinteger100
bestPracticesScoreinteger96
seoScoreinteger100
firstContentfulPaintMsinteger1215
largestContentfulPaintMsinteger1750
totalBlockingTimeMsinteger40
cumulativeLayoutShiftnumber0.012
speedIndexMsinteger1530
timeToInteractiveMsinteger2100
serverResponseTimeMsinteger118
totalByteWeightinteger482113
requestCountinteger38
topOpportunitiesstringReduce unused JavaScript — 300 ms Enable text compression — 150 ms
failedAuditsstringunused-javascript, uses-long-cache-ttl, meta-description
reportUrlstringhttps://api.apify.com/v2/key-value-stores/abc123/records/lighthouse…
lighthouseVersionstring12.8.2
fetchTimestring2026-10-18T16:47:45.849Z
runWarningsstringWarnings Lighthouse gave about the run, separated by "
notestringSet when a category could not be scored on this page (the other scores are still delivered)

Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

[
{
"id": "mobile:https://books.toscrape.com/",
"url": "https://books.toscrape.com/",
"finalUrl": "https://books.toscrape.com/",
"formFactor": "mobile",
"statusCode": 200,
"performanceScore": 99,
"accessibilityScore": 87,
"bestPracticesScore": 75,
"seoScore": 91,
"firstContentfulPaintMs": 1409,
"largestContentfulPaintMs": 1829,
"totalBlockingTimeMs": 0,
"cumulativeLayoutShift": 0,
"speedIndexMs": 1409,
"timeToInteractiveMs": 1829,
"serverResponseTimeMs": 14,
"totalByteWeight": 337680,
"requestCount": 32,
"topOpportunities": "Reduce unused CSS — 150 ms",
"failedAudits": "cache-insight, font-display-insight, image-delivery-insight, network-dependency-tree-insight, render-blocking-insight, render-blocking-re…",
"reportUrl": "https://api.apify.com/v2/key-value-stores/jYbGctpLwE62cWKU2/records/lighthouse-c85d2ae3-books-toscrape-com-mobile.html?signature=xPHc89HK…",
"lighthouseVersion": "12.8.2",
"fetchTime": "2026-10-18T17:23:38.083Z",
"runWarnings": null,
"note": null
},
{
"id": "desktop:https://webscraper.io/test-sites/e-commerce/static",
"url": "https://webscraper.io/test-sites/e-commerce/static",
"finalUrl": "https://webscraper.io/test-sites/e-commerce/static",
"formFactor": "desktop",
"statusCode": 200,
"performanceScore": 48,
"accessibilityScore": 96,
"bestPracticesScore": 96,
"seoScore": 100,
"firstContentfulPaintMs": 1143,
"largestContentfulPaintMs": 2990,
"totalBlockingTimeMs": 1654,
"cumulativeLayoutShift": 0.001,
"speedIndexMs": 1846,
"timeToInteractiveMs": 3849,
"serverResponseTimeMs": 5,
"totalByteWeight": 1214859,
"requestCount": 34,
"topOpportunities": "Minimize main-thread work — 1650 ms\nReduce the impact of third-party code — 1600 ms\nReduce JavaScript execution time — 1550 ms\nEliminate…",
"failedAudits": "first-contentful-paint, largest-contentful-paint, total-blocking-time, speed-index, cache-insight, image-delivery-insight, network-depend…",
"reportUrl": "https://api.apify.com/v2/key-value-stores/jYbGctpLwE62cWKU2/records/lighthouse-1b247ad8-webscraper-io-test-sites-e-commerce-static-deskto…",
"lighthouseVersion": "12.8.2",
"fetchTime": "2026-10-18T17:24:34.256Z",
"runWarnings": null,
"note": null
}
]

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

Results of Lighthouse Audit API: Core Web Vitals and Performance Scores in the Apify dataset view

How to read the numbers

  • Scores are Lighthouse's own weighted scores: 90 to 100 is good, 50 to 89 needs work, below 50 is poor. The Performance score is a weighted mix of the lab metrics; the other three categories count passed audits. How Lighthouse weighs the metrics is described on developer.chrome.com.
  • Largest Contentful Paint (good: 2,500 ms or less) and Cumulative Layout Shift (good: 0.1 or less) are two of the three Core Web Vitals. The third, Interaction to Next Paint, needs a real person clicking, so a lab run cannot measure it; Total Blocking Time is the lab metric that moves with it and is delivered instead.
  • Milliseconds, bytes and counts are plain integers; cumulativeLayoutShift has three decimals; a metric that Lighthouse did not compute for the page, or that belongs to a category you did not ask for, is null.
  • topOpportunities has one line per saving, title — estimated milliseconds, largest first. The estimate is Lighthouse's own simulation of the page without that problem.
  • failedAudits lists the ids (for example unused-javascript, meta-description) of the audits that scored under 0.9 in the categories you asked for. Open the report to see what each one found.

Pricing

Pay per result. You pay for each page delivered to your dataset, nothing else: no subscription, no minimum, no charge for rows your filters drop or for the requests behind them.

Your Apify planPrice per 1,000 rowsPrice per row
Free plan$8.00$0.008
Starter plan$7.20$0.0072
Scale plan$6.60$0.0066
Business plan and above$6.00$0.006

Example: 1,000 pages cost $8.00 on the Free plan and $6.00 on the Business plan. Platform usage of the run (compute, storage) is included in that price and is not billed to you separately (pay per event: the actor covers it). A start event of $0.00005 is charged once per run (Apify default). Cap your spend: set Maximum total charge in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (RUN_SUMMARY in the key-value store) says why a run stopped.

Both devices on 100 pages are 200 audits: $1.60 on the Free plan and $1.20 on the Business plan. A single mobile audit costs $0.008 on the Free plan.

Automation: only changed pages, notifications, schedules

Only new rows since the last run. Turn on onlyNew and the actor remembers every page it delivered to you (in a key-value store named rowcraft-lighthouse-performance-audit-state in your Apify account). The next run with the same stateName skips what you already have and you pay only for new rows. The first run delivers everything that matches. Use a different stateName for each schedule or search so they keep separate memories.

Notification when the run ends. Put a webhook address in notifyUrl and the actor sends one JSON POST with the number of new rows, links to the dataset (JSON and CSV) and the run. It works out of the box with Slack and Discord incoming webhooks (the message is in text and content), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when there is at least one new row; notifyWhenEmpty sends it every time.

Schedules. Create a schedule in Apify Console (hourly, daily, weekly or cron) with onlyNew on. A daily schedule gives you a feed of new pages for the price of the new rows only.

Integrations. Send the results to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhooks from the Integrations tab of the Actor, with no code. Apify also offers native actions for Make, n8n and Zapier.

API, SDKs and AI agents. Every run is available through the Apify API and the official JavaScript and Python clients; the Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

What "new" means here. With onlyNew, a page and device is delivered again only when at least one of its four category scores differs from the last time it was delivered under the same stateName. A page whose four scores are unchanged is still audited, because the scores are only known after the audit, but it is not delivered and not charged; the run summary counts it under unchangedSkipped. The Performance score moves by a few points between runs even on an untouched page (see the section on limits), so for a stable signal watch the other three categories or compare the metrics yourself; the memory keeps the latest delivered scores per page and device.

Alert for schedules. Combine a daily schedule, alertBelowPerformance and notifyUrl: the message says how many pages were delivered and lists the ones under your threshold with their address, device and score. Pages that were audited but not delivered (for example unchanged ones) are not part of the list.

Use cases

  • Performance budget for a site: audit the ten pages that earn the money every night and get a message when one falls under 70.
  • Before and after a release: run the same list on the staging and production addresses, or before and after a change, and compare the scores and the five savings.
  • Mobile against desktop: formFactor: both shows which pages are fine on a laptop and slow on a phone.
  • Client and agency reports: one row per page with the numbers, and the full report as a link to attach.
  • SEO and accessibility sweeps: run only those two categories over a list of landing pages and sort by failedAudits to find the common problems first.
  • Competitor benchmarks: the same four scores and the three Core Web Vitals for your pages and theirs, in one table.
  • A data feed for dashboards: a scheduled run into Google Sheets, a warehouse or a BI tool, one row per page per day.

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

What this actor does not do

  • Give the field data from real visitors: the Chrome User Experience Report (CrUX) numbers shown by Google's PageSpeed Insights come from real Chrome users over 28 days. This actor delivers lab measurements only, exactly like Lighthouse in DevTools. Lab and field numbers answer different questions; see web.dev for the difference.
  • Audit pages behind a login, a paywall or a step that needs a click: every page is opened as a first-time visitor with empty storage, and nothing is typed or accepted on the page.
  • Crawl a site: it audits the addresses you list, never the links found on them.
  • Return identical scores on every run: Lighthouse scores move by a few points between runs because load times vary. To compare over time, always use the same device and the same list, and look at trends and not at single points.
  • Fix the page or rank it in Google: it measures and explains; the changes are yours to make.
  • Measure Interaction to Next Paint, or anything that needs real user input.
  • Solve CAPTCHAs or get around anti-bot protection: a page that answers with a challenge or an access-denied page is reported as blocked and not charged.
  • Use proxies or hide where it runs: every page is opened from the Apify platform's own network.
  • Open private or local addresses: page addresses (and redirect targets) that resolve to a private network, such as localhost, 10.x, 192.168.x or 169.254.x, are refused on the platform.

Limits and fair use

  • Speed and size of a run. Audits run one at a time in one Chrome, roughly 10 to 30 seconds per page and device. At that pace the default one-hour run timeout fits about 120 to 360 audits; for longer lists raise the timeout in the run options or split the list. The actor stops before the timeout with the summary, the coverage and the Only new rows memory saved.
  • Time limit per page. An audit that has not finished after 90 seconds is cut, listed in COVERAGE as timeout and not charged.
  • Scores vary. Expect the Performance score of the same page to differ by a few points, sometimes more on heavy pages or pages with ads and personalised content. Accessibility, Best Practices and SEO barely move. Use the same formFactor when you compare.
  • What the profiles mean. Mobile: a phone-sized screen, a simulated slow 4G connection (about 1.6 Mbps and 150 ms round trip) and a processor slowed 4x. Desktop: a wide screen, about 10 Mbps and 40 ms, no slowdown. The slowdown is simulated from one unthrottled load, the same method PageSpeed Insights uses.
  • Pace. Before each audit the actor reads robots.txt and checks the page, and those requests to the same site are at least 1,000 ms apart by default (minimum 250 ms). Lighthouse then loads the page like a browser: the page, its scripts, styles and images, and a few extra requests such as robots.txt for the SEO audit.
  • Anti-bot pages. Websites behind a bot challenge (Cloudflare, Akamai, DataDome and similar) are reported as blocked and not charged. After 10 blocked pages in a row the run stops and says why in the run summary.
  • robots.txt is obeyed for the page address, for every redirect target and for the address the browser ends on. If robots.txt disallows the address, the page is robots_disallowed; if robots.txt answers with a server error, the page is not opened, as the robots.txt standard (RFC 9309) requires. Images, scripts and styles that the page itself loads are loaded the way any browser loads them.
  • Memory. The run uses 2,048 MB: Chrome needs most of it. Audits are not run in parallel, because Lighthouse is not reliable with two audits in one browser.
  • Dataset size. The rows are small. The HTML reports are stored as files in the key-value store, which is why they are a separate switch.

Data source and licence

There is no third-party data source and no Google service is called. The actor opens the addresses you give it, runs Lighthouse (open source, Apache License 2.0, made by the Chrome team at Google and published at github.com and described at developer.chrome.com) in a headless Chrome, and delivers what Lighthouse measured. Rowcraft is independent and not affiliated with or endorsed by Google, the Chrome team or the websites the actor opens.

The visit identifies itself with a Chrome user agent, phone or desktop as the audit requires, that ends with Rowcraft-Lighthouse/1.0 (+https://apify.com/rowcraft); robots.txt is read under the product token rowcraft. The Lighthouse version is in every row (lighthouseVersion) and the browser version in RUN_SUMMARY, so a result can always be traced to the tools that made it.

Privacy: no personal data

Rowcraft actors are built not to collect personal data:

  • The rows hold addresses, scores, numbers and the ids of audits. No names, e-mail addresses, phone numbers or other fields about people are requested or delivered, and an e-mail address inside a page address is removed from the row.
  • The saved HTML report is a different matter: it shows what Lighthouse saw on the page, including its small screenshots and the addresses of the files it loaded. You choose the pages, so you are responsible for the reports you keep and share; turn saveHtmlReport off to keep only the numbers.
  • Each audit starts from a clean browser profile with no cookies, no login and no stored data.
  • The actor sends no form data, stores nothing about the pages outside your run and your own Only new rows memory, and does not open private network addresses.

Other Rowcraft actors

All Rowcraft actors read official or public sources, deliver flat rows without personal data and support only-new runs and notifications:

FAQ

How much does it cost? $8.00 per 1,000 pages audited on the Free plan and $6.00 on the Business plan, only for pages that were audited (see Pricing). Platform usage of the run is included in that price and is not billed to you separately; set a maximum total charge in the run options to cap a run.

Why do the scores differ from PageSpeed Insights or from DevTools on my laptop? Lighthouse is a lab test and its numbers depend on the machine and the moment. PageSpeed Insights runs Lighthouse on Google's servers and also shows field data; DevTools runs it on your own computer, often without the slowdown a phone profile applies. The method is the same, the hardware is not, so expect differences of a few points in Performance. For tracking, compare this actor with itself over time.

Why is the Performance score different every time I run it? Page load times vary with the server, the network path, third-party scripts and ads, and Lighthouse measures one load. The other categories are rule checks and hardly change. Use the same formFactor, look at a trend over several runs, and treat a one-point move as noise.

What is the difference between lab data and field data? Lab data (this actor) is one controlled load of the page. Field data (CrUX in PageSpeed Insights) is the experience of real Chrome users over 28 days. Lab data tells you why a page is slow and lets you test a fix at once; field data tells you what users felt. This actor does not provide field data.

How do I open the full report? Click reportUrl in the dataset, or open the file in the key-value store of the run. If your browser downloads the file instead of showing it, open the downloaded file: it is one self-contained HTML file and works offline.

Is it legal? The actor opens public pages as any visitor's browser would, obeys robots.txt, never logs in and does not collect personal data in its rows. Whether and how you may use the results (for example in a report for a client) depends on the page's owner and on the law that applies to you.

Does it collect personal data? No personal data in the rows: no names, e-mail addresses or phone numbers. The saved reports show what the page showed to a first-time visitor, so choose pages with care. See the Privacy section.

Why is the result empty? Every page in the list could not be audited, or was skipped. The COVERAGE record gives the reason per page: an anti-bot page (blocked), robots.txt (robots_disallowed), no website or an HTTP 404 (not_found), a page that did not finish in 90 seconds (timeout), an invalid entry or another problem (error). With Only new rows on, pages whose scores are unchanged since the last run are skipped. Nothing is charged for any of those, apart from the start event.

Do I pay for pages that fail? No. Blocked pages, robots.txt refusals, HTTP errors, timeouts, pages Lighthouse could not score, invalid entries and duplicates are never charged. A row exists only when Lighthouse produced at least one score. If one category could not be scored on a page, the row is delivered with that score empty and a note, and the page is charged as one audit.

What does Both do to the price? Each page is audited twice, once per device, and each audit is one row and one charge. A list of 50 pages with Both is 100 audits.

Can I audit a page that needs a login? No. The audit opens the page with empty storage, like a first-time visitor, and never types or clicks. The login page itself can be audited.

How do I get a message when a page gets slower? Run the actor on a daily schedule with alertBelowPerformance set and a webhook in notifyUrl. The message lists the pages delivered in that run whose Performance score is under your number. Slack and Discord webhooks show it as plain text; Make, n8n and Zapier receive the same data as JSON fields (pagesBelowThreshold).

Which Lighthouse and Chrome versions are used? Lighthouse 12 and the Chrome that ships in the actor image. Both versions are written to the run (lighthouseVersion in every row, browser in RUN_SUMMARY). When a new build changes either, the changelog says so, because scores can shift slightly between Lighthouse versions.

Why does the audit not hide my cookie banner? Lighthouse measures the page as it loads for a first-time visitor, and the banner is part of that. Nothing is clicked or accepted. If the banner drags the score down for your visitors, it should show in the numbers.

Support and reviews

Problems, missing fields, questions: open an issue on the Issues tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.