Skip to main content
Scheduled reports deliver analytics snapshots on a recurring schedule — once per day, at a fixed UTC time — to configured destinations (Slack, webhooks, etc.). Each report is parameterised by the time window it covers (included_range_days) and the destinations it fans out to. Destinations are not configured in this API: they are integration destinations created via the Integrations API. Use GET /v4/scheduled-reports/destinations to discover what’s available for the project, then reference the destination by {type, id} when creating or updating a report.

Key concepts

  • Send timesend_at is a UTC time-of-day in HH:MM format, aligned to 30-minute slots ("00:00""23:30"). The daily job runs within a few minutes of this time.
  • Coverage windowincluded_range_days is the number of days of data bundled into each delivery. Only three values are supported: 1, 3, 7.
  • Status — Reports are "draft" (paused, no deliveries) or "active" (scheduled).
  • Environment — Each report targets a single environment: "sandbox" or "production".
  • Send testPOST /v4/scheduled-reports/{report_id}/send-test triggers an immediate one-off delivery. Rate-limited to one call per minute per report (returns 429 if exceeded).

send_at values

Must be in UTC HH:MM, aligned to 30-minute slots, "00:00" to "23:30":
"23:45" is invalid (not aligned). "12:15" is invalid (not aligned). "24:00" is invalid (out of range).

included_range_days values

Only three values are accepted:

status values

environment values

Destinations

A destination is a {type, id} pair. type is a namespaced kind; id is the destination’s opaque identifier. The only type currently exposed is target_integration, which points at an integration destination created via the Integrations API (typically a webhook, Slack channel, or email endpoint). Call GET /v4/scheduled-reports/destinations to enumerate all valid destinations for a project before creating or updating a report.

Available endpoints

Example: create an active daily report at 09:00 UTC

Response (201 Created):

Example: partial update (pause a report)

PUT accepts a partial body — omit any field to keep it unchanged. To pause a report, send only the new status:

Example: send a one-off test

Useful when verifying destination credentials or report content:
Returns 202 Accepted immediately; the delivery runs asynchronously. The send-test endpoint is rate-limited to one call per minute per report. Repeated calls within 60 seconds return 429 Too Many Requests with a Retry-After: 60 header.

Authentication

All v4 endpoints require a Secret Key. See Authentication.