Standby time



Options:

refer to docs for full details

GET /api/v1/time/standby returns the roster records (standby days) for the responders your organisation employs — the same records as the roster download spreadsheet in the web app, under the same column names. It is read-only. Deployed time is the separate deployment time feed.

Access needs the ResponderHQ.Time.Read.All application permission, the same permission as the deployment time feed, consented by your organisation's Microsoft Entra administrator. Roster times cannot be modified by the API.

Records are scoped to your own organisation: a responder appears only when your organisation is their employer, whichever roster or region they are on. Roster times are local wall-clock times exactly as rostered, with no timezone. Rows that hold a vacant position with no responder are not returned.

There is no "changed since" feed. Re-request the whole window each run and replace your copy of it — roster rows are edited and deleted in place.

Query parameters

item type mandatory description comments
from date yes First roster date, inclusive YYYY-MM-DD, e.g. 2026-08-01
to date yes Last roster date, inclusive The window must not exceed 93 days. A longer window is rejected rather than trimmed.
roster string Only rows from the roster with this name Optional. Without it every roster is returned, and each row carries its roster_name, so you do not need to know the roster names in advance. Case-insensitive, e.g. Fire Standby.
validated_only boolean Only rows an administrator has validated Default false. Every row carries is_validated either way.
limit integer Maximum rows 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. It is only valid for the same from/to window.

Response fields

item type description comments
roster_id integer Unique id for the roster row Use it to match a row you have already imported. Never reused.
roster_name string The roster the row belongs to For example Fire Standby
date date The rostered day YYYY-MM-DD
region_id / region integer / string The region the roster row is in
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. Null for any responder you have not given one.
first_name / last_name / email string The responder Email is 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
organisation string Who the responder works for As the spreadsheet shows it: your own organisation's name for your staff, the contractor's name for contractor staff.
home_region_id / home_region integer / string The responder's home region Compare with region to see whether they were rostered outside it
role string The role the responder was rostered into Refer to your organisation's deployment roles
response_type string The response type rostered Your organisation's own response type names
location string The rostered location
vehicle string Callsign of the rostered vehicle
oncall_start / oncall_finish time The on-call period HH:MM local time, no timezone. Null when not rostered on call. A finish earlier than the start means it ends the next day.
active_start / active_finish time The active (working) period HH:MM local time, no timezone. Null when not rostered active.
is_validated / validated_by / validated_timestamp boolean / string / datetime Whether an administrator has validated the row, who, and when validated_by and validated_timestamp are only given on a validated row. validated_timestamp is UTC.
responder_confirmed boolean Whether the responder confirmed the row themselves Separate from administrator validation

Example

GET /api/v1/time/standby?from=2026-08-01&to=2026-08-31&limit=500

{
"window": { "from": "2026-08-01", "to": "2026-08-31" },
"count": 500,
"next_cursor": "MjAyNi0wOC0xMnw3MzEyMA==",
"rows": [
  {
    "roster_id": 73120,
    "roster_name": "Fire Standby",
    "date": "2026-08-12",
    "region_id": 31,
    "region": "Northern",
    "responder_barcode": "f1000",
    "org_uid": "6202346",
    "first_name": "Megan",
    "last_name": "O'Niel",
    "email": "megan.oniel@responderorg.example",
    "staff_type": "Salary",
    "organisation": "Responder Org",
    "home_region_id": 31,
    "home_region": "Northern",
    "role": "Crew Leader",
    "response_type": "Initial Attack",
    "location": "Depot North",
    "vehicle": "Tanker 7",
    "oncall_start": "17:00",
    "oncall_finish": "07:30",
    "active_start": null,
    "active_finish": null,
    "is_validated": true,
    "validated_by": "Dana Approver",
    "validated_timestamp": "2026-08-14T02:10:00Z",
    "responder_confirmed": true
  }
]
}

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