Meetings

Returns a paginated list of meetings within your agency (this includes phone calls — filter on the method field). Interview-type meetings are NOT returned here — retrieve those from /api/v1/interviews. Each row carries the linked interview context (project, company, participants, organizer), a pre-computed counterparty classification, and boolean flags indicating whether transcript, manual notes, or AI notes exist. Heavy artifacts themselves are not returned here.

Breaking change (coordinate with consumers before release): the type field (and the type query filter) have been removed, and interview-type meetings are now excluded from this list — use /api/v1/interviews for those and the new counterparty field/filter to distinguish who a meeting is with.

Incremental sync: Use createdAfter for the initial historical backfill, then poll with updatedAfter (persist the highest updatedAt you receive and pass it back each poll). updatedAfter matches a change to either the meeting or its linked interview. Add includeDeleted=true to receive soft-deleted meetings as tombstones (deletedAt populated) — combined with updatedAfter this reliably surfaces deletions, because a soft-delete bumps updatedAt.

Custom attributes: pass includeCustomAttributes=true to get each row’s customAttributes (e.g. the meeting tags logged in the UI) inline, in the detail endpoint’s shape, instead of fetching each record by id. customAttributeIds limits which attributes come back. The payload grows with each row’s filled attributes, so keep the default pageSize (25) when syncing with it on. Setting, changing or removing an attribute value moves the row’s updatedAt, so updatedAfter polling picks the change up.

get/api/v1/meetings

Request

Query parameters

personIdstring uuid

Filter by person (returns meetings whose interview links to a candidate of this person, or whose interview people include this person)

Example:550e8400-e29b-41d4-a716-446655440000
projectIdstring uuid

Filter by project (returns meetings whose interview is linked to this project)

Example:550e8400-e29b-41d4-a716-446655440000
startDatestring date-time

Meetings starting on or after this UTC datetime (inclusive). Filters on meeting.startAt.

Example:2026-06-01T00:00:00Z
endDatestring date-time

Meetings starting on or before this UTC datetime (inclusive). Filters on meeting.startAt.

Example:2026-06-30T23:59:59Z
createdAfterstring date-time

Meetings created on or after this UTC datetime (inclusive). Use for the initial backfill of historical meetings.

Example:2025-01-01T00:00:00Z
createdBeforestring date-time

Meetings created on or before this UTC datetime (inclusive).

Example:2026-01-01T00:00:00Z
updatedAfterstring date-time

Returns meetings whose meeting row OR linked interview was updated on or after this UTC datetime (inclusive). This is the primary cursor for incremental polling — persist the highest updatedAt you receive and pass it back on the next poll. Combine with includeDeleted=true to also pick up deletions (a soft-delete bumps updatedAt).

Example:2026-06-01T00:00:00Z
updatedBeforestring date-time

Returns meetings whose meeting row OR linked interview was updated on or before this UTC datetime (inclusive).

Example:2026-06-30T23:59:59Z
includeDeleted'true' | 'false'

When true, soft-deleted meetings are included as tombstones (the deletedAt field is populated). Defaults to false, which returns only live meetings.

Example:false
status'scheduled' | 'finished'

scheduled matches upcoming/in-progress statuses (draft, created, scheduled, coming, waiting_to_join, live, scheduling). finished matches terminal statuses (completed, transcribed, failed, canceled, no_answer).

Example:scheduled
counterparty'contact' | 'candidate' | 'internal' | 'unknown'

Filter by the pre-computed counterparty: contact, candidate, internal or unknown.

Example:candidate
method'video_call' | 'phone_call' | 'in_person'

Filter by the interview communication method: video_call, phone_call or in_person. Use phone_call to retrieve only phone calls.

Example:phone_call
includeCustomAttributes'true' | 'false'

When true, each row includes customAttributes — its custom attribute values (e.g. the meeting tags logged in the UI) in the same shape as GET /api/v1/meetings/{meetingId}. Defaults to false, which leaves the field out. See Custom attributes in the endpoint description for payload size and sync notes.

Example:true
customAttributeIdsstring

Comma-separated custom attribute UUIDs (from GET /api/v1/meetings/custom-attributes). Limits customAttributes on each row to these attributes — it does not filter which rows are returned. Requires includeCustomAttributes=true; sending it without is rejected with 422.

Example:550e8400-e29b-41d4-a716-446655440000
pageinteger

Page number (1-indexed)

Example:1
pageSizeinteger

Items per page (max 100)

Example:25
perPageinteger

Alias for pageSize

Response

Paginated meetings

status'ok' required

Example response

{
  "pagination": {
    "page": 1,
    "pageSize": 25,
    "total": 42,
    "totalPages": 2
  }
}

Changes

    • warning

      added the new undefined enum value to the //// response property for the response status

    • warning

      added the new undefined enum value to the // response property for the response status

    • warning

      added the new undefined enum value to the // response property for the response status

    • info

      added the new optional query request parameter customAttributeIds

    • info

      added the new optional query request parameter includeCustomAttributes

    • info

      added the optional property // to the response with the status