# listAppointments

List appointments: org-wide for a team-admin key, the key owner's own otherwise (MEMBER keys always only their own, whatever the filters). Optional participants (listTeammates userIds, same-org), startDate/endDate, completed, searchTerm. Each row has times, location, linked contacts and participants. PAGING: this operation IS cursor-paginated, so "show me the rest" is answerable here. When canFetchNext is true, re-call with the SAME filters and cursor set to the LAST row's id to get the rows after it; repeat until canFetchNext is false. Forward only: there is no backwards page, so to revisit earlier rows restart from the top. Keep every filter identical between pages; changing one restarts the walk. total is the unpaged match count for the filters, so nothing is silently truncated. A LIST, not a conflict check: it sees only what Goliath recorded as an appointment; checkAvailability says whether a slot is actually free.

- Call: `POST https://server.goliathdata.com/api/v1/call` with `{ "operationId": "listAppointments", "variables": {...} }`
- Scope: `READ`
- Type: query
- Idempotency: a read; rejects `Idempotency-Key`
- Rate-limited: no
- Result cap: `limit` is clamped to 50, without an error

## Variables

- `participants`: `[String!]`
- `startDate`: `DateTime`
- `endDate`: `DateTime`
- `completed`: `Boolean`
- `searchTerm`: `String`
- `limit`: `Int` (default `25`)
- `cursor`: `String`

## Response (data, an example)

```json
{
  "users": {
    "getUserAppointments": {
      "tasks": [
        {
          "id": "<ID>",
          "title": "…",
          "startDate": "2026-01-01T00:00:00.000Z",
          "endDate": "2026-01-01T00:00:00.000Z",
          "timezone": "IDLW",
          "location": "…",
          "description": "…",
          "outcome": "…",
          "completedAt": "2026-01-01T00:00:00.000Z",
          "appointmentReminderWorkflowGroupId": "<ID>",
          "participants": [
            {
              "id": "<ID>",
              "firstName": "…",
              "lastName": "…"
            }
          ],
          "contacts": [
            {
              "id": "<ID>",
              "name": "…"
            }
          ]
        }
      ],
      "total": 0,
      "canFetchNext": true
    }
  }
}
```

## Example

```bash
curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operationId": "listAppointments",
    "variables": {}
  }'
```
