Skip to main content
View and manage on-call pay reports, which value the time users spent on-call over a date window.

The pay report object

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.

created_at
string<date-time>
required

When this report was created

Example:

"2026-04-01T09:00:00Z"

end_date
string
required

Last date (YYYY-MM-DD) this report includes shifts from, inclusive

Example:

"2026-03-31"

id
string
required

Unique identifier for this pay report

Example:

"01G0J1EXE7AXZ2C93K61WBPYEH"

name
string
required

Human readable name for this report

Example:

"March 2026"

overlapping_shifts
enum<string>
required

How time spent on more than one schedule at once was paid

Available options:
paid_once,
paid_per_schedule
Example:

"paid_per_schedule"

schedule_ids
string[]
required

The schedules this report covers

Example:
start_date
string
required

First date (YYYY-MM-DD) this report includes shifts from, inclusive

Example:

"2026-03-01"

status
enum<string>
required

How far a report has got through being generated

Available options:
pending,
generating,
complete,
failed
Example:

"generating"

unpaid_shifts
enum<string>
required

Whether shifts that priced to zero are part of the report

Available options:
included,
excluded
Example:

"excluded"

updated_at
string<date-time>
required

When this report was last updated

Example:

"2026-04-01T09:00:00Z"

creator
object
Example:
error_code
enum<string>

Why a report could not be generated

Available options:
invalid_request,
timed_out
Example:

"timed_out"

error_message
string

What went wrong, written for whoever asked for the report. Only set on a failed report.

Example:

"Schedule 'Primary Support' has no pay config to price its shifts with"

published_at
string<date-time>

When this report was published. Unset while the report is still a draft.

Example:

"2026-04-01T09:00:00Z"

total_duration_seconds
integer<int64>

Total time spent on-call across every shift in this report, in seconds. Unset until the report is complete, and for a legacy report, which we do not summarise.

Example:

3600

total_pay_by_currency
object

Total owed for this report, keyed by ISO 4217 currency code, in the lowest denomination of that currency. Reports spanning pay configs with different currencies have an entry per currency, and those totals must not be summed. Unset until the report is complete, and for a legacy report, which we do not summarise.

Example: