List call history
Stable descending creation time/ID order. UTC [start,end), maximum 93 days. Includes this workspace’s call records; no diagnostic payloads. updated_since selects changes polling; otherwise creation order applies. Cursor binds every filter and workspace. Metadata lookup supports recovery after intent-key expiry; reconcile all matches and do not automatically redial when ambiguous. ID-list filters use repeated query names. Raw supplied ID count across fields is at most 100. Cursor binds normalized filters; filtered lists are not exact batch retrieval. Changes to transcript, extraction, summary or tool outcomes advance updated_at, including after call terminality. Summary states can be filtered. updated_at is computed at read time from the call, its stored results and its tool outcomes; a GET never starts generation. For more than 100 ID values, use POST /calls/search with the same filter names. In updated_since mode start/end bound updated_at, not created_at; the creation-time default range does not apply. updated_since is the inclusive lower bound; if start is also supplied it must equal updated_since. end is an optional exclusive upper bound, capped by the server visibility watermark. The 93-day maximum scan span remains. Pagination holds its original watermark.
Authentication
Create and manage workspace-owned keys through the existing app session routes, outside this public API. Creator and manager identities are audit actors only. Key validity follows workspace policy, expiry and explicit revocation, independently of creator membership. Do not include a workspace-selection header.
Query parameters
Page size; 50 by default, at most 200.
Exact canonical state filter. Known values: admitted, active, evidence_pending, complete, incomplete, aborted. Invalid filters are refused, not ignored. Repeat for OR within this field; AND with other fields. These are not ID entries; at most 16 values per field, the same bound as the POST form. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Changes polling mode. Inclusive lower bound. Orders by updated_at then id ascending; cursor retains a fixed scan upper bound. After the last page use the returned scanned_through as the next updated_since and deduplicate by (id,updated_at). Updates after the bound appear on the next scan. This is current-state reconciliation, not a lossless event log.
Exact known transcript state; unsupported values refused. Repeat for OR within this field; AND with other fields. These are not ID entries; at most 16 values per field, the same bound as the POST form. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Exact known extraction state; unsupported values refused. Repeat for OR within this field; AND with other fields. These are not ID entries; at most 16 values per field, the same bound as the POST form. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Use with metadata_value for exact customer correlation. Both fields must be supplied.
Exact metadata values for metadata_key (OR). Repeat the name for several values; they count toward the 100 raw filter values. Multiple calls may match one value. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Repeat the query name for multiple IDs. OR within this field; AND across fields. Maximum 100 raw ID entries total across all ID filters. Blank values are invalid. Unknown/inaccessible IDs produce no rows, not an existence disclosure. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Repeat the query name for multiple IDs. OR within this field; AND across fields. Maximum 100 raw ID entries total across all ID filters. Blank values are invalid. Unknown/inaccessible IDs produce no rows, not an existence disclosure. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.
Repeat for OR within state; AND across filters. Unsupported states or blank values are refused. An empty array is invalid and refused: SDKs refuse it before sending, and the server refuses an empty or blank value. Omission means no filter.