Negotiated 2025-11-25. The bar is 2025-06-18 or newer.
Pass
HTTPS
The endpoint URL is https.
Performance
Not measured
Fast (p50)
Median latency 187 ms over 2 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.
Not measured
Consistent (p95)
95th percentile 196 ms over 2 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.
Not measured
Reliable (uptime)
2 of 2 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.
Pass
Stable tool list
No tool was removed and no required parameter was added in the last 30 days.
Access
Pass
Open access
tools/list succeeded with no credential, and the record declares none.
Not measured
Standard auth
Auth is not required, so the OAuth metadata check does not apply.
Not measured
Free tier cited
No publisher quote has been checked.
Tools
Pass
Tools described
Every tool description is at least 20 characters.
Pass
Valid input schemas
Every inputSchema is a JSON Schema object.
Fail
Parameters documented
413 of 554 parameters have a description (75%). The bar is 80%.
Pass
Safety hints
Every tool sets readOnlyHint or destructiveHint.
Publisher
Pass
Verified namespace
Listed in the Official MCP Registry.
Pass
Website matches publisher
The website host matches the reverse-domain namespace.
Pass
Source repo linked
A repository URL is on file.
Not measured
Repo owner matches
This namespace is not an io.github login, so the owner comparison does not apply.
Pass
Recently updated
Updated 2026-11-10T08:01:35.770513Z, within 180 days.
Not measured
Open-source licence
The GitHub licence lookup has not returned an OSI result yet.
Start using EchoCall
Connect to this server
Choose your client, copy the configuration, then enable the server in your client’s MCP settings.
Run this command in your terminal, then restart Claude Code.
Claude Code
claude mcp add --transport http echocall https://hub.echocall.de/mcp
Capabilities
Tools 168
Showing 100 of 168 tools.
add_agent_knowledge
Add a knowledge source to an agent Adds one knowledge source to a voice agent. The body is one of three shapes chosen by `type`: `url` reads one page and reads it again every `syncInterval` (weekly by default), `text` takes up to 200000 characters of `text` to store verbatim, `crawl` reads a whole website from its start page, up to `maxDepth` links deep and `maxPages` pages, and crawls it again every `syncInterval`. A crawl runs in the background with status `pending`; follow it with `GET /agents/{agentId}/knowledge/crawl`. `title` is optional and defaults to the URL, the host name for a crawl, or to "Text Knowledge" for a text entry. Files go through `POST /agents/{agentId}/knowledge/files`. The document is created in the voice engine and then attached to the agent, which from then on draws on it in calls. The entry is stored under the account that owns the agent, also when a reseller key adds it. When the document cannot be created or attached, the request still succeeds and the entry is stored with status `failed`; delete it and add it again.
Discovered add_agent_knowledge_file
Add a file to an agent knowledge base Adds a file as knowledge source to a voice agent, as the dashboard upload does. Send the file as base64 in `base64` with its name in `fileName`. Allowed are PDF, TXT, MD, CSV and JSON files of at most 15 MB; the content must match the extension (a PDF starts with `%PDF-`, text files are UTF-8), otherwise the request is rejected with 400. Over MCP the whole request may be at most 1 MB, so larger files go through the API directly. The document is created in the voice engine and attached to the agent. When that fails, the request still succeeds and the entry is stored with status `failed`; delete it and add it again.
Discovered add_chatbot_knowledge
Add a knowledge source to a chatbot Adds one knowledge source to a chatbot. `type` says how to read `content`: for `url` it is the address to draw from, read again every `syncInterval` (weekly by default), for `text` it is the literal text, for `file` it is the text of the file, named by `fileName` and described by `mimeType`, and for `crawl` it is the start page of a website that is read up to `maxDepth` links deep and `maxPages` pages and crawled again every `syncInterval`. A crawl runs in the background with status `pending`; follow it with `GET /chatbots/{chatbotId}/knowledge/crawl`. `content` is always required and must not be empty. The document is created in the voice engine and then attached to the chatbot, which from then on draws on it in conversations. The entry is stored under the account that owns the chatbot, also when a reseller key adds it. When the document cannot be created or attached, the request still succeeds and the entry is stored with status `failed`; delete it and add it again. Note that the 400 response for an invalid body carries only an error code and a `details` list, with no `message` key, unlike the other endpoints.
Discovered assign_agent_integration
Assign an integration to an agent Gives a voice agent access to one integration, so its tools become callable during a call. The integration must belong to the account that owns the agent, which for a reseller key is the customer account, not the reseller. The `enabledTools` field decides which of the integration actions the assistant may call: null means the recommended default set for that integration type, an empty array means the assistant may call nothing, and a list of tool names means exactly those tools and no others. Tool names are the `name` values from the integration tool catalogue. A list may only name tools the permissions of the integration allow (`permitted` in the catalogue, see GET /integrations/{id}/permissions); a tool outside them is refused with 422 and error code `tool_not_permitted`, while a malformed list or an unknown tool name stays a 400 `validation_error`. Assigning an integration that is already assigned returns 409. After the row is written the new tool set is pushed to the voice engine; if that push fails the assignment is rolled back and the request returns 502, so the response always reflects the live agent.
Discovered assign_chatbot_integration
Assign an integration to a chatbot Gives a chatbot access to one integration, so its tools become callable during a chat. The integration must belong to the account that owns the chatbot, which for a reseller key is the customer account, not the reseller. The `enabledTools` field decides which of the integration actions the assistant may call: null means the recommended default set for that integration type, an empty array means the assistant may call nothing, and a list of tool names means exactly those tools and no others. Tool names are the `name` values from the integration tool catalogue. A list may only name tools the permissions of the integration allow (`permitted` in the catalogue, see GET /integrations/{id}/permissions); a tool outside them is refused with 422 and error code `tool_not_permitted`, while a malformed list or an unknown tool name stays a 400 `validation_error`. Assigning an integration that is already assigned returns 409. After the row is written the new tool set is pushed to the voice engine; if that push fails the assignment is rolled back and the request returns 502, so the response always reflects the live chatbot.
Discovered buy_instant_phone_number
COSTS MONEY: Buy a phone number at once Buys a number from `GET /phone-numbers/instant` and pays the first month plus VAT from your balance, like the instant buy on the billing page. The number joins your account at once; assign it to an agent afterwards.
Discovered cancel_agent_knowledge_crawl
Stop a website crawl of a voice agent Stops a running crawl. Pages read so far stay in the knowledge entry. Only voice agents of your own account.
Discovered cancel_booking
IRREVERSIBLE: Cancel a booking Cancels a booking in the calendar of the integration. The optional `reason` is handed to the calendar provider, which may show it to the attendee.
Discovered cancel_call_campaign
IRREVERSIBLE: Cancel a running or scheduled campaign Stops a submitted campaign: pending calls are abandoned and the campaign moves to `cancelled`. Calls already placed are not undone and remain chargeable, so cancelling limits further spend rather than reversing it. A campaign that was never submitted is refused with 400 and should be deleted instead, and one that is already `completed`, `cancelled` or `failed` is refused with 409. Cancellation is recorded locally even when the upstream stop could not be attempted. This operation uses the `write:agents` scope rather than a scope of its own.
Discovered cancel_chatbot_knowledge_crawl
Stop a website crawl of a chatbot Stops a running crawl. Pages read so far stay in the knowledge entry. Only chatbots of your own account.
Discovered cancel_pending_plan_change
Drop a scheduled plan change A plan change booked for the end of the term does not happen; the current plan runs on.
Discovered cancel_phone_number
IRREVERSIBLE: Cancel a phone number Cancels a number bought through the marketplace, with a 30 day grace period: the number is released at the carrier straight away but stays usable on the account until `cancelationEndDate`, and the record is kept rather than deleted. Only marketplace numbers can be cancelled here; a number that was imported by other means is rejected with 400. Cancelling twice is rejected with 409. This does not refund the setup charge or the month already paid for.
Discovered cancel_subscription
IRREVERSIBLE: Cancel a subscription Cancels at the end of the term: everything keeps working until `endDate`, then the plan ends.
Discovered close_conversation
IRREVERSIBLE: Close a chat conversation Closes a chat conversation and finalises it: the closing time is stamped and the response time and duration figures of the thread are recomputed, which is what the analytics endpoints then report. Chat threads only, a voice call id is rejected with 400. This endpoint takes no request body. Closing an already closed conversation runs the finalisation again rather than failing. The closed conversation is returned in `data`.
Discovered close_ticket
Close a support ticket Closes one of your support tickets for good once the issue is solved. Use it only when nothing is left to do: a closed ticket takes no more replies and cannot be reopened, so a follow up needs a new ticket from `create_ticket`. To add information instead, use `reply_to_ticket`. Every call sends the closing email to your account address again, so call it once. `ticketId` comes from `list_tickets`, which afterwards shows the ticket only with `includeArchived=true`. 404 when the ticket is not yours.
Discovered confirm_booking
Confirm a booking request Confirms a booking that waits for the host (status `pending`). The calendar provider then informs the attendee as it always does. Only calendars with booking requests support this (Cal.com). The others answer 422 `not_supported`.
Discovered create_agent
Create a voice agent Creates a voice agent and provisions it in the voice engine in the same request, so the agent is ready to take calls as soon as the call succeeds. Only `name` and `language` are required; every other field falls back to a platform default, and `language` is normalised to a two-letter code, so a value like "german" is stored as `de`. The response is a short acknowledgement rather than the full agent, so read the agent back if you need the stored configuration. The new agent is created with status `active` and is owned by the account behind the key, or by the reseller for a reseller key.
Discovered create_booking
Book an appointment Books a slot of an event type in a connected calendar, like the booking form on the calendar page. Get event types from `GET /integrations/{id}/event-types`.
Discovered create_call_campaign
Create a batch calling campaign Creates an outbound campaign: a named list of up to 10000 numbers that one voice agent will call. The campaign is created in state `draft` and nothing is dialled until you submit it, so this call places no calls and incurs no call charges. The agent must belong to you, and so must `callerPhoneNumberId` if you set one; either being unknown or owned by someone else gives 404. Per-recipient `metadata` is handed to the agent as conversation context, which is how you personalise each call. This operation is guarded by the `write:agents` scope rather than a scope of its own.
Discovered create_chatbot
Create a chatbot Creates a chatbot and provisions it in the voice engine in the same request, then derives its hosted chat page URL from the new identifier. Only `name` is required; the language defaults to `de` and the widget appearance fields all have platform defaults. The widget microphone stays off until `enableVoice` is true; a spoken conversation then runs on the voice allowance of the account, and `voiceId` chooses the voice from GET /voices or GET /voices/available. Unset text fields are stored with sensible fallbacks, so an omitted `greeting` becomes a generic opening line and an omitted display name repeats `name`. The response carries the new identifier and the public URL, not the full chatbot.
Discovered create_integration
Connect an integration Stores the credentials and settings for one third-party service and returns the new integration's identifier. The integration is created active, but connecting it does not by itself let an agent use it: it still has to be assigned to an agent or chatbot. `config` is a JSON string, not a nested object, so serialise it before sending; the keys it must contain are the ones listed under `configFields` for this type in GET /integrations/types. A `config` that contains the mask `********` anywhere is refused with 400 and error code `masked_without_stored_value`: the mask stands for a stored secret, and a new integration has none, so send the real values. Keys inside `config` that only the server writes (the connection keys and `toolPermissions`) are dropped before the integration is stored. Nothing is contacted at creation time, so a wrong credential is only noticed later: call the test endpoint afterwards to confirm the connection works. A WhatsApp integration whose phone number is already connected in an active integration of another account is refused with 409 and error code `conflict`. A Genesys Cloud integration (type `genesys_cloud`) follows its own rules.
Discovered create_presence_device
Add a counter screen Creates a screen that talks with the given voice agent and returns a pairing code, valid for 24 hours. Type the code on the tablet to pair it. Fails with 403 when your plan pays for no further screen.
Discovered create_ticket
Open a support ticket Creates a support ticket on behalf of the authenticated account and returns its identifier. The ticket starts in state `open`, and `category` and `priority` fall back to `other` and `medium` when they are not given. Put everything a human needs into `description`: error messages, the identifiers involved and the steps that led to the problem, since the first reply is written by a person reading exactly this text. Creating a ticket also emits the `ticket.created` outbound webhook event to any endpoint subscribed to it.
Discovered create_webhook
Register a webhook endpoint Registers an HTTPS endpoint and subscribes it to the named events. The response contains a `secret`, and this is the only time it is ever returned: store it before you do anything else, because no endpoint anywhere in this API will show it to you again, and losing it means deleting the endpoint and registering a new one. The secret keys the HMAC-SHA256 signature sent with every delivery in the `X-EchoCall-Signature` header, which is how you prove a payload really came from us. Every name in `events` must be a name from GET /webhooks/events, or the literal `*` for all of them; an unknown name is rejected with 400 rather than silently never firing. The target URL is resolved and refused with 400 if it points at a private or internal address.
Discovered decline_booking
IRREVERSIBLE: Decline a booking request Declines a booking that waits for the host (status `pending`). The optional `reason` is handed to the calendar provider, which may show it to the attendee. Only calendars with booking requests support this (Cal.com). The others answer 422 `not_supported`.
Discovered delete_agent
IRREVERSIBLE: Delete a voice agent Deletes a voice agent permanently and removes it from the voice engine. This cannot be undone, and any phone number still routed to this agent stops being answered by it. Its integration links and knowledge entries are deleted with it, and so are the indexed knowledge documents that no other agent uses. The removal in the voice engine is attempted first, but a failure there does not stop the local deletion, so the agent always disappears from the account. This endpoint takes no request body.
Discovered delete_agent_knowledge
IRREVERSIBLE: Delete an agent knowledge source Removes one knowledge source from a voice agent: the entry is deleted and the agent no longer draws on the document. The indexed document is deleted from the voice engine as well, unless another entry or another agent still uses it. The entry must belong to this agent, otherwise the request is rejected with 404. A failure in the voice engine is logged and does not stop the local deletion. This endpoint takes no request body.
Discovered delete_api_key
IRREVERSIBLE: Delete an API key Deletes one of your API keys for good: it stops working at once and disappears from `list_api_keys`. Use `revoke_api_key` instead when the key should stay listed as revoked. Only keys made in the developer portal or with `POST /developer/api-keys` are deleted here; the access of a connected AI app ends with `disconnect_ai_app`. `id` comes from `list_api_keys`. 404 when no such key of yours exists.
Discovered delete_call_campaign
IRREVERSIBLE: Delete a batch calling campaign Deletes a campaign and its recipient rows permanently. Only a campaign that was never submitted, or one that has since been cancelled or failed, can be deleted: a submitted campaign in any other state is refused with 409 and has to be cancelled first. Deleting removes the recipient history along with the campaign, so export anything you need from the recipients endpoint before calling this. The response is a bare confirmation message with no `success` field, and the operation uses the `write:agents` scope rather than a scope of its own.
Discovered delete_chatbot
IRREVERSIBLE: Delete a chatbot Deletes a chatbot permanently and removes it from the voice engine. This cannot be undone, and any widget still embedded on a website stops working. Its integration links and knowledge entries are deleted with it, and so are the indexed knowledge documents that no other agent uses. The removal in the voice engine is attempted first, but a failure there does not stop the local deletion, so the chatbot always disappears from the account. This endpoint takes no request body.
Discovered delete_chatbot_knowledge
IRREVERSIBLE: Delete a chatbot knowledge source Removes one knowledge source from a chatbot: the entry is deleted and the chatbot no longer draws on the document. The indexed document is deleted from the voice engine as well, unless another entry or another agent still uses it. The chatbot must be one the key may use and the entry must belong to this chatbot, otherwise the request is rejected with 404, so a repeated call answers 404. A failure in the voice engine is logged and does not stop the local deletion. This endpoint takes no request body.
Discovered delete_integration
IRREVERSIBLE: Delete an integration Removes the integration and the credentials stored with it. When an account of the service was connected through the dashboard for this integration, that connection is removed as well, unless another integration still uses it; this happens on a best-effort basis and never blocks the delete. This cannot be undone, and any agent that was assigned this integration loses the ability to perform its actions from the moment of deletion: its assignments to agents and chatbots are removed and their tool lists rebuilt at once. To stop use of an integration temporarily while keeping its configuration, set `isActive` to false with a PATCH instead. Deleting a Genesys Cloud integration also ends its running calls, a call can take up to a minute to end, and its access data stop working at once.
Discovered delete_live_chat_agent
IRREVERSIBLE: Remove a live chat staff member Deletes one live chat staff member for good: the person can no longer sign in to your live chat and gets no more chats. To only stop new chats for a while, set them offline with `set_live_chat_agent_status` instead. Adding them again is only possible in the dashboard or with `POST /team/live-chat-agents`. `agentId` comes from `list_live_chat_agents`. Only the account owner can call this; 404 when the staff member is not yours.
Discovered delete_presence_device
IRREVERSIBLE: Remove a counter screen Removes the screen. A paired tablet stops working right away.
Discovered delete_sip_trunk
IRREVERSIBLE: Disconnect a SIP trunk Removes a number you connected yourself from EchoCall and from its agent. The number stays with your carrier. Only such numbers of your own account.
Discovered delete_webhook
IRREVERSIBLE: Delete a webhook endpoint Removes an endpoint permanently. Deliveries stop at once and the signing secret is destroyed with the record, so this cannot be undone: registering the same URL again produces a new endpoint with a new secret. If you only want to pause deliveries, set `isActive` to false with a PATCH instead.
Discovered deposit_balance
COSTS MONEY: Top up the balance Charges one of your stored cards right away and adds the amount to your prepaid euro balance; this cannot be undone over the API. `amountEur` is net: the balance carries no VAT, VAT is charged when the balance is used. The balance pays for orders placed with `place_order` and payment method `balance`. To buy a plan or add-on directly use `place_order`; for automatic refills of minutes and conversations use `set_auto_topup`. `paymentMethodId` is an `id` from `list_payment_methods`. Refused with 400 when the card holder has to confirm the payment (top up in the dashboard then), when top ups are not available for your account or when the payment fails. Returns the new balance.
Discovered disconnect_ai_app
IRREVERSIBLE: Disconnect an AI app The app loses access at once and has to be connected again.
Discovered get_agent
Get a voice agent Returns the full public configuration of one voice agent, including the system prompt, the opening line, model settings and the recording and retention settings. Internal voice engine identifiers are never included. A reseller key may read any agent belonging to that reseller; an ordinary key only its own. An identifier that is not a number after the `agent_` prefix is removed is rejected with 400.
Discovered get_agent_analytics
Get agent statistics Returns the lifetime aggregate metrics of one voice agent: call counts, durations, cost, token consumption and quality scores. The figures are read live from the conversation records, so a call is counted as soon as it has ended. Cost is in USD, as the voice engine reports it. An agent that exists but has no recorded activity yet answers 200 with `stats` set to null. An agent that does not belong to the calling account answers 404, the same as one that does not exist; a path segment that is not a number answers 400.
Discovered get_analytics_summary
Get a usage summary Returns usage over a date window, aggregated into one row per usage type, with the quantity consumed and the revenue, cost and margin that go with it. Rows appear only for usage types that were actually recorded in the window, so an idle account gets an empty `metrics` array rather than rows of zeroes. Both bounds are optional: without them the window is the last 30 days ending now. The window that was actually applied is echoed in `period`.
Discovered get_api_log
Get one logged request in full Returns one logged request of your API keys in full: method, path, status, error message, timing, the request headers and the request and response bodies. Keys, tokens and passwords are already removed. Use it to inspect a single call after finding it with `list_api_logs`, which gives the `id`; for totals and error rates use `get_api_log_stats`. Read only. 404 when the entry does not belong to your keys.
Discovered get_api_log_stats
Request figures of your keys Requests, errors and refused requests of the last 24 hours and 7 days, the five most used paths, distinct IP addresses and the average response time.
Discovered get_balance
Get the prepaid balance and remaining allowances Returns the account's wallet balance in EUR alongside the voice minutes and chat conversations still available in the current period. These are live counters: they fall as calls and conversations are consumed and are topped back up by a plan renewal or an add-on purchase. Use this before starting a batch campaign to confirm there is enough left to pay for it.
Discovered get_call_campaign
Read a batch calling campaign Returns one campaign with its current counters: how many numbers it holds and how many calls have succeeded, failed or are still waiting. `batchId` stays null until the campaign is submitted. The counters are the ones stored on the campaign record and are updated as call results arrive, so poll this endpoint to follow a running campaign. It is guarded by the `read:agents` scope rather than a scope of its own.
Discovered get_chatbot
Get a chatbot Returns the full public configuration of one chatbot, including the system prompt, the widget appearance, the widget voice, the embedding restrictions and the retention settings. `allowedDomains` and `supportedLanguages` come back as arrays, or as null when nothing is configured. Internal voice engine identifiers are never included. A reseller key may read any chatbot belonging to that reseller; an ordinary key only its own.
Discovered get_chatbot_analytics
Get chatbot statistics Returns the lifetime aggregate metrics of one chatbot: session counts, durations, cost, token consumption and quality scores. The figures are read live from the conversation records and count a chat session and a spoken widget conversation alike, so the fields are named after calls even though most entries are chat sessions; the two call-length extremes tracked for voice agents are absent. Cost is in USD, as the voice engine reports it. A chatbot with no recorded activity yet answers 200 with `stats` set to null. A chatbot that does not belong to the calling account answers 404, the same as one that does not exist; a path segment that is not a number answers 400.
Discovered get_chatbot_embed_code
Get the embed code of a chatbot The code that puts the chatbot on a website, as the dashboard offers it: `scriptCode` adds a floating chat button before `</body>`, `iframeCode` places the chat inside a container, `publicUrl` is a direct link to the chat. Only chatbots of your own account.
Discovered get_chatbot_settings
Get every chatbot setting Everything the chatbot editor in the dashboard shows, in the shape `PATCH /chatbots/{chatbotId}/settings` takes. Logos come as URLs here and are sent as base64 image data to change them. Only chatbots of your own account.
Discovered get_conversation
Get a conversation Returns one conversation. The `type` query parameter selects which store the id is looked up in and must match the kind of record you are asking for, since voice calls and chat threads number themselves independently. A voice call is returned on its own. A chat conversation is returned together with its full transcript in `messages`, ordered oldest first and not paginated; for a long thread use the messages endpoint instead. An id that is not a number is rejected with 400, and one that is not found under the selected type answers 404.
Discovered get_daily_analytics
Get daily call metrics Returns one row of metrics per calendar day, oldest day first, ready to plot as a time series. The figures are read live from the conversation records, so a conversation is counted as soon as it has ended, and the voice calls, chat sessions and avatar sessions of the account each count as one call. Cost is in USD, as the voice engine reports it. Days with no activity are absent from the result rather than present as zeroes. The window is the last `days` days counted back from now, optionally narrowed to a single agent. The applied `days` value and `agentId` are echoed in the response, which matters because an out-of-range or non-numeric `days` is silently replaced by 30 rather than rejected.
Discovered get_dashboard_overview
Dashboard overview What the start page shows: voice and chat plan with the current period, used and remaining minutes or messages, today's calls and chats, and calls and chats per day for the last `days` days (7, 30 or 90).
Discovered get_integration
Read one integration Returns a single integration including its stored `config`, with every secret value replaced by `********`. A value counts as secret when its field is declared with type `password` for the integration type, when its key contains `secret`, `password`, `passwd`, `token`, `apiKey`, `api_key`, `authorization`, `authValue`, `credential`, `bearer` or `cookie` or ends in `Key` (case-insensitive, at any depth), or when it is a URL that carries its secret inside it, such as the webhook URL of a Discord integration. A secret key covers everything below it. Booleans are never masked, and an empty value stays empty. That masking is one-way: this endpoint tells you which credential fields are populated, never what they contain, and there is no endpoint that reveals them. The masked config can be sent back unchanged with PATCH: a secret sent as `********` keeps its stored value. `config` comes back as a JSON string and has to be parsed. Internal connector and health bookkeeping is not returned, and neither are the connection keys only the server writes into `config`.
Discovered get_integration_permissions
Read the tool permissions of an integration Returns which tools the agents of the account may use through this integration: the stored choice in `preset`, every tool of the integration with `allowed`, and how many tools each preset would allow. The permissions limit agents only; the account owner keeps full access through the dashboard and the calendar endpoints. Only Genesys Cloud and the integration types connected through the dashboard sign-in have tool permissions; every other type answers 404, with the same status used for an integration that does not exist or belongs to someone else. `preset` is `legacy` while nothing was chosen: agents then keep the tools they had before permissions existed. A Genesys Cloud integration never reports `legacy`: without a stored choice it reports `read`, which allows only the tools that read. Handing a conversation over to a person is always allowed and is not listed in `tools`.
Discovered get_integration_setup_guide
Get the setup steps of an integration type Returns the steps the setup wizard in the dashboard shows for one integration type, for example where to create the key in the other app, with the link to start there (`providerSetupUrl`) and the expected setup time. Use it after `list_integration_types`, which gives the `type` and the config fields, and before `create_integration`, to guide a person to their credentials. Read only and the same for every account. `null` when there is no guide for this type.
Discovered get_my_account
Get the current account profile Returns the account that the presented API key belongs to, which is the simplest way to confirm a key is valid and to discover the user id every other endpoint scopes to. `resellerId` is set when this account is a customer of a reseller, and `ownResellerId` is set when the account operates a reseller itself; both are null for a plain direct account. `avatarUrl` is always null: no avatar image is stored for API consumers, and the field exists only so the shape stays stable. `billingAddress` is the address on your invoices as `PUT /users/me/billing-address` saves it, null while none is saved. The profile is returned as a bare object, not wrapped in a `data` envelope.
Discovered get_my_limits
Get plan allowances and remaining credit Returns what the account still has available: its status, its prepaid wallet balance in EUR, the voice minutes and chat conversations left, and the subscribed plan with its monthly allowances. `plan` is null when the account is on no plan, in which case the remaining counters are whatever credit has been granted directly. Poll this before starting a batch of calls or a campaign to avoid running an account to zero mid-run. The answer is a bare object, not wrapped in a `data` envelope.
Discovered get_my_usage
Get consumption for a date window Sums the metered consumption recorded for this account over a date window, broken down into voice minutes and chat sessions. With no query parameters the window runs from midnight on the first day of the current month in server local time up to the moment of the request, which makes the bare call a current-month total. Both bounds are inclusive. The two counters are returned as 0 when nothing was metered in the window rather than being omitted, and the echoed `period` tells you exactly which window was measured. This reports usage only; for what is left to spend, call GET /users/me/limits.
Discovered get_phone_number
Get a phone number Returns one phone number of the account. The response is the PhoneNumber object itself, not wrapped in a `data` envelope. Use it to read the current assignment, the lifecycle status and the regulatory verification state of a number. A number that does not belong to the calling account answers 404 rather than 403.
Discovered get_phone_number_verification
Get the verification requirement Returns what the regulator demands before this number can carry traffic. When the number needs no verification the response is `{ "kycRequired": false, "requirement": null }`. Otherwise `requirement` describes the accepted identity kinds, how many documents of which type are needed, which fields are mandatory and which forms must be signed. Read this first: it tells you exactly what to put in the submission body.
Discovered get_phone_number_verification_status
Get verification status Polls the current state of the regulatory verification for a number. Once a submission exists the state is read live from the registry and the stored value on the number record is updated to match, so this endpoint is what to poll after submitting. Before any submission it answers `not_submitted` for a number that needs verification, and the number's recorded state, normally `not_required`, for one that does not. When the registry rejected the submission, `rejectReasons` says why; it is null in every other case.
Discovered get_presence_allowance
Count screens against the plan limit Tells how many Presence screens you have (`devices`, every screen you created, paired or not) and how many your plans pay for (`deviceLimit`, `null` when there is no limit). Check it before `create_presence_device`, which fails with 403 once `devices` has reached `deviceLimit`. For plans, prices and avatar minutes use `get_presence_billing`. Read only.
Discovered get_presence_analytics
Presence usage figures Conversations, minutes, average length, abandoned and failed conversations and how many used a face, in total, per day and per screen, for the last `days` days (default 14).
Discovered get_presence_billing
Presence plans, minutes and devices Everything the billing page shows about Presence: plans on offer, the running plan, avatar minutes and devices used against the limit.
Discovered get_subscription
Get the active subscription Returns the account's current active subscription together with the plan it pays for. Only subscriptions in state `active` are considered; if several exist the most recently created one is returned. An account with no active subscription is not an empty response but a 404, so treat that status as "on no plan" rather than as an error worth retrying.
Discovered get_ticket
Read a ticket and its thread Returns one ticket with its full public message thread, oldest message first. Internal notes written by staff for staff are filtered out and never appear here, so the thread you see is the correspondence you took part in. Each message carries the sender's display name and role. `System` is used where a message was generated by the platform rather than typed by a person; a person who has no name on record reports `null`, so render your own label for them rather than a placeholder. A ticket belonging to another account answers 404 rather than 403.
Discovered get_voice_minutes_available
Check if chatbot voice can be used A yes or no for the voice button of your chatbots: `available` is true when your account has a voice plan with minutes left or without a minute limit. It only reads and never buys an automatic top up; it returns false when the check fails. Use it before offering voice in a chatbot. For the figures use `list_usage_pools` (minutes per plan, `widgetMinutes` for the voice button) or `get_balance`.
Discovered get_webhook
Read one webhook endpoint Returns a single registered endpoint, wrapped in a `data` object. The signing secret is not included and cannot be recovered here or anywhere else. Note `isActive` together with `failedDeliveries`: an endpoint is disabled automatically once 25 consecutive deliveries have failed, and a single successful delivery resets that counter to zero.
Discovered list_addons
List purchasable add-on packages Returns the add-on packages the account may buy on top of its plan, for example extra voice minutes or extra chat conversations. Only packages that are both active and visible are listed, and, as with plans, a reseller customer sees that reseller's packages while a direct customer sees the platform's own. The order is the catalogue sort order chosen by whoever maintains the packages, not price or name. The response has a `data` array and no pagination block.
Discovered list_agent_integrations
List integrations assigned to an agent Returns every integration currently assigned to this voice agent, together with the tools the agent may call through it. The `enabledTools` field decides which of the integration actions the assistant may call: null means the recommended default set for that integration type, an empty array means the assistant may call nothing, and a list of tool names means exactly those tools and no others. Tool names are the `name` values from the integration tool catalogue. A list may only name tools the permissions of the integration allow (`permitted` in the catalogue, see GET /integrations/{id}/permissions); a tool outside them is refused with 422 and error code `tool_not_permitted`, while a malformed list or an unknown tool name stays a 400 `validation_error`. The response is a plain list with no paging, and it includes the health state of each integration so you can see whether a tool would actually work today. Only integrations of the account that owns the agent are listed, which for a reseller key is the customer account: an assignment that points at an integration of another account is left out.
Discovered list_agent_knowledge
List agent knowledge sources Returns every knowledge source attached to one voice agent, newest first. These are the documents the agent may draw on when answering, added either as a crawled web page or as literal text. The response is a plain list with no paging. Entries belong to the account that owns the agent, so a reseller key that reads a customer agent sees the same entries as the customer.
Discovered list_agent_knowledge_crawls
Website crawls of a voice agent Every website crawl of one voice agent with its progress: pages found, read and failed. A running crawl is checked live, so polling this shows movement. Start a crawl by adding knowledge with `type` `crawl`. Only voice agents of your own account.
Discovered list_agent_knowledge_sync
Auto-sync of a voice agent's website knowledge For every page and website source of one voice agent: whether and how often it is read again, when it was last updated and whether it can be read again right now. Only voice agents of your own account.
Discovered list_agent_languages
List the languages an agent can speak or write Returns the languages you can assign to an agent, each with an English name, the name the language calls itself, and a region code for a flag image, so a language picker needs no table of its own. This is a different list from `GET /languages`, which returns the locales the dashboard interface is translated into. Populating an agent picker from the locale list is a common mistake and leaves a customer with three choices where the platform supports dozens. Set `type` to `chat` for a text agent, which has no speech synthesis and therefore the longer list. For `voice`, language support depends on the speech model, so pass the same `ttsModel` value you will create the agent with and the answer matches what that agent will accept; leaving it unset answers for the default model. The voice list is read from the live model catalogue, and `meta.source` reports `catalog` when it came from there or `defaults` when a built-in list was used instead. Set `type` to `all` to name any language code the platform may have stored, which is what a list of agents needs to print a language instead of a bare code.
Discovered list_agents
List voice agents Returns the voice agents visible to the key, one page at a time, with a real total from a separate count query. An ordinary account key sees only its own agents; a reseller key sees every agent belonging to that reseller and can narrow the result to one customer with `userId`. Each item is the list form of an agent: no prompt, no model settings and no privacy settings, so fetch the individual agent when you need those. Note that the `status` query parameter is read but never applied, so passing it does not filter anything at present.
Discovered list_ai_app_connections
Connected AI apps AI apps connected to your account, with the rights they were given, who approved them (empty when it was you) and when they were last used.
Discovered list_announcements
List announcements Announcements from EchoCall shown in the dashboard, for example planned maintenance, newest first.
Discovered list_api_keys
List API keys Your API keys as the developer page lists them: name, the last four characters, scopes, IP and domain allow lists, use and state. Never the key itself.
Discovered list_api_logs
Request log of your keys Requests made with your API keys, newest first. Filter by status class, method, a search text in the path, a key and a time range.
Discovered list_assignable_agents
Agents a number can be assigned to The voice agents of your account that a phone number can answer with, as the assign menu on the billing page lists them. Pass `id` as `agentId` when you update a number.
Discovered list_available_voices
List selectable library voices Returns the voices from the shared library that an agent can be pointed at, each with descriptive labels and the address of a spoken sample. Without `language` the whole library is returned, which is what a portal serving several countries needs; pass a language code to narrow it to the voices offered for that language, plus the account's own cloned and generated voices, which are returned whatever the filter says. Identifiers here are the library ids used when setting a voice on an agent, which differ in form from the `voice_<number>` ids of GET /voices. The response is not paginated, and access is governed by the `read:agents` scope rather than a voice-specific one. If the platform has no voice engine credential configured the call answers 500 with the code `config_error`.
Discovered list_bookings
List the bookings in your connected calendars Returns the bookings of every active integration that has a calendar (Cal.com, Calendly, Google Calendar, Outlook), sorted by start, or of one integration when you pass `integrationId`. Each booking carries the `id` that the confirm, decline and cancel paths take. Bookings are read live from the calendar provider on every request, so poll at a calm pace (once a minute is plenty) rather than in a tight loop. Each calendar is read across every page its provider hands out, up to a fixed limit, and over a fixed window: Cal.com and Calendly from 3 months back, Google Calendar and Outlook from now, each up to 12 months ahead. `from` and `to` only narrow that window, so a range outside it comes back empty without the calendar being listed in `failed`. A calendar that could not be read in full this time is listed in `failed`. When it could not be read at all, none of its bookings are in `data`. When it was read only in part (a later page failed, or it holds more bookings than the limit), the bookings that were read are in `data` and the rest are missing.
Discovered list_call_campaign_recipients
List a campaign's recipients and call results Returns the numbers in a campaign together with the outcome of each call: status, duration, cost and the identifier of the conversation it produced, where there is one. Rows come back in storage order, which is the order they were supplied in, and the campaign's own state is repeated in `campaignStatus` so a poller does not need a second request. Paging defaults to 50 per page here rather than 20, and `perPage` is clamped to 100. The `pagination` block carries `total`, a count of the recipients stored for this campaign. This operation uses the `read:agents` scope rather than a scope of its own.
Discovered list_call_campaigns
List batch calling campaigns Returns the account's outbound campaigns, newest first. Query parameters are validated strictly: an unrecognised `status`, or a `perPage` above 100, is rejected with 400 rather than quietly clamped, which is different from the paging behaviour elsewhere in this API. The `pagination` block echoes the applied page and page size and carries `total`, a real count of the campaigns matching the same `status` filter as the page. Reading campaigns uses the `read:agents` scope rather than a scope of its own.
Discovered list_chatbot_disclosure_snippets
AI disclosure sentences Ready-made sentences that tell visitors they are talking to an AI, keyed by language code. The dashboard offers them to insert into a chatbot greeting; using one is optional and the text can be changed freely.
Discovered list_chatbot_integrations
List integrations assigned to a chatbot Returns every integration currently assigned to this chatbot, together with the tools it may call through them. The `enabledTools` field decides which of the integration actions the assistant may call: null means the recommended default set for that integration type, an empty array means the assistant may call nothing, and a list of tool names means exactly those tools and no others. Tool names are the `name` values from the integration tool catalogue. A list may only name tools the permissions of the integration allow (`permitted` in the catalogue, see GET /integrations/{id}/permissions); a tool outside them is refused with 422 and error code `tool_not_permitted`, while a malformed list or an unknown tool name stays a 400 `validation_error`. The response is a plain list with no paging, and it includes the health state of each integration so you can see whether a tool would actually work today. Only integrations of the account that owns the chatbot are listed, which for a reseller key is the customer account: an assignment that points at an integration of another account is left out.
Discovered list_chatbot_knowledge
List chatbot knowledge sources Returns every knowledge source attached to one chatbot. Only the first 100 characters of each entry are returned, as `contentSnippet`; the full stored text is never sent by this endpoint. The response is a plain list with no paging. Entries belong to the account that owns the chatbot, so a reseller key that reads a customer chatbot sees the same entries as the customer.
Discovered list_chatbot_knowledge_crawls
Website crawls of a chatbot Every website crawl of one chatbot with its progress: pages found, read and failed. A running crawl is checked live, so polling this shows movement. Start a crawl by adding knowledge with `type` `crawl`. Only chatbots of your own account.
Discovered list_chatbot_knowledge_sync
Auto-sync of a chatbot's website knowledge For every page and website source of one chatbot: whether and how often it is read again, when it was last updated and whether it can be read again right now. Only chatbots of your own account.
Discovered list_chatbots
List chatbots Returns the chatbots visible to the key, newest first. An ordinary account key sees only its own chatbots; a reseller key sees every chatbot belonging to that reseller and can narrow the result to one customer with `userId`. Paging defaults to 100 items per page, which is also the maximum. `pagination.total` is a real count of every chatbot matching the request, produced by a separate count query, so a page count can be worked out from it.
Discovered list_conversation_messages
List conversation messages Returns a page of the transcript of a chat conversation, oldest message first, so paging forward follows the conversation in order. This endpoint serves chat threads only: an id that belongs to a voice call is rejected with 400 rather than a misleading 404, and the transcript of a call is carried on the call record itself. Unlike the conversation list, the pagination object here carries a real `total`, counted over the whole transcript.
Discovered list_conversations
List conversations Returns a page of conversations, newest first. One `type` is listed at a time: `voice` returns call records and `chat` returns widget and WhatsApp threads. Every item carries a `type` field so a client can tell the two shapes apart without remembering which query it sent. The pagination object reports `page`, `perPage`, the `type` that was listed and `total`, a real count of the conversations of that type on the account.
Discovered list_credit_history
List minute and conversation bookings Lists the bookings on your voice minutes, chat conversations and avatar minutes, newest first: grants, purchases, add-ons, usage, refunds and adjustments (`transactionType`), each with the amount and the balance after it. Use it to explain where credits went. For what is left now use `list_usage_pools`; for the euro balance and its movements use `get_balance` and `list_transactions`. Read only.
Discovered list_genesys_data_tables
List the data tables of a Genesys connection Lists the data tables of the Genesys organization behind one of your Genesys connections, with `id` and `name`: the tables an agent can read, as the Genesys setup in the dashboard lists them. Use it to find a data table and its id; for queues use `list_genesys_queues`. Read only; each call asks Genesys live. `id` is a Genesys connection from `list_integrations`, 404 for any other connection. When Genesys cannot be asked, `ok` is false, the list is empty and `reason` says why: no sign in saved, sign in refused, permission missing or Genesys unreachable. `truncated` is true when there were more tables than one answer holds.
Discovered list_genesys_queues
List the queues of a Genesys connection Lists the queues of the Genesys organization behind one of your Genesys connections, with `id` and `name`: the queues a call or chat can be handed to, as the Genesys setup in the dashboard lists them. Use it to find a queue and its id; for data tables use `list_genesys_data_tables`. Read only; each call asks Genesys live. `id` is a Genesys connection from `list_integrations`, 404 for any other connection. When Genesys cannot be asked, `ok` is false, the list is empty and `reason` says why: no sign in saved, sign in refused, permission missing or Genesys unreachable. `truncated` is true when there were more queues than one answer holds.
Discovered list_instant_phone_numbers
Phone numbers ready to buy at once Numbers that are set up already and can be bought at once, as the instant buy on the billing page lists them. `monthlyPrice` is your net price per month; VAT is added at purchase.
Discovered list_integration_event_types
List the event types of a calendar integration Returns the kinds of appointment that can be booked through this integration, read live from the calendar provider: their name, their duration in minutes and their identifier. An empty list means the calendar has no event types; a provider that cannot be reached or refuses is answered with 502 `provider_error`, not with an empty list.
Discovered list_integration_health
Health of every connection For each connected integration: whether its last check worked, when it was checked, the last error and how many errors came in a row.
Discovered list_integration_tools
List the tools an integration offers Returns the actions an agent can be allowed to perform through this integration, plus the recommended default selection in `recommended`. Only a few integration types are catalogue-backed; the rest have a fixed tool set that cannot be picked from and answer 404 here, with the same status used for an integration that does not exist or belongs to someone else. Note each tool's `access` level before enabling it: `write` and `delete` tools let the agent change or remove data in the connected service. `permitted` says whether the permissions of the integration (GET /integrations/{id}/permissions) allow agents to use the tool; a tool that is not permitted cannot be put into `enabledTools` of an agent or chatbot.
Discovered list_integration_types
List the integration types you can connect Returns the catalogue of supported third-party services, each with the configuration fields it needs. Read this before creating an integration: `type` gives you the value to send, and `configFields` tells you exactly which keys belong inside the `config` JSON string and which of them are required. Fields declared with type `password` are masked when the integration is read back, and so is every other key that looks like a secret (see GET /integrations/{id}). The response is a bare JSON array and is the same for every account.