Shift fulfilment
The shift fulfilment endpoint returns shift-level data for a given employer and date range. Each record represents a shift with counts and percentages for posted, booked, worked, unfilled, and no-show outcomes, split by worker type.
For the full request/response specification, see the API reference.
Metric definitions
Core shift counts
| Metric | Definition |
|---|---|
shifts_posted | Adjusted demand after business-rule adjustments. This is the number of worker positions made available for the shift. |
shifts_booked | Confirmed workers booked for the shift, net of accepted absences. |
shifts_worked | Workers that actually worked, based on booking and clocking evidence. |
shifts_unfilled | Positions that were not filled. Calculated as max(shifts_posted - shifts_booked, 0). |
no_shows | Workers who were booked but did not work and were not an accepted absence. Only counted after the shift has ended. |
accepted_absences | Pre-approved or accepted absences that do not count against fulfilment metrics. |
The following relationship holds: shifts_booked = shifts_worked + no_shows.
Worker types
All core counts are split by three worker types:
| Worker type | Description |
|---|---|
| Flexer | Workers sourced through the Indeed Flex platform. |
| Internal | The employer's own internal workers managed through Indeed Flex. |
| Agency | Workers provided by external staffing agencies. |
Each metric has a per-type variant (e.g. shifts_posted_by_flexer, shifts_booked_by_agency). The sum of per-type values equals the total (e.g. shifts_posted = shifts_posted_by_flexer + shifts_posted_by_internal + shifts_posted_by_agency).
Percentages
All percentages are bounded to [0, 100] and rounded to 2 decimal places.
| Metric | Formula |
|---|---|
shifts_booked_percentage | (shifts_booked / shifts_posted) * 100 |
shifts_worked_percentage | (shifts_worked / shifts_posted) * 100 |
shifts_unfilled_percentage | (shifts_unfilled / shifts_posted) * 100 |
no_shows_percentage | (no_shows / shifts_posted) * 100 |
true_fulfilment_percentage | (shifts_worked / true_demand) * 100 |
Per-type percentage variants follow the same formula using the corresponding per-type numerator and denominator (e.g. shifts_worked_percentage_by_flexer = (shifts_worked_by_flexer / shifts_posted_by_flexer) * 100).
If shifts_posted is zero, the percentage is returned as 0.0 to avoid division by zero.
True demand
| Metric | Definition |
|---|---|
true_demand | max(shifts_posted, shifts_worked) -- the demand baseline accounting for cases where more workers were worked than originally posted (e.g. overbook scenarios). |
true_fulfilment_percentage | (shifts_worked / true_demand) * 100 -- fulfilment rate using true demand as the denominator, giving a more accurate picture when overbooking occurs. |
Hours
| Metric | Definition |
|---|---|
hours_scheduled | (shift duration in hours - unpaid breaks) * shifts_posted. Represents the total planned hours for the shift. |
hours_worked | Actual hours worked across all bookings. For Flexer and Internal workers, this uses billable hours. For Agency workers, this uses clocked duration minus unpaid breaks. |
Hours metrics are also available per worker type (e.g. hours_scheduled_by_flexer, hours_worked_by_agency).
Other fields
| Metric | Definition |
|---|---|
overbook_shifts | Excess workers who worked above the adjusted demand, or workers on orphaned duplicate shifts that were worked. |
average_worker_rating | Average rating across all worker bookings for the shift (scale of 0 to 5). Null when no ratings exist. |
Request parameters
| Parameter | Required | Description |
|---|---|---|
employer_id | Yes | me (recommended) or your numeric employer ID (path parameter). me resolves to the employer associated with your OAuth credentials. |
from_date | Yes | Start date in ISO 8601 format (YYYY-MM-DD). |
to_date | Yes | End date in ISO 8601 format (YYYY-MM-DD). |
Venue and area filtering is not available to external clients. Send an empty JSON array (-d '[]') as the request body; any filter content is ignored and the request is always treated as empty.
Example request
curl -X POST "https://client-api.indeedflex.com/v1/reporting/me/reports/shift_fulfilment?from_date=2026-01-01&to_date=2026-01-31" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '[]'