List Shifts
GET {{base_url}}/api/v3/shifts?page=0&limit=20
Required scope: shifts:read
Returns a paginated, operator-scoped list of public shift records. Roles: admin, partner, or vendor.
page is zero-based. limit defaults to 20 and is capped at 1,000 in production. start and stop are inclusive boundaries.
Advanced forecasting only: chomp_run_id and schedule_id support forecasting-generated shift views. chomp_run_id requires the matching schedule_id; general API consumers should omit both.
The embedded user object contains only id, first_name, last_name, is_external_runner, and active_territory_id; phone and username are not public.
Examples
Section titled “Examples”curl --request GET '${base_url}/api/v3/shifts?page=0&limit=20' \ --header 'Authorization: {{auth_token}}'const response = await fetch("${base_url}/api/v3/shifts?page=0&limit=20", { "method": "GET", "headers": { "Authorization": "{{auth_token}}" }})const data = await response.json()import requests
response = requests.request( "GET", "${base_url}/api/v3/shifts?page=0&limit=20", headers={ 'Authorization': '{{auth_token}}'},)response.raise_for_status()Saved responses
Section titled “Saved responses”{ "type": "success", "data": [ { "id": "550e8400-e29b-41d4-a716-446655440000", "created_at": "2026-10-13T14:00:00.000Z", "retreat_point": "650e8400-e29b-41d4-a716-446655440000", "territory_id": "850e8400-e29b-41d4-a716-446655440000", "operator_id": 123, "start": "2026-10-19T13:00:00.000Z", "stop": "2026-10-19T17:00:00.000Z", "length_hours": 4, "user_id": "1697c3af-450f-42f4-8609-669a4350c22f", "role": "car", "hourly_rate": 20, "bonus_pay": 10, "checked_in": null, "user": { "id": "1697c3af-450f-42f4-8609-669a4350c22f", "first_name": "John", "last_name": "Doe", "is_external_runner": false, "active_territory_id": "850e8400-e29b-41d4-a716-446655440000" } } ], "total": 1}{ "type": "error", "message": "schedule_id is required when filtering by chomp_run_id", "status": 400}
