---
title: "Search Observations"
method: GET
path: "/v1/observation/"
tags: ["Observations"]
---

# Search Observations

`GET /v1/observation/`

## Request

- Base URL: `https://developer.beta.salussafety.io`
- URL: `https://developer.beta.salussafety.io/v1/observation/`
- Auth: one of:
  - HTTP bearer
  - OAuth 2
    - Client credentials
    - Token URL: `https://guardian.beta.salussafety.io/token`
  - OAuth 2
    - Authorization code: `https://guardian.beta.salussafety.io/authorize`
    - Token URL: `https://guardian.beta.salussafety.io/token`

Search for observations that match the provided filters.

Keywords are searched for in the observation _value_ field. For image and voice observations,
the response includes a time-limited _signed_url_ to access the media file.

## Query parameters

- `query` string: Keyword to match in the observation text. Empty string returns recent observations.
- `site_id` integer, nullable: Filter to observations from a specific site/project.
- `type` string, nullable: Filter by media type: 'text', 'image', or 'voice'. Note: 'audio' is a legacy value on older rows; filter on both 'voice' and 'audio' for complete history.
- `limit` integer: Maximum number of results to return.
- `skip` integer: Number of results to skip for pagination.

## Response `200`

Successful Response

- ApiGenericResponsePaginatedResponseObservationModel
  - `error` boolean: A boolean error indicator.
  - `message` string, nullable: Optional message.
  - `data` PaginatedResponseObservationModel
    - `results` ObservationModel[], required
      - `id` string, required: Observation UUID.
      - `companyId` integer, required
      - `userId` integer, required: The user who captured the observation.
      - `siteId` integer, nullable
      - `capturedAt` string, date-time, required
      - `type` string, required: Media kind: 'text', 'image', or 'voice' ('audio' is a legacy value on older rows).
      - `value` string, required: Payload: note text, or the stored S3 object key for image/voice.
      - `signedUrl` string, nullable: For image/voice observations: a time-limited presigned URL to fetch the media. Null for text. Use this (not `value`) to access the media; it expires.
      - `imageUrl` string, nullable: For image observations: a URL served by the image-resize utility. Not presigned and does not expire, and already sized for report display. Hand it to a vision model or embed it directly in report markdown. Null for text and voice — the resize utility cannot serve audio, so use `signedUrl` for voice media.
      - `metadata` object: Enrichment bag — transcription, AI analysis, etc.
      - `deleted` boolean
      - `groupIds` string[]: UUIDs of the observation_groups this observation belongs to.
      - `createdAt` string, date-time, nullable
      - `updatedAt` string, date-time, nullable
    - `total` integer, required
    - `current_page` integer, required
    - `page_size` integer, required
    - `total_pages` integer, required
    - `has_more` boolean, required

## Other responses

- `400`: Business Logic Error
- `403`: Permission Error
- `409`: Integrity Error or Data Conflict
- `422`: Validation Error

## Changes

- **2026-11-03** `9ee72e046aa1`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/salussafety/apis/salus-developer-api/changes/v1/observation/get.md)

---

[API](https://skmtc.dev/salussafety/apis/salus-developer-api.md) - [All operations](https://skmtc.dev/salussafety/apis/salus-developer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/salussafety/apis/salus-developer-api/revisions/9ee72e046aa1?raw)
