Skip to main content
This API reference is in beta. The endpoints documented here are live in production and safe to build against. The reference itself is still growing - more of the Placetel platform API will be added over time.
The REST API lets you drive Placetel from your own systems. Today the reference covers the Outbound Calls API: place AI-powered calls to your contacts, personalize each one, and review the outcome. Base URL: https://aipro.placetel.de/api/v1/outbound

Authentication

Every request must send a Bearer token in the Authorization header:
Generate (or rotate) your token on the Outbound Calls page in your dashboard (“Generate API Token”). The token is shown once - store it securely; rotating it invalidates the previous token. Each token only reaches your own agents and data.

Phone number format

All phone numbers must be in E.164 international format - a + followed by digits only. Send the exact format; numbers are not reformatted for you.

Identifying your agent

You identify an agent by its phone number (a leading + is optional), or by its SIP ID (a value starting with t) - not by an internal database ID. When agent_number is a SIP ID, you must also send caller_number: the caller ID shown to the recipient, which has to be a number registered on your Placetel account.

Personalizing the prompt

Inject dynamic values into your agent’s prompt at call time so each recipient hears a tailored message.
1

Add placeholders to the agent's prompt

Use {{name}} syntax in the prompt:
2

Provide the values when placing the call

The prompt is resolved with your values before the call starts.

Rules

  • Every {{placeholder}} in the prompt must be provided, or the request is rejected with 400.
  • Extra keys not used by the prompt are accepted and ignored.
  • Key names should be lower snake_case (letters, digits, underscores), e.g. customer_name. The system__ and secret__ prefixes are reserved.
  • Values must be strings - send numbers and booleans as strings ("3", "true").
  • Up to 25 keys; each value up to 500 characters.
  • In bulk, use either per-destination or a shared top-level prompt_variables, not both.

Correlating calls with your own records

Send your own identifier in metadata.external_call_id and it is echoed back at the top level of the placement response, and carried through to the post-call callback:
The response’s call_id is the primary public identifier for a call. It is also available in post-call actions as %%call_id%%.

Checking results

Every call - single or bulk - belongs to a batch. Use List batches and Get a batch (under Batches in the sidebar) to see whether each call connected. Outcomes also appear in your dashboard, in your outbound call history or in Conversations, together with the full transcript. Filter by the agent you placed the calls with to find them.

Errors

Existing outbound domain errors use this shape:
Messages are always in English. Limit-related errors add a machine-readable error_type, and rate limits add a detail pointing you to where you can request more capacity.
A bulk request returns 201 even when some or all destinations fail. A non-201 means the whole request was rejected and nothing was dialed - check each entry’s success and status in results.

Upcoming customer API request limits

The following request-limit contract is prepared for a future rollout. These limits are not enabled yet. Existing outbound call limits continue to apply.
Selected customer API operations will share a request allowance per tenant and operation group. All users and API tokens belonging to that tenant share the allowance. Rotating a token or changing an IP address does not reset it. Partner API operations are excluded. An allowance permits an initial burst and replenishes over time. Its burst size is not a strict per-minute quota. Each accepted request uses one unit, including a bulk request; existing limits still govern the number of calls it can place. Cancellation has a separate allowance from starting evaluations or placing calls. When the request allowance is exhausted, the API will return 429 with a Retry-After header in seconds and this body:
Wait at least the indicated interval before retrying and add a small random delay when several clients retry together. Other requests can consume the newly available allowance, so a later retry can still receive 429. If the API cannot check the allowance, it will return 503:
This response has no quota reset time. Retry with bounded exponential backoff. For either of these new errors, the requested operation has not executed. Handle the stable error identifier rather than matching the message text.

Quickstart

Removed endpoints

POST /api/v1/outbound/calls/place is no longer available and responds 410 Gone. It existed for the retired SMS-consent flow. Use Place a call or Place calls in bulk instead.