Search calls with a JSON filter
Bounded typed alternative to GET /calls for large call or agent ID selections. POST is used only because the selection can exceed URL limits: this is a read with no effect, safe to retry, needs no Idempotency-Key and counts toward read rate limits. Same workspace authorization, result rows, ordering and cursor rules as the GET form. Body and filter limits are separate from GET: up to 1000 ID values in total and 128 KiB encoded. Results stay paged (limit at most 200); nothing expands transcripts, results or variables. Not a general query language.
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.
Request
Same field names and meaning as the GET /calls query parameters. Fields combine with AND. start/end, updated_since, the 93-day span and metadata_key/metadata_value pairing follow GET /calls exactly. An empty object means no filter within the workspace and default range.
Opaque cursor from the previous page. It binds the filter and limit: send them unchanged with it; a change is refused with invalid_request. Expires after 24 hours.