> This page is for version v4 (default).
> For other versions, use one of these documentation indexes:
> - v4 (default): https://help.getzep.com/v4/llms.txt
> - v3: https://help.getzep.com/v3/llms.txt
> - v2: https://help.getzep.com/v2/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://help.getzep.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://help.getzep.com/_mcp/server.

# Search observations

POST https://api.getzep.com/api/v4/graphs/{graph_uuid}/search/observations
Content-Type: application/json

Observation search supports no filters. Every filter returns unsupported_filter.

Reference: https://help.getzep.com/sdk-reference/graph/search-observations

## Authentication

- `Authorization` header (required) (prefixed with ` Api-Key  `) — Type "Api-Key" followed by a space and the project API key.

## Request

### Path parameters

- `graph_uuid` (string, required) — The UUID of the graph. For a user graph, you can also use the UUID of the user.

### Query parameters

- `page_size` (integer, optional, default: 50) — The maximum number of items in one page. The SDK method returns a pager. In Python, `.items` holds only the first page. In TypeScript, `.data` holds only the first page. To read every page, iterate the pager: use `for` or `list(...)` in Python, or `for await` in TypeScript. In Go, the method returns one page, and `Iterator()` reads all pages. Search ranks a limited set of results, so iteration ends after that set. To get the top N results, set `page_size` to N and read the first page.
- `cursor` (string, optional) — Opaque page cursor

### Body (application/json)

This endpoint expects a v4.SearchObservationsRequest.

- `query` (string, required) — The search query.
- `bfs_origin_node_uuids` (list of string, optional) — Nodes used as BFS origins for graph-distance-aware retrieval.
- `center_node_uuid` (string, optional) — The node to rank results by distance from. Required when reranker is node_distance.
- `filter_low_quality_results` (boolean, optional) — The default is false. When true, Zep removes low-quality results at the knee of the cross-encoder score curve. The filter never removes a result with a score of 0.9 or more. It keeps at least 5 results, or all results when fewer than 5 are available. The filter only removes results, so a page still returns up to page_size results. Use this field only with reranker cross_encoder. It is not supported for episode search. Invalid combinations return a 400 error. The cutoff is approximate, not guaranteed. When the cross-encoder does not score the results, for example after a timeout, Zep returns the results without the filter.
- `filters` (v4.ObservationSearchFilters, optional) — Filters constraining which items are returned.
- `mmr_lambda` (double, optional) — The diversity weighting used for maximal marginal relevance reranking. Required when reranker is mmr.
- `reranker` (enum, optional) — The reranking strategy applied to retrieved results. Defaults to rrf.
  - Allowed values: `rrf`, `mmr`, `node_distance`, `episode_mentions`, `cross_encoder`

## Response

### 200

OK

- `items` (list of v4.Observation, optional) — The observations on this page.
- `next_cursor` (string, optional) — The cursor to pass as the next request's cursor to fetch the following page; absent when no further pages remain.
- `total_size` (integer, optional) — Omitted for this collection; use next_cursor to detect the end of pagination.

## Errors

### 400 Bad Request Error

Bad Request

- `error` (v4.ErrorBody, optional)

### 401 Unauthorized Error

Unauthorized

- `error` (v4.ErrorBody, optional)

### 403 Forbidden Error

Forbidden

- `error` (v4.ErrorBody, optional)

### 404 Not Found Error

Not Found

- `error` (v4.ErrorBody, optional)

## Types

### v4.ObservationSearchFilters

### v4.Observation

- `attributes` (map from string to any, optional) — Additional attributes of the derived node, as defined by its entity type.
- `created_at` (string, optional) — The time the observation was created.
- `episode_uuids` (list of string, optional) — The unique identifiers of the episodes that support this observation.
- `graph_uuid` (string, optional) — The unique identifier of the graph this observation belongs to.
- `labels` (list of string, optional) — The labels identifying the type of this observation.
- `name` (string, optional) — The name of the observation.
- `relevance` (double, optional) — A cross-encoder-derived relevance score, present only when the cross-encoder reranker scored this result; like score, it is omitted from plain list results.
- `score` (double, optional) — The ranking score returned with every search result; omitted when the observation appears in a plain list rather than a search result.
- `summary` (string, optional) — A generated summary of the observation.
- `user_uuid` (string, optional) — The unique identifier of the user that owns the graph. Present only when the graph is a user graph.
- `uuid` (string, optional) — The unique identifier of the observation, assigned by Zep.

### v4.ErrorBody

- `code` (string, optional)
- `details` (map from string to any, optional)
- `message` (string, optional)
- `param` (string, optional)
- `request_id` (string, optional)

## Examples

**Request**

```json
{
  "query": "string"
}
```

**Response**

```json
{
  "items": [
    {
      "attributes": {},
      "created_at": "string",
      "episode_uuids": [
        "string"
      ],
      "graph_uuid": "string",
      "labels": [
        "string"
      ],
      "name": "string",
      "relevance": 1.1,
      "score": 1.1,
      "summary": "string",
      "user_uuid": "string",
      "uuid": "string"
    }
  ],
  "next_cursor": "string",
  "total_size": 1
}
```