docs / endpoint

POST /v1/page/lighthouse

Lighthouse scores and core web vitals for a single page.

Credits: 2 credits per call. Timeout: 120s

Parameters

NameTypeRequiredDefaultDescription
url string required Absolute http(s) page URL to audit. Required, max 2048 chars.
device string optional "mobile" One of: mobile, desktop. Optional, default "mobile".

Request

→ requestPOST /v1/page/lighthouse
POST /v1/page/lighthouse HTTP/1.1
Authorization: Bearer sof_live_your_key_here
Content-Type: application/json

{
  "url": "https://example.com/",
  "device": "mobile"
}

Response

Wrapped in the standard envelope -- id, object, created_at, elapsed_ms, cache, credits -- documented once on The Contract. The body below is a real envelope with this endpoint's data shape; values vary per request, and a marks an array cut short for display.

← response200
{
  "id": "ligh_obb5m5vwye6v7rvfjbvoqyjc",
  "request_id": "req_lpr2yaioobblpe53dvtkcunro4",
  "object": "lighthouse",
  "created_at": "2026-08-09T07:20:18Z",
  "elapsed_ms": 180,
  "cache": "miss",
  "credits": {
    "charged": 2,
    "balance": 9857
  },
  "data": {
    "url": "https://example.com/",
    "device": "mobile",
    "scores": {
      "performance": 100,
      "accessibility": 96,
      "best_practices": 96,
      "seo": 80
    },
    "metrics": {
      "lcp_ms": 762,
      "fcp_ms": 611,
      "cls": 0.02,
      "tbt_ms": 40,
      "si_ms": 900,
      "tti_ms": 1100
    },
    "fetched_at": "2026-07-26T10:15:00Z",
    "audits": {
      "largest-contentful-paint": {
        "id": "largest-contentful-paint",
        "title": "Largest Contentful Paint",
        "description": "Largest Contentful Paint marks the time at which the largest text or image is painted.",
        "score": 1,
        "scoreDisplayMode": "numeric",
        "numericValue": 762.4,
        "numericUnit": "millisecond",
        "displayValue": "0.8 s",
        "scoringOptions": {
          "p10": 2500,
          "median": 4000
        }
      },
      "…": "…"
    },
    "screenshots": {
      "full_page": {
        "data": "data:image/webp;base64,…",
        "width": 412,
        "height": 6200
      },
      "final": {
        "data": "data:image/webp;base64,…"
      },
      "thumbnails": [
        {
          "data": "data:image/webp;base64,…",
          "timing": 375
        },
        "…"
      ]
    }
  }
}

Response fields

What each field in data (above) means.

FieldDescription
data.url The final URL Lighthouse actually audited, after any redirects.
data.device Device profile the audit ran under: mobile or desktop.
data.scores Four Lighthouse category scores, each 0-100.
data.scores.performance Performance category score.
data.scores.accessibility Accessibility category score.
data.scores.best_practices Best-practices category score.
data.scores.seo SEO category score.
data.metrics Core Web Vitals and related timing metrics.
data.metrics.lcp_ms Largest Contentful Paint, in milliseconds.
data.metrics.fcp_ms First Contentful Paint, in milliseconds.
data.metrics.cls Cumulative Layout Shift (unitless).
data.metrics.tbt_ms Total Blocking Time, in milliseconds.
data.metrics.si_ms Speed Index, in milliseconds.
data.metrics.tti_ms Time to Interactive, in milliseconds.
data.fetched_at When this Lighthouse run completed, ISO 8601.
data.audits Every Lighthouse audit as produced by the analysis backend, keyed by audit id -- some diagnostic audits are empty depending on backend. Each audit's own `details` payload (e.g. script-treemap-data's node tree) passes through as-is, unfiltered.
data.screenshots Screenshot captures produced by this Lighthouse run.
data.screenshots.full_page A single stitched screenshot of the entire scrollable page, or null if the backend didn't produce one.
data.screenshots.final The page's final-state screenshot, or null if the backend didn't produce one -- carries the image data plus the moment it was captured.
data.screenshots.thumbnails Filmstrip of screenshots captured across the page load, oldest first; empty if the backend didn't produce one.