Reporting-Endpoints

The HTTP Reporting-Endpoints response header declares named endpoints where the browser sends reports for CSP violations, deprecation warnings, intervention notices, and crash logs.

Usage

The Reporting-Endpoints header is part of the W3C Reporting API and serves as the successor to Report-To. Where Report-To uses JSON objects with nested arrays, Reporting-Endpoints is defined as a Structured Fields Dictionary with a simpler key-value syntax.

A server includes one or more named endpoints in the header value. Each endpoint is a key paired with a quoted URL. Other headers reference these endpoint names to route specific report types. For example, a Content-Security-Policy header uses the report-to directive with the endpoint name to direct violation reports to the declared URL.

Reports are sent out-of-band by the browser in the background. The endpoint URLs must be HTTPS. The browser silently discards endpoints with non-secure URLs.

Directives

endpoint-name

The endpoint-name is a token identifying the reporting destination. The name is referenced by other HTTP headers such as Content-Security-Policy or Cross-Origin-Opener-Policy to route their reports. The value paired with the name is a quoted URL pointing to the collection endpoint.

Multiple endpoints are separated by commas, each with its own name and URL.

Example

A single endpoint named default collects all report types not routed to a specific named endpoint. The browser sends deprecation warnings, intervention notices, and crash reports to this URL automatically.

Reporting-Endpoints: default="https://reports.example.re/default"

A CSP violation endpoint named csp-endpoint receives Content-Security-Policy violation reports. The matching Content-Security-Policy header ties violations to this endpoint through its report-to directive.

Reporting-Endpoints: csp-endpoint="https://reports.example.re/csp"
Content-Security-Policy: default-src 'self'; report-to csp-endpoint

Multiple endpoints in a single header cover different report categories. The coop_report endpoint handles Cross-Origin-Opener-Policy violations while permissions_policy handles Permissions-Policy violations. A default endpoint catches everything else.

Reporting-Endpoints: coop_report="https://reports.example.re/coop", default="https://reports.example.re/browser-errors", permissions_policy="https://reports.example.re/permissions"

Which reports go where

Each report type picks its endpoint through its own policy header rather than through this one. CSP violations follow the report-to directive inside the policy, COEP and COOP violations follow the report-to parameter on their headers, and Reporting-Endpoints only resolves the names those policies use into URLs. Deprecation and intervention reports have no policy header of their own and fall back to the endpoint named default, as do crash reports where no crash-reporting endpoint exists.

Endpoints accept HTTPS URLs alone, and delivery arrives as batched POST requests carrying application/reports+json with a JSON array inside. The age field counts milliseconds since the report was generated rather than carrying a timestamp, which is deliberate, keeping client clock detail out of the payload. An endpoint answering 410 asks the browser to stop delivering entirely.

Delivery is explicitly best-effort. The specification rules out treating reports as a reliable channel, so gaps in a reporting dashboard mean little on their own.

The header ships across Chromium-based browsers, Firefox, and Safari, with the default endpoint name unsupported in Safari, so deprecation and intervention reporting stays out of reach there. Network Error Logging never moved over and still requires the older Report-To header, which is the one reason production configs carry both.

See also

Last updated: August 17, 2026