This is post-call capture (after the call, fully PyAI-run). For in-call
function calling where your code executes mid-conversation, see
Function calling. For the difference between the tool
systems, see Tools overview.
Configure
Set two fields on the agent — a JSON Schema of the fields to capture and a signed delivery URL:null to turn it
off. extraction_webhook_url must be https.
How a call is matched to your agent
Omni is zero-state — a call is authorized by your key’s org, not a stored agent. To attribute a call to a specific agent’s extraction config, set the connect URL’ssession_label to that agent’s id:
session_label equals an agent id in the
same org — so another tenant’s id can never trigger your extraction.
The delivery (engine → your webhook)
When the call completes, PyAI POSTs the extracted object, signed withX-PyAI-Signature (same scheme as transcription webhooks):
Verify the signature
The signature ist=<unix_seconds>,v1=<hmac> where the HMAC-SHA256 is computed
over `${t}.${rawBody}` with your webhook signing secret:
Behavior & limits
- Best-effort / fail-open. Extraction never blocks or fails a call. If the transcript is empty, the model can’t produce valid JSON, or your webhook is down, the call is unaffected and nothing is delivered.
- Fields you can’t determine come back
null— values are never invented. - The transcript is truncated for very long calls before the extraction pass.
- Delivery is a single signed POST (no retry today). Return
2xxquickly.
See also
Tools overview
Knowledge vs function-calling tools.
Function calling
In-call tools your client executes.
Omni protocol
Connect URL,
session_label, frames.Conversation intelligence
Transcripts, summaries, recordings.