> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.qonversion.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Scheduled Reports

> Recurring analytics reports sent to external destinations

**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](/reference/v4/integrations). 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 time** — `send_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 window** — `included_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 test** — `POST /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"`:

```
"00:00", "00:30", "01:00", ..., "09:00", "09:30", ..., "23:00", "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:

| Value | Description                                             |
| ----- | ------------------------------------------------------- |
| `1`   | Prior day (most recent UTC day closed before `send_at`) |
| `3`   | Prior 3 days                                            |
| `7`   | Prior 7 days                                            |

## `status` values

| Value      | Meaning                                           |
| ---------- | ------------------------------------------------- |
| `"draft"`  | Paused — no deliveries are scheduled.             |
| `"active"` | Active — enqueued for delivery at each `send_at`. |

## `environment` values

| Value          | Meaning                                    |
| -------------- | ------------------------------------------ |
| `"sandbox"`    | Report covers sandbox/testing events only. |
| `"production"` | Report covers live production events.      |

## 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](/reference/v4/integrations) (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

| Method | Endpoint                                      | Description                                             |
| ------ | --------------------------------------------- | ------------------------------------------------------- |
| GET    | `/v4/scheduled-reports`                       | List scheduled reports (paginated via `limit`/`offset`) |
| POST   | `/v4/scheduled-reports`                       | Create scheduled report                                 |
| GET    | `/v4/scheduled-reports/destinations`          | List available destinations                             |
| GET    | `/v4/scheduled-reports/{report_id}`           | Get scheduled report                                    |
| PUT    | `/v4/scheduled-reports/{report_id}`           | Partially update scheduled report                       |
| DELETE | `/v4/scheduled-reports/{report_id}`           | Delete scheduled report                                 |
| POST   | `/v4/scheduled-reports/{report_id}/send-test` | Trigger a one-off test delivery (202; rate-limited)     |

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

```bash theme={null}
curl -X POST https://api.qonversion.io/v4/scheduled-reports \
  -H "Authorization: Bearer $QONVERSION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "report_name": "Daily Revenue",
    "send_at": "09:00",
    "included_range_days": 1,
    "status": "active",
    "environment": "production",
    "destinations": [
      { "type": "target_integration", "id": "int-wh-01" }
    ]
  }'
```

Response (`201 Created`):

```json theme={null}
{
  "object": "scheduled_report",
  "id": "wbRlfw1x",
  "url": "/v4/scheduled-reports/wbRlfw1x",
  "report_name": "Daily Revenue",
  "send_at": "09:00",
  "included_range_days": 1,
  "status": "active",
  "environment": "production",
  "runs": 0,
  "destinations": [
    {
      "type": "target_integration",
      "id": "int-wh-01",
      "label": "Webhooks: Release alerts"
    }
  ],
  "created_at": "2026-04-23T11:44:36Z",
  "updated_at": "2026-04-23T11:44:36Z"
}
```

## 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`:

```bash theme={null}
curl -X PUT "https://api.qonversion.io/v4/scheduled-reports/wbRlfw1x" \
  -H "Authorization: Bearer $QONVERSION_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"status": "draft"}'
```

## Example: send a one-off test

Useful when verifying destination credentials or report content:

```bash theme={null}
curl -X POST "https://api.qonversion.io/v4/scheduled-reports/wbRlfw1x/send-test" \
  -H "Authorization: Bearer $QONVERSION_SECRET"
```

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](/reference/v4/authentication).
