---
title: "List site visits for a mission"
method: GET
path: "/site-visits"
tags: ["SiteVisits"]
---

# List site visits for a mission

`GET /site-visits`

Returns site visits for the given mission. When `compress=true`, returns
a mixed array of the highest-level ClusterVisit and unclustered SiteVisit
objects instead of the paginated list. Each item in the compressed
response includes a `type` discriminator field (`"clusterVisit"` or
`"siteVisit"`).

## Query parameters

- `missionId` string, uuid, required
- `compress` boolean
- `unclustered` boolean
- `status` string
- `limit` integer
- `cursor` string

## Response `200`

Success

- union
  - object
    - `data` SiteVisit[], required
      - `id` string, uuid, required
      - `organizationId` string, uuid, required
      - `missionId` string, uuid, required
      - `siteId` string, uuid, required
      - `clusterVisitId` string, uuid, nullable, required — FK to ClusterVisit; null for unclustered sites
      - `status` 'pending' | 'in-progress' | 'complete' | 'skipped' | 'failed', required
      - `completedAt` number, nullable, required
      - `recaptureReason` string, nullable, required
      - `recaptureRequestedBy` string, uuid, nullable, required — actorId of the requester
      - `recaptureRequestedAt` number, nullable, required
      - `deletedAt` number, nullable, required
      - `createdAt` number, required
    - `meta` PaginationMeta, required
      - `cursor` string, nullable, required — Opaque cursor for the next page; null when no more results
      - `total` integer — Total matching results across all pages; included when cheaply computable
  - CompressedVisitsResponse
    - `data` union[], required — Mixed array of ClusterVisit and SiteVisit objects. Each item includes a `type` field: `"clusterVisit"` or `"siteVisit"`. ClusterVisit items represent the highest-level clusters whose parent cluster does not have a ClusterVisit in the mission. SiteVisit items are unclustered site visits.
      - union
        - object
          - `type` 'clusterVisit', required
          - `id` string, uuid, required
          - `organizationId` string, uuid, required
          - `missionId` string, uuid, required
          - `clusterId` string, uuid, required
          - `siteCount` integer, required
          - `completedCount` integer, required
          - `status` 'pending' | 'in-progress' | 'complete', required
          - `deletedAt` number, nullable, required
          - `createdAt` number, required
          - `updatedAt` number, required
        - object
          - `type` 'siteVisit', required
          - `id` string, uuid, required
          - `organizationId` string, uuid, required
          - `missionId` string, uuid, required
          - `siteId` string, uuid, required
          - `clusterVisitId` string, uuid, nullable, required — FK to ClusterVisit; null for unclustered sites
          - `status` 'pending' | 'in-progress' | 'complete' | 'skipped' | 'failed', required
          - `completedAt` number, nullable, required
          - `recaptureReason` string, nullable, required
          - `recaptureRequestedBy` string, uuid, nullable, required — actorId of the requester
          - `recaptureRequestedAt` number, nullable, required
          - `deletedAt` number, nullable, required
          - `createdAt` number, required
    - `meta` object, required
      - `totalSiteCount` integer, required — Total number of sites represented across all items

## Other responses

- `400` — Bad request or validation error
- `401` — Authentication required
- `403` — Insufficient permissions
- `404` — Resource not found
- `429` — Rate limit exceeded
- `500` — Internal server error

---

[API](https://skmtc.net/voltairlabs/apis/voltair-api.md) · [All operations](https://skmtc.net/voltairlabs/apis/voltair-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/voltairlabs/voltair-api/revisions/be08f4f706f5/schema)
