---
title: "Search metadata and stored transcript text together"
method: GET
path: "/v1/meetings/content-search"
tags: ["Meetings"]
---

# Search metadata and stored transcript text together

`GET /v1/meetings/content-search`

## Request

- Base URL: `https://api.openpublica.com`
- URL: `https://api.openpublica.com/v1/meetings/content-search`
- Auth: none declared

One compound Atlas ranking over title, summary, topics and existing full transcript text, with live score/ObjectId cursor pagination. Transcript-only results require current nonempty stored text and a searchable flag that is absent or the scalar Boolean true; old catalog publication is not required. Whole quoted queries are analyzed phrases in the flat stored text, not exact-byte or run-bounded quotations. Timestamped excerpts independently verify current immutable timed evidence and may be unavailable. All-source candidates retain current metadata without evidence. Scope checks remain live despite index lag. Follow non-null cursors even on empty pages. No total or complete transcript coverage is claimed. Cache-Control: no-store. Public scope accepts either government_id or government_ids (comma-separated, at most 100 entries). meeting_id applies one exact canonical BSON meeting ID within the same publication and government scope. Private /v1/me/meetings/content-search derives current saved-city scope, rejects government overrides, and binds cursors to the verified account. Old query flags and legacy keyword/transcript serving paths are removed.

## Query parameters

- `q` string, required
- `source` 'all' | 'metadata' | 'transcripts'
- `government_id` string
- `government_ids` string
- `meeting_id` string
- `body_id` string
- `topic` string
- `start_date` string, date
- `end_date` string, date
- `limit` integer
- `cursor` string

## Response `200`

One ranked result per public meeting.

- object
  - `data` object[], required
    - `meeting_id` string
    - `title` string
    - `date` string, date
    - `epoch_timestamp` integer: Unix seconds.
    - `duration_seconds` number: How long the meeting ran, in seconds, derived from the transcript's own timings. ABSENT when unknown — never null and never 0. A meeting published before the pipeline began recording runtime carries none until a backfill reaches it, and a few have no usable transcript to measure, so treat a missing key as 'not measured' rather than as a zero-length meeting. Selectable via `fields`. Corpus totals and their coverage: GET /v1/operations.
    - `government_id` string
    - `category_name` string, nullable
    - `category_tag` string, nullable
    - `summary` string
    - `topics` Topic[]
      - `topic` string
      - `conversation_percentage` number, nullable
    - `video_url` string, uri, nullable
    - `source_url` string, uri, nullable
    - `thumbnail_url` string, uri, nullable
    - `transcript_url` string, uri, nullable
    - `search` object, required
      - `matched_fields` string[], required: Current locally verified evidence only; analyzer-only or lagged index candidates may have no verified fields.
      - `transcript_excerpt` object, nullable, required: Verified immutable transcript-search.v2 hit with excerpt/match codepoint offsets, revision, run/segment locators and citation URLs/context timestamps; null when unavailable.
  - `meta` object, required
    - `schema_version` 'meeting-content-search.v1', required
    - `next_cursor` string, nullable, required
    - `previous_cursor` string, nullable, required
    - `has_more` boolean, required
    - `order` 'relevance', required
    - `coverage` object, required

## Other responses

- `400`: Malformed or invalid parameters.
- `409`: Query, account scope or selected content changed; restart search.
- `429`: Per-IP rate limit exceeded.
- `503`: Disabled or temporarily unavailable; no embedding fallback.

---

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