Skip to main content
POST
Create
🔑 Requires the schedule_reports.create scope.

Authorizations

Authorization
string
header
required

API key from your incident.io dashboard (Settings → API keys)

Body

application/json
end_date
string
required

Last date (YYYY-MM-DD) to include shifts from, inclusive

Example:

"2026-03-31"

name
string
required

Human readable name for this report

Example:

"March 2026"

schedule_ids
string[]
required

Which schedules to report on

Example:
start_date
string
required

First date (YYYY-MM-DD) to include shifts from, inclusive

Example:

"2026-03-01"

overlapping_shifts
enum<string>

How to pay time spent on more than one of these schedules at once. paid_once requires the advanced on-call plan.

Available options:
paid_once,
paid_per_schedule
Example:

"paid_per_schedule"

pay_config_expression
object
Example:
pay_config_id
string

The pay config to price every shift with. Provide this or pay_config_expression, and not both.

Minimum string length: 1
Example:

"01G0J1EXE7AXZ2C93K61WBPYEH"

rotation_filters
object[]

Narrows some of these schedules to a subset of their rotations. A schedule that does not appear here includes every rotation.

Example:
unpaid_shifts
enum<string>

Whether shifts that price to zero count towards total_duration_seconds

Available options:
included,
excluded
Example:

"excluded"

Response

Accepted response.

pay_report
object
required

A pay report values the time a set of users spent on-call over a date window, using the rates from a pay config.

Reports are immutable snapshots: once generated, changing the pay config or the schedules behind it will not change the report. Generate a new one instead.

A report starts as a draft and becomes visible to everyone in your organisation when you publish it.

Reports are generated in the background, so a report you have just asked for has no totals yet. Its status says whether they are still coming, and a report that failed carries the reason it will never have them.