---
title: "Hybrid search over knowledge pages (BM25 + vector)"
method: GET
path: "/v1/default/banks/{bank_id}/knowledge-base/search"
tags: ["Knowledge Base"]
---

# Hybrid search over knowledge pages (BM25 + vector)

`GET /v1/default/banks/{bank_id}/knowledge-base/search`

## Request

- Base URL: `https://hindsight.vectorize.io` (the document declares no server; this is the origin it was published from)
- URL: `https://hindsight.vectorize.io/v1/default/banks/{bank_id}/knowledge-base/search`
- Auth: none declared
- TypeScript: <https://skmtc.dev/vectorize/apis/hindsight-http-api/docs/v1/default/banks/:bank_id/knowledge-base/search/get.ts> (a function with typed inputs; its response is checked against the schema)

Doc-level hybrid search across a bank's knowledge pages: a full-text (BM25) match and a vector-similarity match, Reciprocal-Rank-Fusion fused. No reranker — tuned for latency.

## Path parameters

- `bank_id` string, required

## Query parameters

- `q` string, required: Search query
- `limit` integer: Maximum results to return
- `tags` string[], nullable: Only return pages carrying these tags (matched per `tags_match`, like recall).
- `tags_match` 'any' | 'all' | 'any_strict' | 'all_strict' | 'exact': How `tags` match a page's tags: any, all, any_strict, all_strict, exact. 'any'/'all' also return untagged pages; the _strict modes and 'exact' do not.
- `tag_groups` string, nullable: JSON-encoded compound tag filter, same shape as recall's `tag_groups`, e.g. `[{"or":[{"tags":["user:kate"],"match":"all_strict"},{"tags":["team"]}]}]`. Top-level groups are AND-ed, and AND-ed with `tags`.

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- KnowledgePageSearchResponse: Ranked knowledge-page search results (BM25 + vector, RRF-fused).
  - `results` KnowledgePageSearchResult[], required
    - `id` string, required
    - `name` string, required
    - `mental_model_id` string, nullable
    - `source_query` string, nullable: The question the page answers.
    - `snippet` string, required: The page's opening text. A page whose body is still empty says so in words — 'No content yet.' — rather than coming back blank, so a caller can tell an unwritten page from a page whose snippet simply did not render. The marker is produced on the way out; the stored body stays empty and out of the search index.
    - `score` number, required: Rank-fusion score in 0..1, where 1.0 means every search arm placed this page first. It reflects where the page ranked for this query, not how well its text matched, so it is only comparable within one result set.
    - `updated_at` string, nullable
  - `total` integer, required

## Other responses

- `404`: The bank does not exist.
- `422`: Validation Error

## Changes

- **2026-10-04** `4fda98b75f63`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/vectorize/apis/hindsight-http-api/changes/v1/default/banks/:bank_id/knowledge-base/search/get.md)

---

[API](https://skmtc.dev/vectorize/apis/hindsight-http-api.md) - [All operations](https://skmtc.dev/vectorize/apis/hindsight-http-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vectorize/apis/hindsight-http-api/revisions/45e711cd0897?raw)
