← Declarative Performance Observer

v151 · origin trial · http header

Performance-Observer header

The HTTP response header that activates the Declarative Performance Observer: a structured-field-style dictionary naming a reporting endpoint, the built-in entry types to collect, an allowlist of user-timing marks/measures, and the early-failure opt-in. Honored only on the top-level main-document navigation response.

syntax

Performance-Observer: report-to="telemetry",
                      entry-types=("navigation" "mark" "visibility-state"),
                      include-user-timing=("hero-image-loaded" "next-link-clicked"),
                      capture-early-failures=?1
Reporting-Endpoints: telemetry="https://log.example.com/v1"

The header carries four directives. Reporting-Endpoints (defined by the Reporting API, not by this proposal) must accompany it to define the endpoint named by report-to.

Source: explainer — syntax.

report-to

ValueA string naming an endpoint group defined in the same response's Reporting-Endpoints header (e.g. "telemetry")
BehaviorRoutes the session report to the named endpoint; delivery uses the Reporting API (application/reports+json)
If the endpoint is undefinedNot specified in the explainer (2026-07-28). Related constraint: reporting endpoints are intentionally not persisted across navigations — Reporting API v1 is ephemeral and document-tied — so a report can only be sent while a document has supplied a valid endpoint
Source: explainer — syntax; deferred reporting; Reporting API.

entry-types

ValueA list of strings selecting built-in performance or visibility events to record (explainer examples: "navigation", "mark", "visibility-state")
BehaviorThe browser process records the selected entry types for the session — independent of any page JavaScript
Allowed valuesValues match PerformanceObserver.supportedEntryTypes per the explainer; it does not pin down the exact subset honored during the origin trial (2026-07-28)
Unknown valuesNot specified in the explainer (2026-07-28)
Source: explainer — syntax.

include-user-timing

ValueA list of strings: an allowlist of user-defined performance.mark()/performance.measure() names to sync to the browser process (e.g. "hero-image-loaded")
BehaviorMarks/measures whose names appear in the allowlist are captured — including their detail payloads — even though they are created by page JavaScript
Third-party collisionAny script on the page (including third parties) can emit a mark with an allowlisted name and pollute telemetry; the explainer's mitigation is specific, non-generic mark names
Design alternativeExtending markOptions on performance.mark() was considered and rejected — any third-party script could set the option
Non-allowlisted / malformed namesMarks not in the allowlist are simply not synced (the allowlist defines the boundary); handling of a malformed list value is not specified in the explainer (2026-07-28)
Source: explainer — syntax, telemetry pollution, considered alternatives.

capture-early-failures

ValueBoolean (?1 to enable, ?0/false to disable; the explainer writes capture-early-failures=false for explicit opt-out)
Behavior when enabledPersists an origin-level flag: the browser records subsequent early navigation failures (network errors before any response) as synthesized, zero-filled PerformanceNavigationTiming entries and stores them in a bounded on-disk buffer, flushed on the next successful navigation to the origin that supplies a reporting endpoint
Default / malformedOff — nothing is persisted unless the origin opts in; handling of a malformed boolean is not specified in the explainer (2026-07-28)
LifecycleFlag and buffered reports expire after 7 days (Chromium); both are purged by Clear-Site-Data "storage" and by the user clearing site data; stored in partitioned storage, Incognito-isolated. Full lifecycle on the overview
Source: explainer — deferred reporting and deactivation.

context and exposure

Source: explainer — safe API design, deactivation.

examples

# Minimal: navigation + session-end only, one endpoint
Reporting-Endpoints: telemetry="https://log.example.com/v1"
Performance-Observer: report-to="telemetry", entry-types=("navigation")

# Full: early-failure capture and allowlisted app marks
Reporting-Endpoints: telemetry="https://log.example.com/v1"
Performance-Observer: report-to="telemetry",
                      entry-types=("navigation" "mark" "visibility-state"),
                      include-user-timing=("hero-image-loaded" "next-link-clicked"),
                      capture-early-failures=?1
Source: explainer — syntax.

browser compatibility

BrowserSupport
Chrome / Edge (Chromium)Origin trial 151–155 (desktop, Android, WebView) — ChromeStatus / Intent to Experiment; no BCD entry
FirefoxNo signal (no position recorded)
SafariNo signal (no position recorded)

security & privacy

Source: explainer — security and privacy considerations.