Lighthouse Audit
Pricing
from $2.70 / 1,000 audits
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é
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
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.
- Check page loading with a Lighthouse Speed Test.
- Create a Lighthouse Report to review page findings.
- Export Lighthouse Metrics for your page performance tracking.
- Review a Google Lighthouse Score across audit categories.
- Check Google Lighthouse Accessibility findings before planning page changes.
📊 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
- Add the public HTTP(S) URLs you want to check.
- Choose mobile, desktop, or both device profiles.
- 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.
- Choose extra report formats and a score-drop threshold if you need them.
- 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
| Field | Type | What it does |
|---|---|---|
urls | array of objects | Required. Adds one or more public HTTP(S) pages. Each URL uses the same audit settings. |
urls[].url | string | Required full public HTTP(S) URL for one page. Pages that need a login are not supported. |
deviceProfiles | array of strings | Selects mobile, desktop, or both. Defaults to mobile. Both runs each URL twice and adds a side-by-side comparison when results are available. |
categories | array of strings | Selects one or more of performance, accessibility, best-practices, and seo. Defaults to all four. |
measurementMethod | string | Chooses 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. |
networkProfile | string | Sets 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. |
reportFormats | array of strings | Adds 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. |
regressionThreshold | integer | Flags 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
| Field | Type | What it does |
|---|---|---|
dataset | string | Opens 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.
| Field | Type | What it does |
|---|---|---|
requestedUrl | string | Public URL submitted for the audit. |
mobileAudit, desktopAudit | object | Audit for the named device profile. |
mobileAudit.finalUrl, desktopAudit.finalUrl | string | URL reached after redirects. |
mobileAudit.networkProfile, desktopAudit.networkProfile | string | Network profile used: mobileSlow4G, mobileFast4G, desktopDense4G, or unthrottled. |
mobileAudit.lighthouseVersion, desktopAudit.lighthouseVersion | string | Lighthouse engine version used. |
mobileAudit.categoryScores, desktopAudit.categoryScores | object | Scores for the requested categories, from 0 to 1. |
mobileAudit.categoryScores.performance, desktopAudit.categoryScores.performance | number | Performance score. |
mobileAudit.categoryScores.accessibility, desktopAudit.categoryScores.accessibility | number | Accessibility score. |
mobileAudit.categoryScores.bestPractices, desktopAudit.categoryScores.bestPractices | number | Best practices score. |
mobileAudit.categoryScores.seo, desktopAudit.categoryScores.seo | number | SEO score. |
mobileAudit.labMetrics, desktopAudit.labMetrics | object | Lab loading measurements. |
mobileAudit.labMetrics.lcpMs, desktopAudit.labMetrics.lcpMs | number | Largest Contentful Paint in milliseconds. |
mobileAudit.labMetrics.fcpMs, desktopAudit.labMetrics.fcpMs | number | First Contentful Paint in milliseconds. |
mobileAudit.labMetrics.tbtMs, desktopAudit.labMetrics.tbtMs | number | Total Blocking Time in milliseconds. |
mobileAudit.labMetrics.cls, desktopAudit.labMetrics.cls | number | Cumulative Layout Shift, with no time unit. |
mobileAudit.labMetrics.speedIndex, desktopAudit.labMetrics.speedIndex | number | Speed Index in milliseconds. |
mobileAudit.labMetrics.ttiMs, desktopAudit.labMetrics.ttiMs | number | Time to Interactive in milliseconds, when supplied. |
mobileAudit.labMetrics.ttfbMs, desktopAudit.labMetrics.ttfbMs | number | Time to First Byte in milliseconds, when supplied. |
mobileAudit.labMetrics.fidMs, desktopAudit.labMetrics.fidMs | number | Lab estimate of First Input Delay in milliseconds, when supplied. It is not real-user field data. |
mobileAudit.metricRatings, desktopAudit.metricRatings | object | Ratings for available metrics: good, needsImprovement, or poor. |
mobileAudit.metricRatings.lcp, desktopAudit.metricRatings.lcp | string | LCP rating. |
mobileAudit.metricRatings.fcp, desktopAudit.metricRatings.fcp | string | FCP rating. |
mobileAudit.metricRatings.tbt, desktopAudit.metricRatings.tbt | string | TBT rating. |
mobileAudit.metricRatings.cls, desktopAudit.metricRatings.cls | string | CLS rating. |
mobileAudit.metricRatings.speedIndex, desktopAudit.metricRatings.speedIndex | string | Speed Index rating. |
mobileAudit.metricRatings.tti, desktopAudit.metricRatings.tti | string | TTI rating, when available. |
mobileAudit.metricRatings.ttfb, desktopAudit.metricRatings.ttfb | string | TTFB rating, when available. |
mobileAudit.metricRatings.fid, desktopAudit.metricRatings.fid | string | Estimated FID rating, when available. |
mobileAudit.failedAudits, desktopAudit.failedAudits | array of objects | Failed Lighthouse checks, when detail is available. |
mobileAudit.failedAudits[].id, desktopAudit.failedAudits[].id | string | Lighthouse audit ID. |
mobileAudit.failedAudits[].title, desktopAudit.failedAudits[].title | string | Lighthouse audit title. |
mobileAudit.failedAudits[].description, desktopAudit.failedAudits[].description | string | Lighthouse explanation of the failed check. |
mobileAudit.failedAudits[].score, desktopAudit.failedAudits[].score | number | Audit score from 0 to 1, when supplied. |
mobileAudit.failedAudits[].displayValue, desktopAudit.failedAudits[].displayValue | string | Formatted value shown by Lighthouse, when supplied. |
mobileAudit.optimizationOpportunities, desktopAudit.optimizationOpportunities | array of objects | Ways to improve the page, in priority order, when detail is available. |
mobileAudit.optimizationOpportunities[].id, desktopAudit.optimizationOpportunities[].id | string | Lighthouse opportunity ID. |
mobileAudit.optimizationOpportunities[].title, desktopAudit.optimizationOpportunities[].title | string | Lighthouse opportunity title. |
mobileAudit.optimizationOpportunities[].description, desktopAudit.optimizationOpportunities[].description | string | Lighthouse explanation of the opportunity. |
mobileAudit.optimizationOpportunities[].estimatedSavingsMs, desktopAudit.optimizationOpportunities[].estimatedSavingsMs | number | Estimated time savings in milliseconds, when supplied. |
mobileAudit.optimizationOpportunities[].estimatedSavingsBytes, desktopAudit.optimizationOpportunities[].estimatedSavingsBytes | number | Estimated transfer savings in bytes, when supplied. |
mobileAudit.optimizationOpportunities[].displayValue, desktopAudit.optimizationOpportunities[].displayValue | string | Formatted opportunity value, when supplied. |
mobileAudit.scoreComparison, desktopAudit.scoreComparison | object | Earlier scores and regression flags, when prior history is available. |
mobileAudit.scoreComparison.previousCategoryScores, desktopAudit.scoreComparison.previousCategoryScores | object | Earlier scores used for the comparison, from 0 to 1. |
mobileAudit.scoreComparison.previousCategoryScores.performance, desktopAudit.scoreComparison.previousCategoryScores.performance | number | Earlier performance score. |
mobileAudit.scoreComparison.previousCategoryScores.accessibility, desktopAudit.scoreComparison.previousCategoryScores.accessibility | number | Earlier accessibility score. |
mobileAudit.scoreComparison.previousCategoryScores.bestPractices, desktopAudit.scoreComparison.previousCategoryScores.bestPractices | number | Earlier best practices score. |
mobileAudit.scoreComparison.previousCategoryScores.seo, desktopAudit.scoreComparison.previousCategoryScores.seo | number | Earlier SEO score. |
mobileAudit.scoreComparison.regressionFlags, desktopAudit.scoreComparison.regressionFlags | object | Whether each compared score fell by more than the chosen score-drop threshold. |
mobileAudit.scoreComparison.regressionFlags.performance, desktopAudit.scoreComparison.regressionFlags.performance | boolean | Whether the performance score drop exceeds the threshold. |
mobileAudit.scoreComparison.regressionFlags.accessibility, desktopAudit.scoreComparison.regressionFlags.accessibility | boolean | Whether the accessibility score drop exceeds the threshold. |
mobileAudit.scoreComparison.regressionFlags.bestPractices, desktopAudit.scoreComparison.regressionFlags.bestPractices | boolean | Whether the best practices score drop exceeds the threshold. |
mobileAudit.scoreComparison.regressionFlags.seo, desktopAudit.scoreComparison.regressionFlags.seo | boolean | Whether the SEO score drop exceeds the threshold. |
mobileAudit.reports, desktopAudit.reports | object | Optional report links for this device audit. |
mobileAudit.reports.htmlUrl, desktopAudit.reports.htmlUrl | string | Apify storage URL for the HTML report, when selected. |
mobileAudit.reports.jsonUrl, desktopAudit.reports.jsonUrl | string | Apify storage URL for the detailed JSON report, when selected. |
mobileAudit.reports.csvUrl, desktopAudit.reports.csvUrl | string | Apify storage URL for the CSV summary, when selected. |
mobileAudit.reports.zipUrl, desktopAudit.reports.zipUrl | string | Apify 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.
| Field | Type | What it does |
|---|---|---|
requestedUrl | string | Public URL submitted for the audit. |
mobileAudit, desktopAudit | object | Failure details for the named device profile, when selected. |
mobileAudit.status, desktopAudit.status | string | failed when the audit could not produce Lighthouse measurements. |
mobileAudit.reason, desktopAudit.reason | string | Short 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 🫡
🔗 Related Actors
- Website URL Crawler & Link Extractor: build a page URL list from site links and sitemaps before choosing pages to audit.
- XML Sitemap Health Validator: check sitemap-listed URLs for HTTP status, redirects, and response time alongside page audits.
- Seobility SEO Checker: add Seobility's on-page SEO scores and factor checks to your website review.
- Webpage Diff Checker: track page text, HTML, SEO metadata, and link changes alongside repeat audits.
- Redirect Chain Checker: trace redirect hops and terminal status when reviewing an audited page's final URL.
Made with ❤️ by Maxime Dupré