Lighthouse Audit avatar

Lighthouse Audit

Pricing

from $2.70 / 1,000 audits

Go to Apify Store
Lighthouse Audit

Lighthouse Audit

Run Lighthouse lab audits for public web pages on mobile or desktop profiles. Get category scores, lab metrics, audit findings, and optional HTML, JSON, or CSV reports in your dataset.

Pricing

from $2.70 / 1,000 audits

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Share

🚦 Find page issues with a Lighthouse audit

Lighthouse Audit is for developers, SEO teams, and site owners who need to check public web pages. Get category scores, lab loading metrics, failed checks, and ranked ways to improve a page. Audit a list of URLs with one set of settings, then use the saved data to plan fixes or compare later checks. You do not need to supply a source login or Google API key.

📊 Scores, lab metrics, and page findings

Each submitted URL has one dataset row with the selected mobile or desktop audits. Choose both profiles to see their scores and lab metrics side by side. Each completed audit includes:

  • Scores from 0 to 1 for the selected performance, accessibility, best practices, and SEO categories.
  • LCP, FCP, TBT, CLS, and Speed Index lab metrics.
  • TTI, TTFB, estimated FID, and metric ratings when available.
  • Failed audit checks and ranked optimization opportunities, with explanations and estimated savings when available.
  • The final URL after redirects, network profile, and Lighthouse version.
  • Optional HTML, JSON, CSV, or ZIP report links. ZIP files contain offline MHTML reports.
  • Earlier category scores and regression flags when prior history is available.

The results are lab measurements, not real-user or field data. Scores can change between runs. Missing detail for a check does not make the core scores invalid. If an audit cannot finish, its profile has a failure status and reason instead of measurements.

▶️ Run a public page audit

  1. Add the public HTTP(S) URLs you want to check.
  2. Choose mobile, desktop, or both device profiles.
  3. Select the categories, measurement conditions, and a network profile. These settings apply to every URL in the run. Real network measurements ignore the network profile.
  4. Choose extra report formats and a score-drop threshold if you need them.
  5. Start the run and open Audit results to read the dataset.

Submit the pages you want to audit. The Actor does not crawl a site, find sitemap URLs, log in to private pages, or apply fixes to a page.

⚙️ Input

Input fields

FieldTypeWhat it does
urlsarray of objectsRequired. Adds one or more public HTTP(S) pages. Each URL uses the same audit settings.
urls[].urlstringRequired full public HTTP(S) URL for one page. Pages that need a login are not supported.
deviceProfilesarray of stringsSelects mobile, desktop, or both. Defaults to mobile. Both runs each URL twice and adds a side-by-side comparison when results are available.
categoriesarray of stringsSelects one or more of performance, accessibility, best-practices, and seo. Defaults to all four.
measurementMethodstringChooses simulate to estimate speed under the network profile, devtools to apply that profile in the browser, or provided to use the real network and ignore the network profile. Defaults to simulate. All results are lab measurements.
networkProfilestringSets network limits for simulated or browser-throttled measurements: mobileSlow4G, mobileFast4G, desktopDense4G, or unthrottled. Unthrottled uses no set network limit. Applies to every selected device profile and is ignored for real network measurements. Defaults to mobileSlow4G.
reportFormatsarray of stringsAdds html for reading, json for code, csv for spreadsheets, or zip for offline MHTML reports. Leave empty for dataset results only. Defaults to an empty array.
regressionThresholdintegerFlags a regression when a category score drops by more than this many points on the 0 to 100 scale. Accepts 0 to 100 and defaults to 0, which flags any drop. Needs an earlier audit of the same page and device.

Input example

This is the public input from a successful current-beta run with the default audit settings:

{
"urls": [
{
"url": "https://example.com"
}
],
"deviceProfiles": [
"mobile"
],
"categories": [
"performance",
"accessibility",
"best-practices",
"seo"
],
"measurementMethod": "simulate",
"networkProfile": "mobileSlow4G",
"reportFormats": [],
"regressionThreshold": 0
}

🧾 Output

Run output link

FieldTypeWhat it does
datasetstringOpens the dataset overview with one row per submitted URL and the selected device audits.

Completed audit fields

Mobile and desktop audits use the same shape. The table lists both real field paths. Only selected device profiles appear. Optional findings, history, and reports appear when available. Each category object contains only the categories available for that audit or comparison.

FieldTypeWhat it does
requestedUrlstringPublic URL submitted for the audit.
mobileAudit, desktopAuditobjectAudit for the named device profile.
mobileAudit.finalUrl, desktopAudit.finalUrlstringURL reached after redirects.
mobileAudit.networkProfile, desktopAudit.networkProfilestringNetwork profile used: mobileSlow4G, mobileFast4G, desktopDense4G, or unthrottled.
mobileAudit.lighthouseVersion, desktopAudit.lighthouseVersionstringLighthouse engine version used.
mobileAudit.categoryScores, desktopAudit.categoryScoresobjectScores for the requested categories, from 0 to 1.
mobileAudit.categoryScores.performance, desktopAudit.categoryScores.performancenumberPerformance score.
mobileAudit.categoryScores.accessibility, desktopAudit.categoryScores.accessibilitynumberAccessibility score.
mobileAudit.categoryScores.bestPractices, desktopAudit.categoryScores.bestPracticesnumberBest practices score.
mobileAudit.categoryScores.seo, desktopAudit.categoryScores.seonumberSEO score.
mobileAudit.labMetrics, desktopAudit.labMetricsobjectLab loading measurements.
mobileAudit.labMetrics.lcpMs, desktopAudit.labMetrics.lcpMsnumberLargest Contentful Paint in milliseconds.
mobileAudit.labMetrics.fcpMs, desktopAudit.labMetrics.fcpMsnumberFirst Contentful Paint in milliseconds.
mobileAudit.labMetrics.tbtMs, desktopAudit.labMetrics.tbtMsnumberTotal Blocking Time in milliseconds.
mobileAudit.labMetrics.cls, desktopAudit.labMetrics.clsnumberCumulative Layout Shift, with no time unit.
mobileAudit.labMetrics.speedIndex, desktopAudit.labMetrics.speedIndexnumberSpeed Index in milliseconds.
mobileAudit.labMetrics.ttiMs, desktopAudit.labMetrics.ttiMsnumberTime to Interactive in milliseconds, when supplied.
mobileAudit.labMetrics.ttfbMs, desktopAudit.labMetrics.ttfbMsnumberTime to First Byte in milliseconds, when supplied.
mobileAudit.labMetrics.fidMs, desktopAudit.labMetrics.fidMsnumberLab estimate of First Input Delay in milliseconds, when supplied. It is not real-user field data.
mobileAudit.metricRatings, desktopAudit.metricRatingsobjectRatings for available metrics: good, needsImprovement, or poor.
mobileAudit.metricRatings.lcp, desktopAudit.metricRatings.lcpstringLCP rating.
mobileAudit.metricRatings.fcp, desktopAudit.metricRatings.fcpstringFCP rating.
mobileAudit.metricRatings.tbt, desktopAudit.metricRatings.tbtstringTBT rating.
mobileAudit.metricRatings.cls, desktopAudit.metricRatings.clsstringCLS rating.
mobileAudit.metricRatings.speedIndex, desktopAudit.metricRatings.speedIndexstringSpeed Index rating.
mobileAudit.metricRatings.tti, desktopAudit.metricRatings.ttistringTTI rating, when available.
mobileAudit.metricRatings.ttfb, desktopAudit.metricRatings.ttfbstringTTFB rating, when available.
mobileAudit.metricRatings.fid, desktopAudit.metricRatings.fidstringEstimated FID rating, when available.
mobileAudit.failedAudits, desktopAudit.failedAuditsarray of objectsFailed Lighthouse checks, when detail is available.
mobileAudit.failedAudits[].id, desktopAudit.failedAudits[].idstringLighthouse audit ID.
mobileAudit.failedAudits[].title, desktopAudit.failedAudits[].titlestringLighthouse audit title.
mobileAudit.failedAudits[].description, desktopAudit.failedAudits[].descriptionstringLighthouse explanation of the failed check.
mobileAudit.failedAudits[].score, desktopAudit.failedAudits[].scorenumberAudit score from 0 to 1, when supplied.
mobileAudit.failedAudits[].displayValue, desktopAudit.failedAudits[].displayValuestringFormatted value shown by Lighthouse, when supplied.
mobileAudit.optimizationOpportunities, desktopAudit.optimizationOpportunitiesarray of objectsWays to improve the page, in priority order, when detail is available.
mobileAudit.optimizationOpportunities[].id, desktopAudit.optimizationOpportunities[].idstringLighthouse opportunity ID.
mobileAudit.optimizationOpportunities[].title, desktopAudit.optimizationOpportunities[].titlestringLighthouse opportunity title.
mobileAudit.optimizationOpportunities[].description, desktopAudit.optimizationOpportunities[].descriptionstringLighthouse explanation of the opportunity.
mobileAudit.optimizationOpportunities[].estimatedSavingsMs, desktopAudit.optimizationOpportunities[].estimatedSavingsMsnumberEstimated time savings in milliseconds, when supplied.
mobileAudit.optimizationOpportunities[].estimatedSavingsBytes, desktopAudit.optimizationOpportunities[].estimatedSavingsBytesnumberEstimated transfer savings in bytes, when supplied.
mobileAudit.optimizationOpportunities[].displayValue, desktopAudit.optimizationOpportunities[].displayValuestringFormatted opportunity value, when supplied.
mobileAudit.scoreComparison, desktopAudit.scoreComparisonobjectEarlier scores and regression flags, when prior history is available.
mobileAudit.scoreComparison.previousCategoryScores, desktopAudit.scoreComparison.previousCategoryScoresobjectEarlier scores used for the comparison, from 0 to 1.
mobileAudit.scoreComparison.previousCategoryScores.performance, desktopAudit.scoreComparison.previousCategoryScores.performancenumberEarlier performance score.
mobileAudit.scoreComparison.previousCategoryScores.accessibility, desktopAudit.scoreComparison.previousCategoryScores.accessibilitynumberEarlier accessibility score.
mobileAudit.scoreComparison.previousCategoryScores.bestPractices, desktopAudit.scoreComparison.previousCategoryScores.bestPracticesnumberEarlier best practices score.
mobileAudit.scoreComparison.previousCategoryScores.seo, desktopAudit.scoreComparison.previousCategoryScores.seonumberEarlier SEO score.
mobileAudit.scoreComparison.regressionFlags, desktopAudit.scoreComparison.regressionFlagsobjectWhether each compared score fell by more than the chosen score-drop threshold.
mobileAudit.scoreComparison.regressionFlags.performance, desktopAudit.scoreComparison.regressionFlags.performancebooleanWhether the performance score drop exceeds the threshold.
mobileAudit.scoreComparison.regressionFlags.accessibility, desktopAudit.scoreComparison.regressionFlags.accessibilitybooleanWhether the accessibility score drop exceeds the threshold.
mobileAudit.scoreComparison.regressionFlags.bestPractices, desktopAudit.scoreComparison.regressionFlags.bestPracticesbooleanWhether the best practices score drop exceeds the threshold.
mobileAudit.scoreComparison.regressionFlags.seo, desktopAudit.scoreComparison.regressionFlags.seobooleanWhether the SEO score drop exceeds the threshold.
mobileAudit.reports, desktopAudit.reportsobjectOptional report links for this device audit.
mobileAudit.reports.htmlUrl, desktopAudit.reports.htmlUrlstringApify storage URL for the HTML report, when selected.
mobileAudit.reports.jsonUrl, desktopAudit.reports.jsonUrlstringApify storage URL for the detailed JSON report, when selected.
mobileAudit.reports.csvUrl, desktopAudit.reports.csvUrlstringApify storage URL for the CSV summary, when selected.
mobileAudit.reports.zipUrl, desktopAudit.reports.zipUrlstringApify storage URL for the ZIP archive with offline MHTML reports, when selected.

Completed audit example

This complete row comes from a successful current-beta run. It shows scores, lab metrics, findings, and a comparison with earlier scores:

{
"requestedUrl": "https://example.com",
"mobileAudit": {
"finalUrl": "https://example.com/",
"networkProfile": "mobileSlow4G",
"lighthouseVersion": "13.5.0",
"categoryScores": {
"performance": 1,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"scoreComparison": {
"previousCategoryScores": {
"performance": 1,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"regressionFlags": {
"performance": false,
"accessibility": false,
"bestPractices": false,
"seo": false
}
},
"labMetrics": {
"lcpMs": 780,
"fcpMs": 780,
"tbtMs": 0,
"cls": 0.005159732408618392,
"speedIndex": 780,
"ttiMs": 780,
"ttfbMs": 46,
"fidMs": 28
},
"metricRatings": {
"lcp": "good",
"fcp": "good",
"tbt": "good",
"cls": "good",
"speedIndex": "good",
"tti": "good",
"ttfb": "good",
"fid": "good"
},
"failedAudits": [
{
"id": "landmark-one-main",
"title": "Document does not have a main landmark.",
"description": "One main landmark helps screen reader users navigate a web page. [Learn more about landmarks](https://dequeuniversity.com/rules/axe/4.13/landmark-one-main).",
"score": 0
},
{
"id": "meta-description",
"title": "Document does not have a meta description",
"description": "Meta descriptions may be included in search results to concisely summarize page content. [Learn more about the meta description](https://developer.chrome.com/docs/lighthouse/seo/meta-description/).",
"score": 0
},
{
"id": "link-text",
"title": "Links do not have descriptive text",
"description": "Descriptive link text helps search engines understand your content. [Learn how to make links more accessible](https://developer.chrome.com/docs/lighthouse/seo/link-text/).",
"score": 0,
"displayValue": "1 link found"
},
{
"id": "cache-insight",
"title": "Use efficient cache lifetimes",
"description": "A long cache lifetime can speed up repeat visits to your page. [Learn more about caching](https://developer.chrome.com/docs/performance/insights/cache).",
"score": 0.5,
"displayValue": "Est savings of 2 KiB"
},
{
"id": "network-dependency-tree-insight",
"title": "Network dependency tree",
"description": "[Avoid chaining critical requests](https://developer.chrome.com/docs/performance/insights/network-dependency-tree) by reducing the length of chains, reducing the download size of resources, or deferring the download of unnecessary resources to improve page load.",
"score": 0
}
],
"optimizationOpportunities": [
{
"id": "server-response-time",
"title": "Initial server response time was short",
"description": "Keep the server response time for the main document short because all other requests depend on it. [Learn more about the Time to First Byte metric](https://developer.chrome.com/docs/lighthouse/performance/time-to-first-byte/).",
"estimatedSavingsMs": 0,
"displayValue": "Root document took 50 ms"
},
{
"id": "redirects",
"title": "Avoid multiple page redirects",
"description": "Redirects introduce additional delays before the page can be loaded. [Learn how to avoid page redirects](https://developer.chrome.com/docs/lighthouse/performance/redirects/).",
"estimatedSavingsMs": 0
},
{
"id": "unminified-css",
"title": "Minify CSS",
"description": "Minifying CSS files can reduce network payload sizes. [Learn how to minify CSS](https://developer.chrome.com/docs/lighthouse/performance/unminified-css/).",
"estimatedSavingsMs": 0,
"estimatedSavingsBytes": 0
},
{
"id": "unminified-javascript",
"title": "Minify JavaScript",
"description": "Minifying JavaScript files can reduce payload sizes and script parse time. [Learn how to minify JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/).",
"estimatedSavingsMs": 0,
"estimatedSavingsBytes": 0
},
{
"id": "unused-css-rules",
"title": "Reduce unused CSS",
"description": "Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity. [Learn how to reduce unused CSS](https://developer.chrome.com/docs/lighthouse/performance/unused-css-rules/).",
"estimatedSavingsMs": 0,
"estimatedSavingsBytes": 0
},
{
"id": "unused-javascript",
"title": "Reduce unused JavaScript",
"description": "Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. [Learn how to reduce unused JavaScript](https://developer.chrome.com/docs/lighthouse/performance/unused-javascript/).",
"estimatedSavingsMs": 0,
"estimatedSavingsBytes": 0
}
]
}
}

Both device profiles

This row from another successful current-beta run is shortened because the full row exceeds 10,000 characters. The "..." strings stand for omitted findings. Compare the mobile and desktop scores, metrics, ratings, and report links in the same row:

{
"requestedUrl": "https://example.com",
"mobileAudit": {
"finalUrl": "https://example.com/",
"networkProfile": "mobileFast4G",
"lighthouseVersion": "13.5.0",
"categoryScores": {
"performance": 1,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"scoreComparison": {
"previousCategoryScores": {
"performance": 1,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"regressionFlags": {
"performance": false,
"accessibility": false,
"bestPractices": false,
"seo": false
}
},
"labMetrics": {
"lcpMs": 474.983,
"fcpMs": 474.983,
"tbtMs": 0,
"cls": 0,
"speedIndex": 826,
"ttiMs": 474.983,
"ttfbMs": 133,
"fidMs": 89.157
},
"metricRatings": {
"lcp": "good",
"fcp": "good",
"tbt": "good",
"cls": "good",
"speedIndex": "good",
"tti": "good",
"ttfb": "good",
"fid": "good"
},
"failedAudits": "...",
"optimizationOpportunities": "...",
"reports": {
"htmlUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-19d5b23f44d256fb2931d9cf?signature=RdrbYQ3Tju5jCtZ3IJC9",
"jsonUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-baa24b9294f1bf75713e4266?signature=dPoT3w5w7w8i8ipjB37r",
"csvUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-76a923f2cab31b3c04efc6b8?signature=aZNjHcr7kf5zPV15TqQh",
"zipUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-b067788353231fcc66973a66?signature=NfK5SENU6DASlQfQKrOw"
}
},
"desktopAudit": {
"finalUrl": "https://example.com/",
"networkProfile": "mobileFast4G",
"lighthouseVersion": "13.5.0",
"categoryScores": {
"performance": 1,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"scoreComparison": {
"previousCategoryScores": {
"performance": 0.65,
"accessibility": 0.96,
"bestPractices": 1,
"seo": 0.8
},
"regressionFlags": {
"performance": false,
"accessibility": false,
"bestPractices": false,
"seo": false
}
},
"labMetrics": {
"lcpMs": 406.777,
"fcpMs": 406.777,
"tbtMs": 62.16900000000004,
"cls": 0.00122130609184835,
"speedIndex": 520,
"ttiMs": 518.946,
"ttfbMs": 125,
"fidMs": 201.418
},
"metricRatings": {
"lcp": "good",
"fcp": "good",
"tbt": "good",
"cls": "good",
"speedIndex": "good",
"tti": "good",
"ttfb": "good",
"fid": "needsImprovement"
},
"failedAudits": "...",
"optimizationOpportunities": "...",
"reports": {
"htmlUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-24cf1cbb1888bad85caf7fa1?signature=4NNZ8nyHzKphhpveKWPk",
"jsonUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-3bff03b49624e300845cd356?signature=37Lxlc0OdZbq2ve4lsRM",
"csvUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-6cb5937cbc6d0a010eaa6edf?signature=1FDDiOZEFTiO0K9v7nDM",
"zipUrl": "https://api.apify.com/v2/key-value-stores/C03VugEVglKMUQJts/records/lighthouse-report-502494100b41fc238bb3fd38?signature=1JbpvAznBEolnsVmkSHS1"
}
}
}

Failed audit fields

Either profile can have this failure shape. It has no scores, lab metrics, findings, or report links. A row can also contain a completed audit for the other selected profile, using the table above.

FieldTypeWhat it does
requestedUrlstringPublic URL submitted for the audit.
mobileAudit, desktopAuditobjectFailure details for the named device profile, when selected.
mobileAudit.status, desktopAudit.statusstringfailed when the audit could not produce Lighthouse measurements.
mobileAudit.reason, desktopAudit.reasonstringShort reason the audit could not finish.

💳 Pricing

This Actor uses pay-per-event pricing. One Audit event is charged for each successful lab audit of one public URL on one device profile. Choosing both profiles can create two events per URL if both audits finish. Failed audits do not create this event. See the Pricing tab for current tier prices.

🔌 Integrations

Run the Actor through Apify Console or the Apify API. Use Apify datasets, schedules, webhooks, and platform integrations to send audit data to your workflow. Your workflow can read the scores to build reports or decide when to raise an alert.

❓ FAQ

Why does a device audit have a failure status instead of scores?

The audit could not finish. Read its reason field to see why. A failed profile has no Lighthouse measurements and does not create an Audit event.

Does the network profile follow the device profile?

You choose them separately. The same networkProfile applies to every selected device profile for simulated or browser-throttled measurements. Real network measurements ignore it. You can use both devices with one network setting to compare their results.

When do earlier scores and regression flags appear?

They appear when prior audit history is available. A regression flag is true when a category score drops by more than regressionThreshold points on the 0 to 100 scale. Use 0 to flag any drop. Only categories present in both results can be compared.

Can I use different settings for each URL in one run?

No. All URLs share one set of device, category, measurement, network, report, and score-drop settings. Use separate runs when you need different settings.

Can I get an HTML Lighthouse report?

Yes. Select html in reportFormats. Use json for a detailed machine-readable report, csv for a spreadsheet summary, or zip for offline MHTML reports. The audit's reports object holds the links when they are available.

Are these Google PageSpeed Insights field results?

No. This Actor returns Lighthouse lab measurements. It does not return real-user or field metrics. You do not need to provide a Google API key to run these public page audits.

Does an accessibility score prove the page is fully accessible?

Treat it as a Lighthouse check score and review the returned findings. The Actor reports audit results; it does not promise a pass outcome or fix the page.

Can I audit a whole site or a page behind a login?

Submit each public HTTP(S) page you want to check. The Actor does not find new pages, follow site links, or access pages that need a login or private session.

Will a repeated website speed test give the same score?

Scores can vary between lab runs. Keep the settings the same when you compare results, and check the reported Lighthouse version and network profile.

📝 Changelog

v1.0 (02-10-2026)

  • Dataset rows now include only completed device audits. Failed device audits no longer include status and reason fields. Pages with no completed audit have no dataset row.
  • Choose simulated, browser-throttled, or real network measurements, with an unthrottled network option.
  • Download ZIP files with offline MHTML reports.
  • Read extra lab metrics and their ratings when available.
  • Set how many score points must drop before a regression is flagged.
  • Audits retry temporary source errors and wait for the delay requested by a rate-limited page.

v0.0 (01-10-2026)

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré