Lighthouse API
Lighthouse audits by API, with the rest of the page
The Lighthouse report as JSON, on your schedule and your webhook — next to the page's screenshot and JavaScript errors when you want them.
By Roger Campos · Last updated: September 2026
TL;DR
POST a URL to /lighthouse and get a real Lighthouse 13 audit back as JSON: the four category scores, the lab metrics (LCP, CLS, TBT, FCP, Speed Index) and, with include_audits, all 150+ audits. Mobile or desktop, 2 credits per audit, delivered to your webhook — and /scrape adds the console and a screenshot from the same request.
Free plan, no credit card. 1,000 credits a month.
Try it now — no signup
Try your own URL
Paste up to 10 URLs
Your result will appear here.
Pick one of the pages above to get started.
The request
One POST, one bearer token
curl -X POST https://urlpipe.dev/lighthouse \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "device": "mobile", "report_to": "https://your-app.com/webhooks/urlpipe"}'import requests
res = requests.post(
"https://urlpipe.dev/lighthouse",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"url": "https://example.com", "device": "mobile", "report_to": "https://your-app.com/webhooks/urlpipe"},
)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: "mobile", report_to: "https://your-app.com/webhooks/urlpipe" }),
})$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" => "mobile", "report_to" => "https://your-app.com/webhooks/urlpipe"]),
]);
$response = curl_exec($ch);{
"token": "0Zx3…9aQ",
"operation": "lighthouse",
"success": true,
"result": {
"url": "https://example.com",
"fetchTime": "2026-09-24T09:12:03.000Z",
"device": "mobile",
"categories": {
"performance": { "score": 0.77, "title": "Performance" },
"accessibility": { "score": 0.94, "title": "Accessibility" },
"best-practices": { "score": 1.0, "title": "Best Practices" },
"seo": { "score": 0.92, "title": "SEO" },
"pwa": null
},
"metrics": {
"first-contentful-paint": { "score": 0.62, "displayValue": "2.4 s", "numericValue": 2412, "numericUnit": "millisecond" },
"largest-contentful-paint": { "score": 0.55, "displayValue": "3.9 s", "numericValue": 3871, "numericUnit": "millisecond" },
"total-blocking-time": { "score": 0.91, "displayValue": "180 ms", "numericValue": 180, "numericUnit": "millisecond" },
"cumulative-layout-shift": { "score": 1.0, "displayValue": "0.02", "numericValue": 0.02, "numericUnit": "unitless" },
"speed-index": { "score": 0.83, "displayValue": "3.6 s", "numericValue": 3604, "numericUnit": "millisecond" }
}
},
"meta": { "cache": "miss", "processing_time_ms": 21870, "quota": { "cost": 2, "…": "…" } }
}Honestly
Do you need a Lighthouse API, or is PageSpeed Insights enough?
If all you need is scores for a few public pages from time to time, Google's PageSpeed Insights API may be enough. It is free, runs Lighthouse, allows 25,000 queries a day per API key, and adds real-user Chrome field data where Google has it — which a lab audit, ours included, cannot give you.
Where it stops is everything around the audit. PSI answers one audit per call, synchronously, and returns only the audit. It doesn't deliver to a webhook, keep the result for you, tag it with your customer's id, fetch from a residential address, or hand you the page's screenshot, console errors or content with it. That's the gap this API fills.
| PageSpeed Insights API | URLpipe /lighthouse | |
|---|---|---|
| Price | Free, 25,000 queries/day per key | 2 credits per audit, from your plan |
| Real-user (CrUX) field data | Yes | No |
| Lab audit, mobile and desktop | Yes | Yes |
| Full audits list | Yes | With include_audits |
| Async with signed webhooks | No | Yes |
| Stored results, reused for free | No | 7 days by default, up to 30 |
| Screenshot, console, Markdown from the same call | No | Via /scrape |
| Your own labels, usage by label | No | Yes |
| Pages on private networks | No | No |
The response
What comes back
Lighthouse 13 reports four categories — performance, accessibility, best-practices and seo, each scored 0 to 1. The PWA category is gone from Lighthouse; the pwa key stays in the response as null so the shape never changes under you.
metrics carries the lab metrics with a score, display value, numeric value and unit. The performance score weights them: Total Blocking Time 30%, Largest Contentful Paint 25%, Cumulative Layout Shift 25%, First Contentful Paint 10% and Speed Index 10%. INP is a field metric that needs real interactions, so no lab tool measures it; TBT is its lab proxy.
Send include_audits: "true" for the full audits object — 150+ audits such as render-blocking-resources, unused-css-rules, color-contrast and image-alt, most with a details list of the elements to fix. The guide to reading a Lighthouse audit explains what to do with it.
At scale
Running audits at volume
An audit holds a browser far longer than a page fetch, so /lighthouse is built to be sent and forgotten. Requests are async by default: you get a token at once, and the result is POSTed to your webhook, signed with HMAC-SHA256 and retried if your endpoint is down — or collected from GET /result/:token for 30 days.
- Agencies and multi-tenant tools. Tag each audit with labels such as your client's id; they come back on the result, and usage is broken down by label.
- No paying twice. A stored audit is reused for free while it is fresher than
max_age(7 days by default). Sendmax_age: 0when you need a fresh run. A duplicate request that arrives while the first is running waits for it, also free. - Variance. One audit is one sample. For a number you'll act on, run a few and take the median rather than trusting a single score.
- Retries without double work. An
Idempotency-Keyheader makes a retried request return the first one's token instead of starting a second audit.
device
Mobile or desktop
| device | Viewport | Throttling | Use it for |
|---|---|---|---|
| mobile (default) | 360 × 640 | 4× CPU slowdown, slow 4G | The score Google's mobile-first world cares about |
| desktop | 1350 × 940 | None, fast network | Desktop-heavy audiences and B2B tools |
Mobile and desktop audits are stored separately, as are audits with and without include_audits, since each is a different result.
/scrape
Lighthouse, console and screenshot in one request
A score tells you the page is slow; the console and the picture tell you why. /scrape runs the audit alongside a normal visit and merges the results:
{
"url": "https://example.com",
"operations": ["lighthouse", "console", "screenshot"],
"device": "mobile",
"include_audits": true,
"report_to": "https://your-app.com/webhooks/urlpipe"
}Each operation is billed as usual. The audit takes its own instrumented page load — it has to, to measure one — so page_options apply to the console and screenshot but never to the audit: blocking or trimming the page would falsify the scores. Audits often outlast the 60-second synchronous window, so this is one to run async.
Monitoring
Want the report, not the JSON?
This API sells the audit as data for your own product or pipeline. If what you want is a monitored report — scheduled audits of your sites, history, and what regressed since last time, across performance, SEO, security and accessibility — that's our sister product, Full Stack Audit.
Limits
What it does not do
- No field data. It is a lab audit. For real-user Core Web Vitals, use CrUX or PSI.
- No user flows. One page load per audit: no logins, clicks or multi-step journeys.
- No page_options on the audit. Deliberately, as above.
- No scheduling. You call it when you want an audit; for scheduled monitoring, see Full Stack Audit.
- Public pages only. Staging behind a VPN or on a private address can't be reached.
Pricing
What it costs
| Call | Credits | Free (calls/mo) | Starter (calls/mo) | Pro (calls/mo) | Scale (calls/mo) |
|---|---|---|---|---|---|
| /lighthouse | 2 credits | 500 | 10,000 | 27,500 | 87,500 |
Cache hits and failed requests cost nothing. Paid plans are never cut off: past the allowance, extra credits are $1.50 per 1,000 credits. See every plan.
Compared with
FAQ
Frequently asked questions
Is this a PageSpeed Insights API alternative?
Which Lighthouse version does it run?
How much does an audit cost?
Does it measure INP?
Why do my scores differ between runs?
Can I get the full list of audits?
Make your first request in five minutes.
Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.