---
title: "Hybrid semantic + keyword search highlights"
method: GET
path: "/search"
tags: ["Search"]
---

# Hybrid semantic + keyword search highlights

`GET /search`

## Request

- Base URL: `https://api.screvi.com/api/v1`
- URL: `https://api.screvi.com/api/v1/search`
- Auth: API key in header `X-API-Key`

Search your highlights using AI-powered semantic search combined with full-text keyword search. Results are ranked using Reciprocal Rank Fusion (RRF) which merges both signals for higher quality results. Searches highlight content, notes, source names, and authors.

## Query parameters

- `q` string, required
- `source` string
- `min_relevance` number
- `verify` boolean
- `page` integer
- `per_page` integer

## Response `200`

Search results with relevance scores

- object
  - `data` SearchResult[]
    - `id` string, uuid
    - `content` string: The highlight text
    - `note` string, nullable: User note attached to the highlight
    - `favorite` boolean
    - `url` string, nullable
    - `location` number, nullable: Position in the source (Kindle location, page, or offset)
    - `date` string, date-time, nullable
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `tags` Tag[]
      - `id` string, uuid
      - `name` string
      - `color` string, nullable
    - `source` HighlightSource
      - `id` string, uuid
      - `name` string
      - `type` 'book' | 'article' | 'tweet' | 'self' | 'podcast' | 'video' | 'custom' | 'youtube' | 'pdf'
      - `author` string, nullable
      - `image_url` string, nullable
      - `url` string, nullable
    - `metadata` object: Free-form JSON stored with the highlight. Only returned when `include_metadata=true`.
    - `similarity` number, nullable: Cosine similarity score (0-1) for semantic matches, null for text matches
    - `match_type` 'semantic' | 'keyword' | 'both': How this result was matched: by embedding, by keyword, or by both
    - `relevance` number: Fused rank score; only comparable within one search
    - `verified_relevance` number, nullable: With verify=true: probability (0-1) that the highlight is about the query. Null when not verified.
  - `pagination` Pagination
    - `page` integer
    - `per_page` integer
    - `total` integer
    - `total_pages` integer
    - `has_more` boolean

## Other responses

- `400`: Missing or invalid query parameter
- `401`: Missing or invalid API key

---

[API](https://skmtc.dev/screvi/apis/screvi-public-api.md) · [All operations](https://skmtc.dev/screvi/apis/screvi-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/screvi/apis/screvi-public-api/revisions/b14be9630c5d?raw)
