> ## Documentation Index
> Fetch the complete documentation index at: https://docs.granola.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Search transcripts

> Search meeting transcripts by keyword to find where something was said. Each result is a note with up to two short excerpts from its transcript; use Get transcript to read the conversation around them.

Recent meetings can be missing until their note's summary is generated. Keys with the Notes by ID scope get no results.



## OpenAPI

````yaml post /v1/notes/transcripts/search
openapi: 3.1.0
info:
  title: Granola API
  version: 1.7.0
  description: API for accessing meeting data from Granola
servers:
  - url: https://public-api.granola.ai
    description: Production
security: []
paths:
  /v1/notes/transcripts/search:
    post:
      summary: Search transcripts
      description: >-
        Search meeting transcripts by keyword to find where something was said.
        Each result is a note with up to two short excerpts from its transcript;
        use Get transcript to read the conversation around them.


        Recent meetings can be missing until their note's summary is generated.
        Keys with the Notes by ID scope get no results.
      operationId: search_transcripts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                keywords:
                  type: array
                  items:
                    type: string
                    minLength: 1
                    maxLength: 100
                  minItems: 1
                  maxItems: 20
                  description: >-
                    Words to search for. Required unless cursor is set. An entry
                    matches when all its words are said close together, in any
                    order; a note needs only one entry to match. Synonyms and
                    other spellings are not matched, so add them as separate
                    entries.
                participant:
                  type: string
                  minLength: 1
                  maxLength: 200
                  description: >-
                    Only meetings with this person or company on the calendar
                    invite, or where they are named as a speaker: a name, email,
                    company or domain. A meeting matched only by speaker name
                    returns just the parts where they spoke.
                from_date:
                  anyOf:
                    - type: string
                      format: date
                    - type: string
                      format: date-time
                  description: >-
                    Only meetings that started at or after this date or UTC
                    timestamp. A date means midnight UTC. Notes without a
                    calendar event use their creation time.
                  examples:
                    - '2026-01-27'
                    - '2026-01-27T15:30:00Z'
                to_date:
                  anyOf:
                    - type: string
                      format: date
                    - type: string
                      format: date-time
                  description: >-
                    Only meetings that started at or before this date or UTC
                    timestamp. A date means midnight UTC at the start of that
                    day, so it leaves out meetings later that day.
                  examples:
                    - '2026-01-27'
                    - '2026-01-27T15:30:00Z'
                page_size:
                  type: integer
                  minimum: 1
                  maximum: 30
                  default: 10
                  description: Maximum number of notes to return per page
                  example: 10
                cursor:
                  type: string
                  minLength: 1
                  maxLength: 2048
                  description: >-
                    The cursor from the previous response, to fetch the next
                    page. Send it alone or with page_size. Cursors expire after
                    15 minutes.
              additionalProperties: false
            examples:
              keywords:
                summary: Find where pricing came up in meetings with Acme
                value:
                  keywords:
                    - pricing
                    - price increase
                    - cost
                  participant: acme.com
                  from_date: '2026-10-01'
                  page_size: 10
              nextPage:
                summary: Continue with the cursor from the previous response
                value:
                  cursor: CURSOR_FROM_PREVIOUS_RESPONSE
                  page_size: 10
      responses:
        '200':
          description: >-
            Matching notes with transcript excerpts, and whether there are more
            pages
          content:
            application/json:
              schema:
                type: object
                properties:
                  notes:
                    type: array
                    items:
                      allOf:
                        - $ref: '#/components/schemas/NoteSummary'
                        - type: object
                          properties:
                            meeting_at:
                              type: string
                              format: date-time
                              description: >-
                                When the meeting started according to the
                                calendar, or the note's creation time if it has
                                no calendar event.
                              example: '2026-01-27T15:30:00Z'
                            passages:
                              type: array
                              items:
                                type: object
                                properties:
                                  text:
                                    type: string
                                    description: >-
                                      An excerpt of up to 240 characters around
                                      a matching word. It can start or end
                                      mid-sentence and does not name the
                                      speaker.
                                    example: >-
                                      so the pricing for the Greek range goes up
                                      in January, and we tell the retailers next
                                      week
                                  start_time:
                                    type:
                                      - string
                                      - 'null'
                                    format: date-time
                                    description: >-
                                      Approximately when the excerpt was spoken,
                                      or null when unknown. Use it to find the
                                      excerpt in Get transcript.
                                    example: '2026-01-27T15:42:10Z'
                                  matched_keywords:
                                    type: array
                                    items:
                                      type: string
                                    description: >-
                                      Every keywords entry found in the section
                                      of the transcript the excerpt is cut from.
                                      The excerpt shows only part of that
                                      section, so it may not contain them all.
                                    example:
                                      - pricing
                                required:
                                  - text
                                  - start_time
                                  - matched_keywords
                              description: >-
                                Up to two of the note's best-matching transcript
                                excerpts.
                          required:
                            - meeting_at
                            - passages
                  hasMore:
                    type: boolean
                    description: >-
                      Whether there is another page. A page can hold fewer notes
                      than page_size, or none, and still have more, so keep
                      requesting with cursor until this is false.
                  cursor:
                    type:
                      - string
                      - 'null'
                    description: The next-page cursor, or null when hasMore is false.
                  completion_status:
                    type: string
                    enum:
                      - more_available
                      - exhausted
                      - incomplete
                    description: >-
                      more_available: fetch the next page with cursor.
                      exhausted: there are no more matches. incomplete: the
                      search stopped after examining 10,000 notes without
                      finishing; narrow it and search again.
                required:
                  - notes
                  - hasMore
                  - cursor
                  - completion_status
        '400':
          description: Invalid request body, or an expired cursor
        '401':
          description: Unauthorized - Invalid API key
        '403':
          description: A workspace admin has turned off transcript access over the API
        '404':
          description: The API key's access scope cannot use this endpoint
        '429':
          description: Rate limited
        '500':
          description: Search unavailable
      security:
        - ApiKeyAuth: []
components:
  schemas:
    NoteSummary:
      type: object
      properties:
        id:
          type: string
          pattern: ^not_[a-zA-Z0-9]{14}$
          description: The ID of the note
          example: not_1d3tmYTlCICgjy
        object:
          type: string
          enum:
            - note
          description: The object type of the note
        title:
          type:
            - string
            - 'null'
          description: The title of the note
          example: Quarterly yoghurt budget review
        owner:
          $ref: '#/components/schemas/User'
        created_at:
          type: string
          format: date-time
          description: The creation time of the note
          example: '2026-01-27T15:30:00Z'
        updated_at:
          type: string
          format: date-time
          description: The last update time of the note
          example: '2026-01-27T16:45:00Z'
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the note was deleted, or null if it has not been. Only keys
            with access to all workspace notes can see deleted notes.
          example: null
      required:
        - id
        - object
        - title
        - owner
        - created_at
        - updated_at
        - deleted_at
    User:
      type: object
      properties:
        name:
          type:
            - string
            - 'null'
          description: The name of the user
          example: Oat Benson
        email:
          type: string
          format: email
          description: The email of the user
          example: oat@granola.ai
      required:
        - name
        - email
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: apiKey

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.