---
title: schedule.list | Doing Work API
description: A shop's visits that overlap a time window, earliest first. Filter by worker, job, or only mine. Field workers only ever see their own.
url: https://doingwork.work/docs/reference/schedule-list/
---

# schedule.list

A shop's visits that overlap a time window, earliest first. Filter by worker, job, or only mine. Field workers only ever see their own.

|  |  |
|---|---|
| Who | Agents can call this |
| REST | `GET /v1/schedule` |
| MCP tool | `schedule_list` |
| Writes | no |
| Area | [Scheduling and visits](https://doingwork.work/docs/reference/#scheduling-and-visits) |

## When to use it

Read schedule.settings first: it has the shop's time zone, working hours, arrival window and buffer. Use schedule.findTime to get open times that fit the shop's hours, each worker's hours and time off, and visits already booked with the buffer around them, then book with visits.create.

## What to tell the owner

Tell them what you found in plain words. Don't read back raw fields.

## Input

| Field | Type | Required |
|---|---|---|
| `shop_id` | string (uuid) | yes |
| `from` | string (date-time) | yes |
| `to` | string (date-time) | yes |
| `person_id` | string (uuid) | no |
| `job_id` | string (uuid) | no |
| `mine` | boolean | no |
| `unassigned` | boolean | no |
| `include_cancelled` | boolean | no |

## Example

```http
GET https://doingwork.work/v1/schedule?shop_id=00000000-0000-4000-8000-000000000000&from=...&to=...
```

## Output

| Field | Type | Always there |
|---|---|---|
| `items` | array | yes |
| `items[].visit_id` | string (uuid) | yes |
| `items[].shop_id` | string (uuid) | yes |
| `items[].job_id` | string (uuid) | yes |
| `items[].job_summary` | ['string', 'null'] | yes |
| `items[].starts_at` | string (date-time) | yes |
| `items[].ends_at` | string (date-time) | yes |
| `items[].title` | ['string', 'null'] | yes |
| `items[].notes` | ['string', 'null'] | yes |
| `items[].status` | string | yes |
| `items[].cancel_reason` | ['string', 'null'] | yes |
| `items[].series_id` | ['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')'] | yes |
| `items[].started_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `items[].done_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `items[].done_note` | ['string', 'null'] | yes |
| `items[].arrival_window_minutes` | ['integer', 'null'] | yes |
| `items[].arrive_by` | string (date-time) | yes |
| `items[].on_the_way_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `items[].eta_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `items[].arrived_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `items[].assignee_ids` | array | yes |
| `truncated` | boolean | yes |

```json
{
  "items": [
    {
      "visit_id": "00000000-0000-4000-8000-000000000000",
      "shop_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "job_summary": "...",
      "starts_at": "...",
      "ends_at": "...",
      "title": "...",
      "notes": "...",
      "status": "...",
      "cancel_reason": "...",
      "series_id": "00000000-0000-4000-8000-000000000000",
      "started_at": "...",
      "done_at": "...",
      "done_note": "...",
      "arrival_window_minutes": "...",
      "arrive_by": "...",
      "on_the_way_at": "...",
      "eta_at": "...",
      "arrived_at": "...",
      "assignee_ids": [
        "00000000-0000-4000-8000-000000000000"
      ]
    }
  ],
  "truncated": true
}
```

## Errors

| Code | Status | What to do |
|---|---|---|
| `invalid_input`, `invalid_token`, `rate_limited` |  | Can happen on any call. See [errors](https://doingwork.work/docs/errors/). |
