Report-To vs Reporting-Endpoints
The difference between the legacy Report-To header (v0) and the modern Reporting-Endpoints header (v1), and which to use.
Last update:
There are two generations of the header that declares reporting endpoints.
Report-To came first (often called Reporting API v0) and Reporting-Endpoints
replaced it (v1). For almost everything you should use Reporting-Endpoints. The one exception is Network Error Logging, which still requires Report-To.
The two generations
Report-To (v0) declares endpoint groups as JSON. A group has a name, a max_age
that caches the configuration, an endpoints array that can hold several URLs with
priority and weight for failover, and an optional include_subdomains. The cached,
ambient model meant a configuration sent on one response could apply to other pages
on the origin.
Report-To: { "group": "csp-endpoint", "max_age": 10886400,
"endpoints": [ { "url": "https://<Endpoint-ID>.report.centralcsp.com" } ] }Reporting-Endpoints (v1) drops all of that for a structured-field dictionary of
name="url" pairs: one URL per name, no groups, no failover, no caching. It is
scoped to the response it is served on, so it must be present on every response that
can generate a report.
Reporting-Endpoints: csp-endpoint="https://<Endpoint-ID>.report.centralcsp.com"The W3C Reporting specification defines only Reporting-Endpoints; Report-To was a
Chromium-era mechanism that never became a standard, which is why it is marked
deprecated and non-standard and only ever shipped in Chromium.
What changed and why
| Aspect | Report-To (v0) | Reporting-Endpoints (v1) |
|---|---|---|
| Syntax | JSON groups | name="url" pairs |
| URLs per name | Several, with priority and weight | One |
| Caching | max_age, ambient across pages | None, per-response |
| Subdomains | include_subdomains | Not applicable |
| Scope | Cached for the origin | The response it is served on |
| Standard | Non-standard, deprecated | W3C Reporting API |
| Support | Chromium only | Widely supported |
The grouping and caching that made v0 flexible are exactly what other browser engines were unwilling to standardize. v1 trades that flexibility for a simple, per-response header, and that simpler model is now widely supported across current browsers.
The four-way report-to confusion
"report-to" means different things depending on context. Keep them straight: the Report-To header (v0), the Reporting-Endpoints header (v1, the modern replacement), the CSP report-to directive (names an endpoint from a policy), and the report-to= parameter on COOP/COEP/Permissions-Policy headers.
In practice the directive and the parameter only reference a name; one of the two headers has to declare it:
Reporting-Endpoints: csp-endpoint="https://..."declares the endpoint (v1).Report-To: { "group": "csp-endpoint", ... }declares it the old way (v0).Content-Security-Policy: ...; report-to csp-endpointreferences it from CSP.Cross-Origin-Opener-Policy: same-origin; report-to="csp-endpoint"references it from COOP.
Which to use
Default to Reporting-Endpoints for everything: CSP, COOP, COEP, Permissions-Policy,
Document-Policy, Integrity-Policy, and the implicit deprecation, intervention, and
crash reports. Keep Report-To only on the responses that also send the NEL
header, because Network Error Logging is not supported by v1. For CSP specifically,
the report-to directive reached Baseline in 2026, so you only need to keep the
deprecated report-uri directive as a fallback for very old browsers, see
report-uri vs report-to.
FAQ
Is Report-To deprecated?
Yes. Report-To (Reporting API v0) was a Chromium-era mechanism that never
became a standard, so it is marked deprecated and non-standard.
Reporting-Endpoints (v1) is the modern replacement, defined by the W3C
Reporting specification and Baseline across current browsers. Report-To
remains only for Network Error Logging, which v1 does not support.
Do I need both Report-To and Reporting-Endpoints?
Only if you use Network Error Logging, which still requires the legacy
Report-To header. For everything else, CSP, COOP, COEP, Permissions-Policy,
Document-Policy, Integrity-Policy, and the implicit deprecation, intervention,
and crash reports, Reporting-Endpoints alone is enough. Keep Report-To only
on the responses that also send the NEL header.
report-to vs report-uri in CSP?
They are different generations of the CSP reporting directive. report-to names
an endpoint declared by a Reporting-Endpoints (or Report-To) header and
delivers structured Reporting API reports. report-uri is the older directive
that takes a URL directly. report-to reached Baseline in 2026; keep
report-uri only as a fallback for very old browsers.
See also
- Reporting-Endpoints header
- Report-To header
- Network Error Logging (NEL)
- Report-To vs Reporting-Endpoints, which to use
Sources
ReportingObserver
The ReportingObserver JavaScript API lets a page read its own reports in band, including buffered reports from before it ran.
The default reporting endpoint
The default endpoint in Reporting-Endpoints catches report types with no explicit target, including deprecation, intervention, and crash reports.