The
/public/agent/* routes require the X-API-Key header specifically — it
is a required header on those operations, and a session bearer token will not
authenticate them. See Authentication.Choose the right public call route
Peachdesk exposes two public outbound call route families. They are not interchangeable, even though both path parameters look like UUIDs.Do not pass a workflow UUID to
/public/agent/{uuid} and do not pass a trigger UUID
to /public/agent/workflow/{workflow_uuid}. Peachdesk treats these as different
identifier types and the request will fail if you mix them up.- They accept the same request body
- They return the same response shape
- They validate the same
X-API-Keyorganization boundary - They use the same telephony configuration selection rules
Using initial context
initial_context passes runtime data into the agent at call time. Values are available as template variables in your agent’s prompt using double-brace syntax.
{{customer_name}} and {{appointment_date}} and they will be substituted when the call starts.
Dynamic variables and metadata
Three fields carry per-call data, and they are not interchangeable:dynamic_variables is Retell’s retell_llm_dynamic_variables. It is merged on top of initial_context, so when the same key appears in both the value from dynamic_variables wins, and the merged set is what your prompt’s {{variables}} resolve against.
metadata is an opaque object. It is stored on the run and returned verbatim as call.metadata on the call webhooks, so you can match a call to your own records. It is never rendered into the prompt — put values the agent should say or use in dynamic_variables, and values only your backend needs in metadata.
Caller ID selection
The number the recipient sees as the caller ID is chosen as follows:- If you pass
from_number, that number is used. It must be an active outbound number your organization owns on the resolved telephony configuration, or the request is rejected with400 from_number_not_found. - If you omit
from_number, Peachdesk picks one automatically from the outbound numbers on that configuration, rotating across them so a single number is not used for every call. Numbers already on a live call are skipped. If every number is momentarily busy — or the selector is briefly unavailable — the call falls back to the configuration’s default caller ID rather than being delayed. A single API call is never blocked for this reason.
telephony_configuration_id; otherwise your organization’s default configuration is used.

