Title: Run a Lighthouse audit in Python — working code
Open Graph Title: Run a Lighthouse audit in Python — working code
X Title: Run a Lighthouse audit in Python — working code
Description: Run Lighthouse from Python and print the four scores, LCP, CLS and TBT: sync, async with a webhook, and retries. Tested code.
Open Graph Description: Run Lighthouse from Python and print the four scores, LCP, CLS and TBT: sync, async with a webhook, and retries. Tested code.
X Description: Run Lighthouse from Python and print the four scores, LCP, CLS and TBT: sync, async with a webhook, and retries. Tested code.
Mail addresses
contact@urlpipe.dev
Opengraph URL: https://urlpipe.dev/code/python/lighthouse-audit
Domain: urlpipe.dev
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://urlpipe.dev/#organization","name":"URLpipe","url":"https://urlpipe.dev","logo":"https://urlpipe.dev/icon.png","sameAs":["https://github.com/URLpipe"],"founder":{"@type":"Person","name":"Roger Campos","url":"https://rogercampos.com"}},{"@type":"WebSite","@id":"https://urlpipe.dev/#website","url":"https://urlpipe.dev","name":"URLpipe","publisher":{"@id":"https://urlpipe.dev/#organization"}}]}
{"@context":"https://schema.org","@graph":[{"@type":"TechArticle","@id":"https://urlpipe.dev/code/python/lighthouse-audit#article","headline":"Run a Lighthouse audit in Python — working code","description":"Run Lighthouse from Python and print the four scores, LCP, CLS and TBT: sync, async with a webhook, and retries. Tested code.","url":"https://urlpipe.dev/code/python/lighthouse-audit","mainEntityOfPage":"https://urlpipe.dev/code/python/lighthouse-audit","datePublished":"2026-09-24","dateModified":"2026-09-24","author":{"@type":"Person","name":"Roger Campos","url":"https://rogercampos.com"},"publisher":{"@id":"https://urlpipe.dev/#organization"},"image":"https://urlpipe.dev/og-image.png"},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Mobile or desktop — which device should I audit?","acceptedAnswer":{"@type":"Answer","text":"Mobile, unless you know your traffic is desktop. It emulates a 360×640 phone with a 4× slower CPU and a slow 4G network, which gives the lower, more telling scores. Pass device: \"desktop\" for a 1350×940 window with no throttling."}},{"@type":"Question","name":"Why isn't INP in the results?","acceptedAnswer":{"@type":"Answer","text":"INP is measured from real users interacting with the page, which a lab audit cannot do. Total Blocking Time is the lab metric that tracks it."}},{"@type":"Question","name":"Why use the async variant for Lighthouse?","acceptedAnswer":{"@type":"Answer","text":"An audit takes around 15 seconds, longer on a heavy page. Async hands you a token at once and delivers the report to your webhook, so nothing holds a connection open waiting."}},{"@type":"Question","name":"Do I need an SDK to call URLpipe from Python?","acceptedAnswer":{"@type":"Answer","text":"No SDK is needed: requests is the only dependency, because the API is one POST per job. If you'd rather use one, the official client installs with pip install urlpipe and adds retries that never bill twice, typed errors and webhook verification."}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://urlpipe.dev/"},{"@type":"ListItem","position":2,"name":"Code recipes","item":"https://urlpipe.dev/code"},{"@type":"ListItem","position":3,"name":"Python","item":"https://urlpipe.dev/code/python"},{"@type":"ListItem","position":4,"name":"Run a Lighthouse audit in Python","item":"https://urlpipe.dev/code/python/lighthouse-audit"}]},{"@type":"HowTo","name":"Run a Lighthouse audit in Python","description":"To run a Lighthouse audit in Python, POST a URL and a device to https://urlpipe.dev/lighthouse and read the JSON with res.json(): four category scores from 0 to 1 and the lab metrics, LCP, CLS and TBT among them. An audit takes around 15 seconds, so the async variant with a webhook suits production. It costs 2 credits.","url":"https://urlpipe.dev/code/python/lighthouse-audit","tool":[{"@type":"HowToTool","name":"Python 3.9+"}],"step":[{"@type":"HowToStep","name":"Before you start","text":"One dependency, requests. Put your API key in the environment so it never lands in the file.","url":"https://urlpipe.dev/code/python/lighthouse-audit#setup"},{"@type":"HowToStep","name":"Print the four scores, LCP, CLS and TBT","text":""sync": True holds the connection open until the result is ready and answers with it. Pass timeout= every time: requests has no default, and a page that never finishes loading would otherwise hang your process. Scores arrive from 0 to 1 and any of them can be None when Lighthouse could not compute it, so the loop checks before multiplying.","url":"https://urlpipe.dev/code/python/lighthouse-audit#sync"},{"@type":"HowToStep","name":"The async variant: a token, a webhook and a poll","text":"Leave out sync and the answer is a token, straight away. for … else is the idiom for "ran out of attempts": the else runs only when the loop never hit break.","url":"https://urlpipe.dev/code/python/lighthouse-audit#async"},{"@type":"HowToStep","name":"Handle errors and retries","text":"raise_for_status() is fine for a script; a service wants to tell the failures apart. Check the status before calling res.json() — an error from a proxy in front of the API may not be JSON. sys.exit(message) prints to stderr and exits 1.","url":"https://urlpipe.dev/code/python/lighthouse-audit#errors"}]}]}
| view-transition | same-origin |
| csrf-param | authenticity_token |
| csrf-token | LUozZMyMzKotdSke_Z9AtIsmKpKmQQmKTfl17HYKBn-2dHKx9svqMb88N6wr2SJ0o5a9RzoDoFLeYbi7t8gLYQ |
| csp-nonce | 909a30294989ed5b7a13de9c48146fa0 |
| og:type | website |
| og:site_name | URLpipe |
| og:locale | en_US |
| og:image | https://urlpipe.dev/og-image.png |
| og:image:width | 1200 |
| og:image:height | 630 |
| og:image:alt | URLpipe — URL in. Clean data out. |
| twitter:card | summary_large_image |
| twitter:image | https://urlpipe.dev/og-image.png |
| twitter:image:alt | URLpipe — URL in. Clean data out. |
| theme-color | #3b82f6 |
Links:
Viewport: width=device-width,initial-scale=1