---
title: "GET /v1/ai/subjects/:id/speech"
method: GET
path: "/v1/ai/subjects/:id/speech"
tags: ["AI Knowledge"]
---

# GET /v1/ai/subjects/:id/speech

`GET /v1/ai/subjects/:id/speech`

## Request

- Base URL: `https://api.quillhub.ai`
- URL: `https://api.quillhub.ai/v1/ai/subjects/:id/speech`
- Auth: HTTP bearer

## Path parameters

- `id` integer, required

## Query parameters

- `from` string: ISO date/timestamp lower bound on recorded_at (created_at).
- `to` string: ISO date/timestamp upper bound on recorded_at (created_at).
- `project_id` integer
- `query` string: Case-insensitive substring match on utterance text.
- `limit` integer: Max utterances returned, newest first. Default 200, hard cap 500 (values above are silently clamped). Also bounds the scan itself: reaching it stops the walk over older recordings and sets has_more.

## Response `200`

Person's utterances across every meeting they were identified as a speaker in.

- object
  - `subject` object, required
    - `id` number, required
    - `name` string, required
  - `utterances` object[], required
    - `transcript_id` number, required
    - `transcript_title` string, nullable, required
    - `recorded_at` string, required
    - `start_time` number, required
    - `end_time` number, required
    - `text` string, required
  - `total` number, required: Matching utterances found by the scan. The scan walks recordings newest-first and STOPS as soon as `limit` utterances are collected, so this is the exact total only when `has_more` is false — which is the case whenever the person has no more than `limit` matching utterances. When `has_more` is true, treat `total` as a LOWER BOUND: older recordings were never read, and narrowing the request (from/to, project_id, query) is the way to get an exact figure. Before 2026-08-09 this was always the exact total, at the cost of loading the person's entire meeting history into memory.
  - `has_more` boolean, required: True when the scan stopped at `limit` with older recordings still unread — there may be more matching utterances than `total` reports. False means the whole history (within the given filters) was scanned and `total` is exact.

## Other responses

- `401`: Unauthenticated.
- `403`: Forbidden.
- `404`: Subject not found.

---

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