GET /api/v1/time/deployments returns the deployment records for the
responders your organisation employs, so a payroll or timesheet system can read
worked time without anyone downloading a spreadsheet. It is read-only.
Access needs the ResponderHQ.Time.Read.All application permission, consented by your organisation's Microsoft Entra administrator. It is separate from the write permissions used by the other endpoints on this site. Deployment times cannot be modified by the API.
Records are scoped to your own organisation: a responder appears only when your organisation is their employer. Times are returned in UTC, and durations are simply return time minus deploy time — no break, meal or award rules are applied, because those belong in your payroll system.
There is no "changed since" feed. Re-request the whole window each run and replace your copy of it — deployment records can be deleted, and a deletion is invisible to any incremental feed.
| item | type | mandatory | description | comments |
|---|---|---|---|---|
| from | datetime | yes | Start of the window, inclusive | ISO-8601 with an offset, e.g. 2026-08-01T00:00:00Z. Compared against the deploy time. |
| to | datetime | yes | End of the window, inclusive | The window must not exceed 93 days. A longer window is rejected rather than trimmed. |
| include_open | boolean | Include responders who are still deployed | Default false. An open record has no return time and no duration. | |
| include_work | boolean | Include work events as well as incidents | Default true. Each record also carries is_work_event so you can split them. | |
| validated_only | boolean | Only records an administrator has validated | Default false. Every record carries is_validated either way. | |
| limit | integer | Maximum records in one response | Default 500, maximum 5000. | |
| cursor | string | Marker for the next page | Pass back the next_cursor from the previous response, unchanged. Do not construct one. |
| item | type | description | comments |
|---|---|---|---|
| deployment_id | integer | Unique id for the deployment record | Use it to match a record you have already imported |
| responder_barcode | string | The responder's id in Responder HQ | Matches fire_fighter_barcode on responders |
| org_uid | string | Your organisation's own id for the responder | The same value you set on responders. Empty for any responder you have not given one, so pair it with email or responder_barcode rather than relying on it alone. |
| first_name / last_name / full_name | string | The responder's name | full_name may be empty on older records |
| string | The responder's email address | Usually the most reliable key for matching to a payroll record | |
| staff_type | string | Staff classification, where your organisation records one | Null if your organisation does not use it or has not set it on the responder. Set it on responders. |
| home_region_id / home_region | integer / string | The responder's home region | As set on the responder. Compare with deploy_region or event_region to see whether they were deployed outside their normal region. |
| deploy_region_id / deploy_region | integer / string | The region the deployment was booked from | Recorded at deploy time, so it is the most reliable region on the record. Region ids are stable; a name is empty if the region has since been deleted. |
| event_region_id / event_region | integer / string | The region the event belongs to | Usually the same as deploy_region. Empty where a deployment carries no event or the event has no region. |
| event_barcode / event_name / event_type | string | The event the responder was deployed to | Empty where a deployment carries no event |
| event_status | string | The status of the event | One of pending, going, being controlled, contained, patrol, mop-up, out, standby, imt, false alarm or work. A deployment to an event on standby reads as standby here; use it rather than the event's name. |
| is_work_event | boolean | True for work, false for an incident | Lets you split the two without knowing our status codes |
| deploy_role | string | The role the responder was deployed into | Refer to your organisation's deployment roles |
| deploy_timestamp / return_timestamp | datetime | Start and end of the deployment | UTC. return_timestamp is empty while the responder is still deployed. |
| primary_deploy_timestamp | datetime | Start of the shift this record belongs to | Records sharing a value belong to one shift, if you group them |
| duration_hours | decimal | Return time minus deploy time, in hours | Empty while the deployment is open. No break or award rules applied. |
| is_open | boolean | True while the responder is still deployed | Only ever true when you ask for include_open |
| is_validated / validated_by / validated_timestamp | boolean / string / datetime | Whether an administrator has checked the times, who, and when | Your organisation decides whether unvalidated time is payable |
| responder_confirmed | boolean | Whether the responder confirmed their own times | Separate from administrator validation |
| cost_code / cost_code_description | string | The financial code that applied to this event at this time | Empty where your organisation has set no code covering it |
GET /api/v1/time/deployments?from=2026-08-01T00:00:00Z&to=2026-08-31T00:00:00Z&limit=500
Keep requesting with the cursor from the previous response until
next_cursor comes back empty. That is the end of the window.