call.incoming webhook is a blocking request. When an inbound
telephony call or a webhook-mode widget session starts, ThunderPhone
calls your server and waits up to 2 seconds for a configuration
response. Use this event to dynamically choose an agent, rewrite a
prompt, or inject tools per call.
In the endpoint-based delivery system, the
equivalent event types are
telephony.incoming (phone calls) and
web.incoming (widget / mic). The legacy single-URL webhook uses
call.incoming for both. Subscribe to whichever name applies to
your integration style.Request payload
| Field | Type | Description |
|---|---|---|
call_id | integer | Call id — stable across all events for this call |
from_number | string | E.164 caller number. "web" for widget/mic sessions |
to_number | string | E.164 destination (one of your ThunderPhone numbers) |
Response schema
Return a JSON object describing the agent configuration for this call. All unknown top-level keys are rejected — bring anything you need undertools[i].
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | yes | System prompt driving the agent |
voice | string | yes | Voice id from GET /v1/voices. voice_name is accepted as an alias |
product | string | no | Defaults to spark. Allowed: spark, bolt, storm-base, storm-base-with-ack, storm-extra, storm-extra-with-ack |
thinking_level | string | no | base or extra. Derived from product for Storm tiers |
background_track | string | null | no | Ambient audio id or null |
acknowledgement_prompt_mode | string | no | auto or manual (Storm-with-ack products) |
acknowledgement_prompt | string | no | Required if acknowledgement_prompt_mode="manual" |
tools | array | no | Inline function-tool schemas (see Function Tools) |
Speak-order and
max_hold_seconds are not accepted here — they
are only configurable on the Agent itself.
Any other top-level keys are rejected with 400.{} (empty object), null, or a non-2xx status uses the
agent that was statically configured on the phone number or publishable
key.
Example handler
Response with function tools
Attach tools so the AI can call your APIs mid-conversation:Product tier cheat sheet
| Product | Latency | Reasoning | Acknowledgement |
|---|---|---|---|
spark | Lowest | Basic | — |
bolt | Low | Improved | — |
storm-base | Medium | Strong | — |
storm-base-with-ack | Medium | Strong | Auto filler while thinking |
storm-extra | Higher | Deep | — |
storm-extra-with-ack | Higher | Deep | Auto filler while thinking |
Related
call.complete
The non-blocking end-of-call event.
Function Tools
Full JSON schema for
tools[] and the signed endpoint contract.Webhook endpoints
Subscribe multiple URLs to
telephony.incoming / web.incoming.