Skip to content

Get Core Web Vitals (CrUX field data)

GET
/v1/sites/{id}/crux
curl --request GET \
--url https://api.overwatch.weareheavy.dev/v1/sites/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/crux \
--header 'x-api-key: <x-api-key>'

Real-user Core Web Vitals for the site’s origin, from the Chrome UX Report (CrUX): the latest p75 values for LCP, INP, CLS, and TTFB, a pass/fail Core Web Vitals verdict, movement versus ~7 and ~28 days ago, and the stored weekly series for trend charts.

The verdict follows the standard assessment: pass iff all three core metrics’ p75 are good — LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1 — and null when any core metric is missing for the period.

Responds 404 until the daily CrUX sync has found data for the origin (low-traffic origins may never be in the CrUX dataset), or when the Performance app is not enabled for the site.

id
required
string format: uuid

The site’s UUID.

The latest metrics, verdict, deltas, and weekly series.

Media typeapplication/json
object
formFactor
required

The CrUX form factor the data covers (ALL — all devices).

string
checkedAt
required

Epoch ms of the last CrUX sync for this site.

integer | null
latest
required

One CrUX window’s p75 metrics; a metric is null when CrUX has no data for it.

object
periodEnd
required

The last day of the collection window (YYYY-MM-DD).

string format: date
lcp
required

Largest Contentful Paint p75, in milliseconds.

number | null
inp
required

Interaction to Next Paint p75, in milliseconds.

number | null
cls
required

Cumulative Layout Shift p75 (unitless).

number | null
ttfb
required

Time to First Byte p75, in milliseconds.

number | null
verdict
required

The Core Web Vitals assessment for the latest window.

string | null
Allowed values: pass fail
deltas
required

Per-metric movement vs the point closest to 7 / 28 days back.

object
d7
required

Per-metric movement vs a baseline; null when either side is missing.

object
lcp
required
number | null
inp
required
number | null
cls
required
number | null
ttfb
required
number | null
d28
required

Per-metric movement vs a baseline; null when either side is missing.

object
lcp
required
number | null
inp
required
number | null
cls
required
number | null
ttfb
required
number | null
series
required

Weekly p75 points, oldest → newest (each a rolling 28-day window).

Array<object>

One CrUX window’s p75 metrics; a metric is null when CrUX has no data for it.

object
periodEnd
required

The last day of the collection window (YYYY-MM-DD).

string format: date
lcp
required

Largest Contentful Paint p75, in milliseconds.

number | null
inp
required

Interaction to Next Paint p75, in milliseconds.

number | null
cls
required

Cumulative Layout Shift p75 (unitless).

number | null
ttfb
required

Time to First Byte p75, in milliseconds.

number | null
Example
{
"formFactor": "ALL",
"checkedAt": 1753300000000,
"latest": {
"periodEnd": "2026-07-20",
"lcp": 2100,
"inp": 140,
"cls": 0.05,
"ttfb": 600
},
"verdict": "pass",
"deltas": {
"d7": {
"lcp": -80,
"inp": 5,
"cls": 0,
"ttfb": -20
},
"d28": {
"lcp": -240,
"inp": -15,
"cls": -0.01,
"ttfb": -60
}
},
"series": [
{
"periodEnd": "2026-07-20",
"lcp": 2100,
"inp": 140,
"cls": 0.05,
"ttfb": 600
}
]
}

Missing or invalid credentials.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "invalid api key"
}

The site was not found, the Performance app is not enabled, or the origin has no CrUX data yet.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "no CrUX data for this origin"
}