Deployment time



Options:

refer to docs for full details

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, so a system that reads time cannot change any data.

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.

Query parameters

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.

Response fields

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
email 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 Empty if your organisation does not use it
event_barcode / event_name / event_type string The event the responder was deployed to Empty where a deployment carries no event
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

Example

GET /api/v1/time/deployments?from=2026-08-01T00:00:00Z&to=2026-08-31T00:00:00Z&limit=500

{
"window": { "from": "2026-08-01T00:00:00Z", "to": "2026-08-31T00:00:00Z" },
"count": 500,
"next_cursor": "MjAyNi0wOC0xMlQyMTozMDowMFp8NDgyOTE=",
"rows": [
  {
    "deployment_id": 48291,
    "responder_barcode": "f1000",
    "org_uid": "6202346",
    "first_name": "Megan",
    "last_name": "O'Niel",
    "full_name": "Megan O'Niel",
    "email": "megan.oniel@responderorg.example",
    "staff_type": "level_2",
    "event_barcode": "e2045",
    "event_name": "Ashby Ridge",
    "event_type": "fire",
    "is_work_event": false,
    "deploy_role": "Crew Leader",
    "deploy_timestamp": "2026-08-12T21:30:00Z",
    "return_timestamp": "2026-08-13T05:00:00Z",
    "primary_deploy_timestamp": "2026-08-12T21:30:00Z",
    "duration_hours": 7.5,
    "is_open": false,
    "is_validated": true,
    "validated_by": "Dana Approver",
    "validated_timestamp": "2026-08-14T02:10:00Z",
    "responder_confirmed": true,
    "cost_code": "SUP-2026-014",
    "cost_code_description": "Suppression — Ashby Ridge"
  }
]
}

Keep requesting with the cursor from the previous response until next_cursor comes back empty. That is the end of the window.