# Placetel MCP Server — 127 tools via DADL

The Placetel DADL turns Placetel's API into an MCP server that Claude, GPT or any MCP-compatible agent can consume directly. One YAML file declares all 127 tools — call, cti, routing, webex, number, sip, and more — and ToolMesh serves them at runtime. No Python boilerplate, no per-endpoint code, no separate MCP server process.

Below: the endpoint coverage matrix, a two-block ToolMesh setup, the full tool reference grouped by Placetel feature area, required credential scopes.

**Source:** [Placetel REST API v2](https://api.placetel.de/v2/docs/)

**Updated:** 2026-11-09

**Tags:** cloud, communication, crud, user-management, webhooks, file-management, logging, automation, auth:bearer

## Which Placetel endpoints are covered?

**100%** (127 of ~127 endpoints).

**Focus:** Placetel REST API v2: calls (call log, voicemails, click-to-dial, call detail records, recordings), CTI call control (answer, hold, transfer, conference, DTMF), routing (forwards, ring groups, IVR menus, queues, routing plans, time settings, number profiles), SIP users (extensions, short codes, hotdesking), contacts, numbers, SMS, fax, prompts, call center, users, phone provisioning, webhooks, Microsoft Teams, Webex.

**Missing:** Every endpoint of the published document is declared. Limits: array query filters take one value per call (call center queue_ids, recordings direction, CTI config params); the ai routing behavior is returned but cannot be written; webhook callbacks themselves are delivered outside the REST API; SIP passwords, hotdesk PINs and fax PINs are masked in responses. Read tools and the write tools for contacts, prompts, routings, routing plans, groups and number profiles verified against a live account on 2026-11-09; calls, SMS, fax, SIP users, users, short codes, CTI, call center, recordings, Teams, Webex and customers not yet tested live. The allowed short code values are not documented.


*Last reviewed: 2026-11-09*

## How do you configure the Placetel DADL?

1. Sign in to the Placetel web portal at https://web.placetel.de.
2. Open Integrations > Web API (https://web.placetel.de/integrations/web_api).
3. Create a new API token there, or copy the existing one (an API v1 key also works for v2). Store it right away.
4. Partner accounts only: the customer endpoints need a token with the read:customers scope.
5. Put the key into the ToolMesh .env as CREDENTIAL_PLACETEL_API_KEY and add the backends.yaml entry below.
6. Restart ToolMesh and call placetel_health (or get_me): it must return your account with id and name.

**Environment variable:** `CREDENTIAL_PLACETEL_API_KEY`

[Authentication docs](https://api.placetel.de/v2/docs/)

*The key has full access to the account: it can place calls, send SMS and faxes, change routings, delete data and manage users. Restrict what agents may do with ToolMesh authorization on the access classes (read, write, admin, dangerous). Call center, Microsoft Teams, Webex, Placetel AI, SIM cards and the partner customer endpoints only answer when the product is booked; Microsoft Teams additionally has to be enabled for API access. The API is rate limited (token bucket; 429 with Retry-After).
*

## How do you install the Placetel MCP server with ToolMesh?

Add to your `backends.yaml`:

```yaml
- name: placetel
  transport: rest
  dadl: placetel.dadl
  url: "https://api.placetel.de/v2"

```

Set the credential:

```
CREDENTIAL_PLACETEL_API_KEY=your-token-here
```

## What 127 tools does the Placetel DADL expose?

- **GET** `get_me` — The account behind the API key: {id, name, email, company, primary_sip_user_id, platform (product line, e.g. PROFI), rights_numbers (numbers this login may see), main_account_id, created_at, updated_at}. Cheapest call to check that the key works; used as the health check.

- **GET** `get_ai_status` — Status and usage of the account's Placetel AI integration: {status (e.g. active), minute_package, remaining_minutes, remaining_budget, total_cost (net AI cost of the last 7 days), currency, refreshed_at}. The budget figures are only present while the integration is active; otherwise only status is returned.

- **GET** `list_calls` — Call log of INCOMING calls for ONE day (default today), newest first. For a period, call once per date. Each Call: {id, type (accepted | missed | voicemail | blocked), from_number (national format), to_number (the full Number object of the dialed number: id, number, e164, prefix, numonly, routing_id, site_id, ...), duration (seconds), file_url (audio of a voicemail, else null), contact (the matching contact or null), received_at, unread}. Number filters take the national format (02211234567); E.164 finds nothing. Omit unused filters: an empty or unknown filter value (e.g. filter[type]="" or "outgoing") silently returns an empty list. Outgoing calls are not in this log: use list_call_detail_records. Paged: plain array, increment page until a page has fewer than per_page items.

- **GET** `get_call` — One call of the incoming call log by ID (same fields as list_calls).
- **POST** `initiate_call` — Click-to-dial: Placetel rings the phone(s) registered for sipuid and, once answered there, connects to target. Returns the created Call. Not retried automatically (no idempotency key): after a timeout check before dialing again.

- **DELETE** `delete_call` — Delete an entry of the incoming call log, e.g. a voicemail. Irreversible. Returns no body (204).
- **GET** `list_call_detail_records` — Billing records (itemized call records) of ONE day, including outgoing calls and forwards: {amount (charge in the account currency), description (connection type label), from, to, length (seconds), answer_uri (who answered, null if nobody), received_at}, oldest first. date is required; for a period call once per day. per_page goes up to 500 here. Paged: plain array.

- **GET** `list_recordings` — Call recordings, newest first; without booked call recording the API answers 404 "404 not found". Each: {id, direction (e.g. in), from, to, duration (seconds), time, file (URL of the audio file), created_at, updated_at}. Paged: plain array.

- **GET** `get_recording` — One call recording by ID, with the file URL of the audio.
- **DELETE** `delete_recording` — Delete a call recording and its audio. Irreversible. Returns no body (204).
- **GET** `list_contacts` — Phone book contacts: {id, user_id, speeddial, first_name, last_name, email, email_work, company, address, address_work, phone, phone_work, mobile, mobile_work, fax, fax_work, facebook_url, linkedin_url, xing_url, twitter_account, blocked, color, tags, created_at, updated_at}. For caller lookup use search[number]: it normalizes, so 02211234567, +492211234567 and 2211234567 all find the contact (partial numbers do not). Valid German numbers are stored in E.164, so the exact filters filter[phone], filter[mobile] etc. need the +49 form. All filters are exact matches (no prefix search). Contacts with blocked=true form the account's blocklist. Paged: plain array.

- **GET** `get_contact` — One contact by ID (same fields as list_contacts).
- **POST** `create_contact` — Create a phone book contact. All fields are optional. Valid German numbers are stored in E.164 (+49...) whatever format is sent. Set blocked=true to block calls from the contact's numbers. Returns the Contact. Not retried automatically.

- **PUT** `update_contact` — Update a contact. Only the fields sent are changed; an empty string clears a field; tags replaces the whole tag list. Returns the Contact.

- **DELETE** `delete_contact` — Delete a contact. Irreversible. Returns no body (204).
- **POST** `send_sms` — Send a text message (SMS) to a mobile number; SMS are billed by Placetel. Returns no body on success (201). Not retried automatically, so a timeout never causes a duplicate SMS.

- **GET** `list_faxes` — Inbound and outbound faxes, newest first: {id, type (inbound | outbound), from_number, to_number, pages, retries, status (queued | working | success | failed | busy | conversion_error), status_info (outbound only, e.g. a T.38 error), email, header, duration, file (URL of the PDF), report (URL of the transmission report PDF), created_at}. Paged: plain array.

- **GET** `get_fax` — One fax by ID, e.g. to poll the status of an outbound fax (queued -> working -> success or failed/busy/conversion_error).
- **POST** `send_fax` — Send a PDF as fax. file must be a base64 data URI ("data:application/pdf;base64,..."); in ToolMesh pass "tm-blob://<id>#dataurl" after upload_file instead of inline base64. Returns the Fax (status queued); poll get_fax for the result. A status mail goes to email. Not retried automatically.

- **DELETE** `delete_fax` — Delete a fax and its documents. Irreversible. Returns no body (204).
- **GET** `list_numbers` — Phone numbers of the account: {id, routing_id (routing object, see get_routing), site_id, prefix (area code), numonly, number (national format), e164, activated, test_number, name, description, carrier, created_at, updated_at}. Paged: plain array.

- **GET** `get_number` — One phone number by ID (same fields as list_numbers). Follow routing_id with get_routing to see how its calls are handled.
- **POST** `activate_number` — Activate a number of the account so it takes calls. Activation may be charged. Returns the Number. Not retried automatically.
- **DELETE** `deactivate_number` — Deactivate a number: it stops taking calls. Returns no body (204).
- **GET** `list_number_profiles` — Profiles of a number: saved alternative configurations (e.g. office hours vs. holidays), exactly one active. Each {id, name, number_id, active}. Switch with activate_number_profile. Empty while a number has only its routing; once a profile was created, the number's own routing object shows up as active profile "Standard" (its id equals Number.routing_id).

- **POST** `create_number_profile` — Create a new, inactive profile for a number. On a number without profiles Placetel also turns the number's routing object into the active profile 'Standard' and sets that routing's name to 'Standard'; deleting the new profile later does not undo this. Returns the Profile {id, name, number_id, active}. Not retried automatically.
- **PUT** `activate_number_profile` — Make a profile the active one for a number, which changes how the number handles calls. Returns the Profile.
- **DELETE** `delete_number_profile` — Delete a profile of a number. Never delete the active profile 'Standard': its id is the number's routing object (Number.routing_id). Irreversible. Returns no body (204).
- **GET** `list_routings` — Routing objects: {id, name, one behavior object (forward, group, plan, ivr, queue, api or ai), mailbox, notification, time_settings (only {enabled} while disabled), custom_caller_id ({enabled: 0 or 1, name, number}), music_on_hold, notify_external_api, priority, created_at, updated_at}. name may be null. Paged: plain array.

- **GET** `get_routing` — The routing object of a phone number, or a routing object by ID (same fields as list_routings). Answers "where do calls to this number go?".

- **POST** `create_routing` — Create a routing object. Set exactly ONE behavior: forward, group, ivr, queue or api (plan only exists on update_routing). Optional extras: mailbox, notification, time_settings, custom_callerid, music_on_hold. Standalone routing objects serve as IVR menu items, routing plan entries or backup targets; to change what a number does, call update_routing with the number instead. Defaults when omitted: mailbox active, notification type all with receiver global, priority 99, time_settings disabled. Returns the RoutingObject. Not retried automatically.

- **PUT** `update_routing` — Change how a number (or routing object) handles calls. Set ONE behavior: forward, group, plan, ivr, queue or api. Example: forward a number to a mobile phone after 20 s on the office phone with forward={destinations: [{targets: ['7771234567@fpbx.de'], ringing_time: 20}, {targets: ['+491701234567'], ringing_time: 30}], behaviour: 'mailbox'}. Only the objects sent change; omitted name, forward, time_settings or mailbox stay as they are (verified). A ringing_time outside the listed values is rejected with 400. Returns the RoutingObject.

- **DELETE** `delete_routing` — Delete a routing object (by ID or by the number it belongs to). Calls to an affected number lose their routing. Irreversible. Returns no body (204).
- **GET** `list_routing_plans` — Routing plans: ordered sets of routing objects, each with its own time settings; the first active one answers. Each {id, name, description, did (internal extension of the plan), routing_object_counts, rings_for (numbers that use the plan, national format), created_at, updated_at}. Paged: plain array.

- **GET** `get_routing_plan` — One routing plan by ID. Its routing objects come from list_routing_plan_objects.
- **GET** `list_routing_plan_objects` — The routing objects of a routing plan, in priority order (same fields as list_routings).
- **GET** `simulate_routing_plan` — Which routing object of a plan would answer a call at a given time (checks time settings and holidays). Returns that RoutingObject (same fields as list_routings), or an empty result when no routing object of the plan is active at that time. Read-only.
- **POST** `create_routing_plan` — Create a routing plan from existing routing objects. The routing objects then belong to the plan: delete_routing_plan deletes them too. did stays null when omitted. Returns the RoutingPlan. Not retried automatically.
- **PUT** `update_routing_plan` — Update a routing plan. Without routing_objects the plan keeps its objects (verified); when sent, send the complete list in the wanted order. Returns the RoutingPlan.
- **DELETE** `delete_routing_plan` — Delete a routing plan AND the routing objects in it (verified: a routing object of the plan was gone afterwards). Check list_routing_plan_objects, SIP users (routing_plan_id) and routings with plan behavior first. Irreversible. Returns no body (204).
- **GET** `list_sip_users` — SIP users (phone extensions): {id, sipuid, username, domain, name, description, did (internal extension), callerid (outbound caller ID), type (standard | blf | fax | trunk | legacy_standard), webuser_id and webuser (owning user), automatic_prefix, blocked_prefixes, routing_plan_id (fallback when busy or unanswered), online, registrations (active SIP registrations with user_agent, received address, expires, ...), busy_on_busy, contact_speeddialing, p_asserted_identity, hotdesk_login, hotdesk_type, cost_center, created_at, updated_at}. hotdesk_pin is masked ([REDACTED]); password only appears in get_sip_user and create_sip_user, masked as well. Paged: plain array.

- **GET** `get_sip_user` — One SIP user by ID (same fields as list_sip_users; online shows the current registration state). The SIP password and hotdesk PIN are masked.
- **POST** `create_sip_user` — Create a SIP user (phone extension). Returns the SipUser; the generated SIP password is masked here, read it in the web portal. Not retried automatically.

- **PUT** `update_sip_user` — Update a SIP user; send the fields to change (the type cannot be changed). Returns the SipUser with masked secrets.

- **DELETE** `delete_sip_user` — Delete a SIP user; phones registered with it stop working. Irreversible. Returns no body (204).
- **GET** `list_sip_user_short_codes` — Short codes (star codes dialed on the phone) of a SIP user: {id, code, action, number, group_id, description, created_at, updated_at}.
- **POST** `create_sip_user_short_code` — Create a short code for a SIP user. action: set_out_anonymous, set_forward, clear_forward, login_group (needs group_id), mailbox, profile, set_out_number (needs number), addto_routing. code must be one of Placetel's predefined codes: a free code such as *987 is rejected with 400 "Validation failed: Code is not included in the list". The API reference does not list the allowed codes; the short code dialog of the web portal shows them. Returns the ShortCode. Not retried automatically.

- **DELETE** `delete_sip_user_short_code` — Delete a short code of a SIP user. Returns no body (204).
- **GET** `list_groups` — Groups of SIP users: {id, name, description, type (ring_all | hunt | monitoring), members (SipUser objects, secrets masked), created_at, updated_at}. Paged: plain array.

- **GET** `get_group` — One group by ID with its members.
- **POST** `create_group` — Create a group of SIP users. Use it as a routing target (group behavior). Returns the Group. Not retried automatically.
- **PUT** `update_group` — Update a group (the type cannot be changed). member_ids replaces the whole member list; omit it to keep the members (both verified). Returns the Group.
- **DELETE** `delete_group` — Delete a group. Check routings that ring it (group behavior) first. Irreversible. Returns no body (204).
- **GET** `list_prompts` — Announcements used by IVRs, queues, mailboxes and forwards: {id, name, description, text, file (signed URL of the audio, valid for about 5 minutes; fetch a fresh one with get_prompt), created_at, updated_at}. filter[name] is an exact match. Paged: plain array.
- **GET** `get_prompt` — One prompt by ID. file is a freshly signed audio URL, valid for about 5 minutes: download right away.
- **POST** `create_prompt` — Create an announcement, either synthesized from text with a voice or from an uploaded audio file (base64 data URI; in ToolMesh tm-blob://<id>#dataurl). voice is required by the API in both cases but not returned. Synthesis runs asynchronously: the file URL in this response can answer 404 for a few seconds; call get_prompt shortly after for the final audio (synthesized text came back as WAV, 8 kHz mono, telephone quality). Returns the Prompt. Not retried automatically.

- **PUT** `update_prompt` — Update a prompt (new text, voice or audio file). name and voice are required by the API. A new text is synthesized again, asynchronously, and gets a new file URL (see create_prompt). Returns the Prompt.
- **DELETE** `delete_prompt` — Delete a prompt. Check IVRs, queues, forwards and mailboxes that play it first. Irreversible. Returns no body (204).
- **GET** `list_call_center_agents` — Call center agents: {id, name, description, extension_type (SIP | PSTN), extension_sip, extension_pstn, agent_type (Agent | Supervisor), status (offline | online | dail_out | working | pause), priority, last_call_at, created_at, updated_at}. Needs the call center product; without it the API answers 404. Paged: plain array.

- **POST** `create_call_center_agent` — Create a call center agent that is reached either on a SIP extension or on an external (PSTN) number, chosen by extension_type. The API requires both extension fields. Returns the CallCenterAgent. Not retried automatically.

- **PUT** `update_call_center_agent` — Update an agent, e.g. set status to online, pause or offline. The API requires extension_sip and extension_pstn on every update: send the current values from list_call_center_agents. Returns the CallCenterAgent.

- **GET** `list_call_center_queues` — Call center queues: {id, name, description, num_loops, priority, ringing_time, max_iterations, mail_notification, play_prompt and prompt (greeting), play_prompt_waiting and prompt_waiting, play_prompt_end and prompt_end, play_mailbox and prompt_mailbox, created_at, updated_at}. Paged: plain array.

- **POST** `create_call_center_queue` — Create a call center queue; route a number to it with update_routing (queue behavior). Returns the CallCenterQueue. Not retried automatically.
- **PUT** `update_call_center_queue` — Update a call center queue; send the fields to change. Returns the CallCenterQueue.
- **GET** `list_call_center_calls` — Queue calls of ONE day: {id, call_type (dail_in | dail_out), call_status (unassigned | assigned | ended | not_answered | cancelled | dail_out), answer_status, started_at, left_queue_at, ended_at, last_updated_at, iteration, from, to, queue_name, agent_name}. unassigned calls are waiting and can be picked with pick_call_center_call. Needs the call center product (404 otherwise). Paged: plain array.

- **POST** `pick_call_center_call` — Hand a waiting queue call to a given agent. Returns the CallCenterCall. Not retried automatically.
- **POST** `dial_cti_number` — Start a new call from a provisioned desk phone. Not retried automatically. Returns no body (201).
- **POST** `answer_cti_call` — Answer a ringing call on a provisioned desk phone. Returns no body (201).
- **POST** `decline_cti_call` — Decline a ringing call on a provisioned desk phone. Returns no body (201).
- **POST** `hangup_cti_call` — End a call on a provisioned desk phone. Returns no body (201).
- **POST** `hold_cti_call` — Put a call on hold on a provisioned desk phone. Returns no body (201).
- **POST** `resume_cti_call` — Resume a held call on a provisioned desk phone. Returns no body (201).
- **POST** `transfer_cti_call` — Blind transfer: hand a call on a provisioned desk phone to another number without consultation. Returns no body (201).
- **POST** `start_cti_transfer` — Attended transfer, step 1: start the transfer of a call on a provisioned desk phone; finish with complete_cti_transfer. The API reference does not say how the target is chosen, so for a known target prefer transfer_cti_call. Returns no body (201).
- **POST** `complete_cti_transfer` — Attended transfer, last step: connect the parties of a transfer started with start_cti_transfer. Returns no body (201).
- **POST** `start_cti_conference` — Start a conference from a call on a provisioned desk phone. Finish with complete_cti_conference. Returns no body (201).
- **POST** `complete_cti_conference` — Join the parties of a conference started with start_cti_conference. Returns no body (201).
- **POST** `dial_cti_digit` — Send a single digit on a call of a provisioned desk phone. For tone sequences on the active call use send_cti_dtmf_digits. Returns no body (201).
- **POST** `send_cti_dtmf_digits` — Send DTMF tones on the currently active call of a provisioned desk phone, e.g. to navigate a remote voice menu. Returns no body (201).
- **GET** `get_cti_config` — Read a configuration parameter of a provisioned desk phone. Parameter names depend on the phone model.
- **PUT** `set_cti_config` — Set configuration parameters on a provisioned desk phone. Wrong values can make the phone unusable.
- **GET** `list_users` — Users (web portal logins) of the account: {id, login, email, first_name, last_name, type (main_account | subuser), did and callerid of the primary SIP user, primary_sip_user_id, locale, admin_user, rights_numbers, permissions {enabled, blocks}, obfuscate_billing_records, obfuscate_others, two_factor_authentication_enabled, numbers, created_at, updated_at}. Paged: plain array.

- **GET** `get_user` — One user by ID (same fields as list_users).
- **POST** `create_user` — Create a subuser, optionally with an extension and a phone. A subuser without email cannot log in to the web portal. Returns the User. Not retried automatically.

- **PUT** `update_user` — Update a subuser: name, e-mail, extension, caller ID, admin rights, visible numbers, privacy and portal permissions. permissions.blocks lists portal areas the user may NOT open: billing_record/index, invoice/index, addresses/edit, order, simple/numbers, /fax, /sip_users, simple/index, routing_plans/index, details/robjectlist, simple/groups, groups/edit, provisioning/index, prompts/index, contacts, /cc, :cc_reporting. Returns the User.

- **DELETE** `delete_user` — Delete a subuser. Irreversible. Returns no body (204).
- **POST** `reset_user_password` — Start a password reset for a user (answers 202 without body; 400 when not possible). Not retried automatically.
- **DELETE** `reset_user_two_factor_authentication` — Remove a user's two-factor authentication so it must be set up again. Lowers account security until then. Answers 202 without body; 400 when not possible.
- **GET** `list_sites` — Sites (locations) of the account: {id, name, street, street_no, zip, city, country, prefix (area code)}. Numbers refer to them via site_id. Paged: plain array.
- **GET** `get_site` — One site by ID.
- **GET** `list_devices` — Catalog of phone models Placetel can provision: {id, name, display_name, manufacturer, lines, blf_keys, expansion_keys, max_expansion_modules, dect_lines, multicell, encryptable}. Use id as phone_model in create_provisioning. Paged: plain array.
- **GET** `list_provisionings` — Phones provisioned through Placetel: {id, name, mac, webuser, device (model), lines [{sipuid, position}], keys [{type, label, value, position}], codec, call_waiting, locale, encryption, custom_configurations}. The mac is the address for the CTI tools. Paged: plain array.

- **GET** `get_provisioning` — One provisioned phone by ID.
- **POST** `create_provisioning` — Register a phone for auto-provisioning. lines lists sipuids in line order; keys sets function keys [{type: blf | line | none | dtmf | speeddial | manual | redirect | keyevent | url, value, label}]. Returns the Provisioning. Not retried automatically.

- **PUT** `update_provisioning` — Update a provisioned phone (name, owner, lines, keys, codec, ...). The phone fetches changes on its next configuration update or after reconfigure_provisioning. Returns the Provisioning.
- **DELETE** `delete_provisioning` — Remove a phone from provisioning. Irreversible. Returns no body (204).
- **POST** `reconfigure_provisioning` — Tell the phone to fetch its configuration now (SIP command to the user on line 1). Returns the Provisioning.
- **GET** `get_provisioning_custom_configurations` — Custom configuration keys of a provisioned phone: {id, key, value, attributes}.
- **PUT** `set_provisioning_custom_configuration` — Create or update a raw configuration key of a provisioned phone (model-specific; wrong values can break the phone). Returns the Provisioning.
- **DELETE** `delete_provisioning_custom_configuration` — Delete a custom configuration key of a provisioned phone. Returns no body (204).
- **GET** `list_sim_cards` — Mobile SIM cards: {id, card_type, iccid (after activation), contract, number, status, sip_user (secrets masked), created_at, updated_at}. Paged: plain array.
- **GET** `get_sim_card` — One SIM card by ID.
- **GET** `list_subscriptions` — Registered webhook subscriptions: {id (e.g. sub-...), url, incoming, outgoing, hungup, accepted, phone, numbers}.
- **PUT** `create_subscription` — Register a URL that receives call events: incoming and outgoing calls, accepted calls, hang-ups and CTI phone events, optionally only for some numbers. Per Placetel's Notify API documentation events arrive as form-encoded POSTs (event, call_id, from, to, direction). Call data leaves Placetel, so only register endpoints you control. Returns the Subscription. Not retried automatically.

- **DELETE** `delete_subscription` — Remove a webhook subscription. Returns no body (204).
- **GET** `get_teams_integration` — The account's Microsoft Teams integration: {tenant_id, sbc_voice_routes, sync_status, available_ms_teams_seats, created_at}. Answers 403 until the Teams integration is enabled for API access.
- **GET** `list_teams_users` — Microsoft Teams users imported to Placetel: {sip_user_id, ms_uuid, callerid, name, email, phone_system_enabled, resource_account (true = call queue account), account_enabled, sync_status, error_message}. Paged: plain array.
- **POST** `import_teams_user` — Link a Microsoft Teams user to a Placetel SIP user (uses one booked Teams seat). The user needs a Microsoft 365 Phone System license. Returns the MsUser. Not retried automatically.
- **PATCH** `sync_teams_user` — Push the calling configuration of an imported user to Microsoft again. Returns the MsUser.
- **DELETE** `disconnect_teams_user` — Disconnect an imported Teams user and sync that to Microsoft; the user loses Placetel calling in Teams. Returns no body (204).
- **GET** `list_webex_users` — Users of the account for Webex: {id, login, first_name, last_name, webex_person_id, webex_subscriber_id, webex_subscriber_status, package, created_at, updated_at}. Without Webex the API answers 403 'Not available for your product'. Paged: plain array.
- **POST** `create_webex_user` — Create a user, optionally with a Webex license (package); licenses may be billed. Returns the WebexUser. Not retried automatically.
- **DELETE** `delete_webex_user` — Delete a user and its Webex person. Irreversible. Returns no body (204).
- **GET** `get_webex_user_license` — The Webex license of a user: {package, change_package_to, change_package_at (scheduled change), canceled_at}.
- **POST** `assign_webex_user_license` — Assign a Webex license to a user (may be billed). location_id, phone_number and extension only apply when the user has no license yet. Returns the License. Not retried automatically.
- **PATCH** `update_webex_user_license` — Change the package of a user's Webex license; the change may be scheduled (see change_package_to and change_package_at in the result). Returns the License.
- **GET** `list_webex_user_numbers` — Numbers configured for a Webex user (Number objects). Paged: plain array.
- **PATCH** `update_webex_user_numbers` — Change the numbers of a Webex user. Returns the resulting numbers {primary, external, extension}.
- **GET** `list_webex_workspaces` — Webex workspaces (rooms and shared devices): {id, display_name, supported_devices, capacity, type, calling}.
- **GET** `get_webex_workspace` — One Webex workspace by ID.
- **POST** `create_webex_workspace` — Create a Webex workspace. Returns the Workspace. Not retried automatically.
- **GET** `get_webex_fax_settings` — Fax settings of a Webex number: {routing_id, number, e164, faxheader, faxwhitelist, email, faxsettings, fax_attachment, webex_room_ids, license_id, license_package}. faxpin is masked.
- **PUT** `set_webex_fax_settings` — Turn a Webex number into a fax number or change its fax settings; provisions a fax license on the fly when none is free (may be billed). Returns the settings with faxpin masked.
- **DELETE** `delete_webex_fax_settings` — Turn a fax number back into a regular number and free its fax license. Returns no body (204).
- **GET** `list_customers` — Customers of a partner account, newest first: {id, customer_ref, login, first_name, last_name, company, country, product, status (test_phase | active | locked), created_at}. Only for partner accounts with a token that has the read:customers scope (403 otherwise). Paged: plain array.
- **GET** `get_customer` — One customer of the partner account by ID (needs the read:customers scope).
- **POST** `create_customer` — Create a customer account under the partner account. product must be one the partner may sell (the partner's default product when omitted); the address country must be one the partner may create customers in. Needs a partner token with customer scopes. Returns the new account. Not retried automatically.


## What composite workflows does the Placetel DADL provide?

- **FN** `summarize_calls` — Summarize the incoming call log of one day: totals per type (accepted, missed, voicemail, blocked), unread count, calls per dialed number, and the list of missed calls and voicemails with caller, matched contact name and time. Pages through list_calls (100 per page, at most max_pages pages); truncated=true means the day had more calls than were read.


## Which DADLs are related to Placetel?

- [Billomat](https://www.dadl.ai/d/billomat/) — Billomat REST API — German cloud invoicing & accounting: invoices, estimates, credit notes, recurring invoices, delivery notes, order confirmations, dunning reminders, clients, contacts, articles, payments, expenses, taxes
- [Shlink](https://www.dadl.ai/d/shlink/) — Shlink self-hosted URL shortener REST API v3 — create, edit and delete short URLs with custom slugs, tags, expiry dates and visit limits, define dynamic redirect rules (device, language, query parameter, IP address, geolocation, date, browser), read and summarize visit tracking per short URL, tag or domain including orphan visits and bot filtering, manage tags and per-domain "not found" redirects, and check instance health.

- [Xen Orchestra](https://www.dadl.ai/d/xen-orchestra/) — Xen Orchestra REST API (XO 6.4+, current through 6.10) -- complete coverage: VMs (incl. PATCH update + snapshot revert + forced migration), VM controllers, hosts (incl. full power/lifecycle actions + maintenance mode + PIF rescan + SR probing of NFS/iSCSI/HBA/ZFS targets), pools (incl. add_host, rolling reboot/update with interrupted-update recovery + finalize), storage (SR create/delete, VDI incl. PATCH update + vhd/raw/qcow2/vmdk export, VBD), networks (VIF incl. PATCH update + PIF/PBD), VM/VDI snapshots, VM templates, hardware (PCI/PGPU/SM), tasks, backups (archives incl. live mount of backup disks, jobs/logs, repositories incl. health + benchmark + space reclaim), schedules, messages, alarms, events (SSE incl. non-XAPI collections and backup archives), RBAC v2 (users/groups/acl-roles/acl-privileges incl. assignment introspection), XO plugins (list, load/unload, autoload, self-test), proxies, servers, dashboards, SDN traffic rules (add/delete/update incl. OpenFlow priority), IPMI sensor inventory (plugin), audit records (plugin), health check
- [NetBox](https://www.dadl.ai/d/netbox/) — NetBox DCIM/IPAM API -- full v4 coverage: sites, racks, devices, modules, interfaces, cables, power, IPAM (prefixes, IPs, VLANs, VRFs, route-targets, VLAN translation), virtualization, circuits (including virtual circuits), tenants, contacts, VPN (IKE/IPSec/L2VPN), wireless, extras (webhooks, event-rules, scripts, config-templates, bookmarks, notifications), users/permissions/tokens, and core data sources & jobs
- [Soniox](https://www.dadl.ai/d/soniox/) — Soniox Speech AI — async speech-to-text for recorded audio (60+ languages, speaker diarization, language identification, speech translation), text-to-speech synthesis with voice cloning, audio file management, model discovery, temporary API keys for untrusted clients, and per-request usage, cost and concurrency reporting.

- [Zulip](https://www.dadl.ai/d/zulip/) — Zulip REST API — messages, channels (streams), topics, users, user groups, subscriptions, reactions, drafts, scheduled messages, saved snippets, presence, real-time events, invitations, attachments, custom emoji, linkifiers, and server settings. Self-hosted or Zulip Cloud.

---

**Canonical URL:** https://www.dadl.ai/d/placetel/
**Raw DADL:** https://github.com/DunkelCloud/dadl-registry/blob/main/placetel.dadl
