Lighthouse
Run a real Google Lighthouse audit against a page and get back the category scores and key performance metrics as JSON — with an option to include the full set of 150+ audits for deep diagnostics.
This is a web operation — no AI, metered against your web allowance. Audits can take a while, so it pairs well with async mode.
Run an audit
Body parameters
- Name
url- Type
- string
- Required
- Required
- Description
- The absolute URL of the page to process. Rendered with headless Chrome, so JavaScript runs and redirects are followed. It must not include a username or password (
https://user:pass@example.com).
- Name
device- Type
- string
- Description
- Device to emulate:
mobile(default) ordesktop.
- Name
include_audits- Type
- string
- Description
- Set to
"true"to include the fullauditsobject (150+ audits). Defaults to"false".
- Name
report_to- Type
- string
- Description
- Webhook URL — an
httporhttpsaddress URLpipe POSTs the result to when it's ready. Optional: without it we deliver to your project's default endpoint if it has one, and otherwise send no webhook at all — the result still waits for you at GET /result/:token. A value we cannot deliver to returns422. Ignored on async=truerequest. Deliveries can be signed so your endpoint can verify they came from us.
- Name
sync- Type
- boolean
- Description
- Process the request synchronously, returning the result inline in the response. Defaults to
false(async: return a token now, and either receive the result at a webhook or fetch it with GET /result/:token). See Async & sync modes for the full contract.
- Name
max_age- Type
- string | integer
- Description
- How fresh a cached result must be to be accepted. Either an integer number of seconds (
3600) or a duration string of the form"<number> <unit>"— unitss/min/h/d/w(e.g."2 hours","3 days","30m"). Defaults to7 days, clamped to a max of30 days;0always bypasses the cache. See Caching for all accepted units.
curl -X POST https://urlpipe.dev/lighthouse \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "device": "desktop"}'import requests
res = requests.post(
"https://urlpipe.dev/lighthouse",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com", "device": "desktop"},
)const res = await fetch("https://urlpipe.dev/lighthouse", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com", device: "desktop" }),
})$ch = curl_init("https://urlpipe.dev/lighthouse");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["url" => "https://example.com", "device" => "desktop"]),
]);
$response = curl_exec($ch);
curl_close($ch);{
"url": "https://example.com",
"fetchTime": "2026-01-01T00:00:00.000Z",
"device": "desktop",
"categories": {
"performance": { "score": 0.95, "title": "Performance" },
"accessibility": { "score": 0.88, "title": "Accessibility" },
"best-practices":{ "score": 0.92, "title": "Best Practices" },
"seo": { "score": 0.90, "title": "SEO" },
"pwa": null
},
"metrics": {
"first-contentful-paint": {
"score": 0.95, "displayValue": "1.2 s",
"numericValue": 1200, "numericUnit": "millisecond"
},
"largest-contentful-paint": {
"score": 0.90, "displayValue": "2.5 s",
"numericValue": 2500, "numericUnit": "millisecond"
},
"cumulative-layout-shift": {
"score": 1.0, "displayValue": "0.05",
"numericValue": 0.05, "numericUnit": "unitless"
},
"total-blocking-time": {
"score": 0.93, "displayValue": "150 ms",
"numericValue": 150, "numericUnit": "millisecond"
}
}
}Category scores
Each category has a score from 0 to 1. The pwa category is null when it doesn't apply. Categories reported: performance, accessibility, best-practices and seo.
Metrics
Each metric includes score, displayValue, numericValue and numericUnit. Any metric may be null if Lighthouse couldn't compute it.
Device emulation
- Name
mobile- Type
- default
- Description
- 360×640 viewport, 4× CPU slowdown, slow-4G network. Simulates real-world mobile conditions and typically produces lower scores.
- Name
desktop- Description
- 1350×940 viewport, no CPU throttling, fast network. Generally produces higher scores.
Core Web Vitals & INP
LCP and CLS are included in metrics. INP (Interaction to Next Paint) is a field metric that needs real user interactions and can't be measured in a lab test like Lighthouse. Use total-blocking-time (TBT) as the lab proxy for responsiveness — it correlates strongly with INP.
Full audit data
Pass include_audits: "true" to add an audits object with all 150+ Lighthouse audits — performance diagnostics (render-blocking-resources, unused-css-rules), accessibility checks (color-contrast, image-alt), SEO audits and best-practices. Each audit carries a score, title, description and often a details object listing the specific elements to fix.
include_audits — are cached separately, since those options change the result. See Caching.Responses
Whatever the status, the response carries metadata headers: the result token, whether it was served from cache and how old that result is, how long we took, and the quota you have left.
200 OK422 Unprocessable Entity429 Too Many Requests504 Gateway Timeout401 UnauthorizedTry it live — no API key needed
Run this endpoint against any URL right in your browser.