# Account security Source: https://docs.famulor.io/account-security Personal details, appearance, sign-in security, and how to delete your account Open **Settings → Preferences** to manage your own account — the personal details, appearance, and security settings tied to you, separate from any one workspace's settings. ## Personal details Update your profile picture, first and last name, phone number, and job title. The picture accepts PNG or JPEG, at least 256×256px, and is optimized automatically on upload. Your email address changes separately: enter the new address, then confirm it from a link sent to that address before the change takes effect. ## Password Set a new password for your account at any time — you don't need to enter your current one first, since changing it requires an active signed-in session. The new password must be at least 8 characters. ## Appearance and language Choose **Light**, **Dark**, or **System** to control how Famulor looks; System follows your device setting. Your language is a personal choice too: leave it on **Automatic** — which follows the workspace default, then the platform default and your location — or pick a language that applies to you from then on, whatever the workspace uses. The same page also shows **Timezone** and **Date Format**. Those two are workspace-wide rather than personal — owners and admins can change them here or under [Workspace profile](/settings/workspaces#workspace-profile), and everyone else sees them read-only. ## Browser notifications Where your browser supports it, turn on **Browser notifications** to get privacy-safe alerts on this browser or installed web app — new History activity, and incoming or missed [Famulor Loop](/telephony/famulor-loop) calls, depending on what your workspace has available. Each toggle applies only to the device and browser where you enabled it. ## Two-factor authentication Two-factor authentication adds a second step after the password. You can enable either or both methods: * **Authenticator app:** scan the QR code with any TOTP-compatible app and enter its current 6-digit code. * **Email codes:** confirm the first 6-digit code sent to your account email. Future sign-ins send a new code that expires after 10 minutes. Turning a method on or off always requires a successful code confirmation. If both methods are enabled, the sign-in screen lets you switch between them. Email-code messages use the email delivery settings of the brand where you sign in. For security, MFA can only be changed while you are signed in interactively. API keys and MCP connections cannot change the account's sign-in policy. ## Where you are signed in The same Preferences page lists devices with active sessions. The list shows the browser, operating system, last activity time, and IP address when available. Choose **Sign out** on a device you do not recognise. This immediately revokes access for that session. For privacy and security, access and refresh tokens are never shown in the device list. ## Delete your account Deleting your account permanently removes it and **every workspace you own** — not just the one you're currently in. Workspaces you've only joined, without owning, are unaffected. Confirm you understand the consequences, then delete. Removal typically completes within 10 days; contact support under Help within that window if you want to stop it. # Credit balances & transfers Source: https://docs.famulor.io/admin/balances-and-transfers Track prepaid credits and fund customer workspaces Calling is prepaid. Every workspace has a credit balance, and completed calls reduce that balance according to the workspace's pricing. ## How balances change A balance can change when: * included plan credits are added, * the workspace buys a top-up, * calls use credits, or * a white-label reseller transfers credits to or from one of its customer workspaces. Every change appears in the balance history with its date, amount, reason, and any note supplied with a transfer. ## Transfer credits White-label workspace owners and admins can fund their customer workspaces from their own available balance. They can also reclaim unused credits, provided the customer workspace has enough remaining balance. Transfers are immediate and never allow either workspace to fall below zero. ## Buy additional credits Workspace owners can purchase top-up packages from **Billing**. Once payment is confirmed, the new credits appear in the active workspace. ## Where to see usage * **Customers** shows the balance for each customer workspace and provides the transfer action. * **Usage** shows your active workspace's consumption by day and by call. Balances are credits, not cash. Plan pricing and included usage are described in [Plans & limits](/admin/plans-and-limits) and [Minutes & billing](/billing/minutes). # Reseller dashboard Source: https://docs.famulor.io/admin/dashboard Read the KPI tiles, usage charts, plan margins, and current contribution snapshot on your white-label admin landing page **Tenant Admin → Dashboard** is the first page you see in your white-label admin console — a live summary of your resale business across every customer workspace. Pick the last 7, 30, or 90 days, or a custom range. Activity figures and the charts follow that selection; running totals such as total users, active subscriptions, and estimated MRR always show the current state. A short setup checklist appears above the KPIs until you finish initial setup — branding, connecting your domain, completing Stripe onboarding, creating a plan, and configuring SMTP — then it disappears. ## KPI tiles | Tile | What it counts | | ------------------------ | ------------------------------------------------------------------------------------------------------------- | | Total users | Customer workspaces on your domain in total, and how many were created in the selected period | | Active subscriptions | Subscriptions currently active or in trial, and the share of your customers that represents | | New subscriptions | Subscriptions started during the selected period | | Avg revenue / subscriber | Estimated MRR divided by active subscriptions | | Minutes spent | Call minutes used by your customers, with the change from the prior period | | Credits spent | Credits spent on calls, email, knowledge-base imports, and add-on fees, with the change from the prior period | | Estimated MRR | Monthly recurring revenue implied by currently active subscriptions | | Annual run rate | Estimated MRR × 12 | | Assistants | Total assistants across your customers, and how many are new this period | | Voice calls | Voice conversations — phone, WhatsApp voice, and web calls — with the change from the prior period | | WhatsApp messages | WhatsApp messages sent and received | | SMS sent | SMS messages in the period, inbound and outbound, with the change from the prior period | | Web chats | Web-widget text chat conversations, with the change from the prior period | | API chats | Conversations started through the REST API or MCP | | Emails | Emails sent and received, with the change from the prior period | | Campaigns | All campaigns across your customer workspaces, not only those created in the period | **Estimated MRR** is the monthly recurring revenue implied by your customers' currently active subscriptions, trials included — a projection, not a guarantee of what you'll actually collect, since it doesn't account for failed payments, cancellations, or proration. **Annual run rate** is that figure × 12. WhatsApp messages and API chats currently show as **Not available yet**. ## Calls and minutes A daily chart plots calls — web widget conversations included — against total call minutes across every customer workspace, for the selected period. Use it to spot a usage trend early. ## Subscriptions by plan and engagement A donut chart breaks active subscriptions down by plan. Beside it, engagement rings show what share of your customers hold an active plan and what share actually used the service in the period, plus an overall figure that averages the two. ## Leaderboards and recent activity Five tables sit below the charts: customers running low on credits, top-spending customers, usage per customer, the most recently created assistants, and your newest customers. Use them to spot who needs a [top-up reminder](/admin/balances-and-transfers) or a follow-up. ## Subscription margin per plan For each of your plans, this table compares the monthly price against what the plan's included minutes cost you at your platform minute rate, and shows the resulting margin. A plan that costs you more than it brings in is flagged. The same cost and margin figures appear on each plan's own card on the [Plans & limits](/admin/plans-and-limits) page. ## Current subscription contribution This table is a current snapshot. It estimates current plan MRR from active subscriptions and trials, then subtracts platform call costs accrued month to date. It is **not collected historical revenue**. Trials are included; taxes, refunds, payment fees, non-call costs, and recurring add-ons are excluded. See also [White-label workspaces](/admin/tenants-and-whitelabel) for customer and domain management, and [Plans & limits](/admin/plans-and-limits) for the plans these figures are measured against. # Plans & limits Source: https://docs.famulor.io/admin/plans-and-limits Create clear white-label customer plans with pricing, included usage, limits, and add-ons White-label resellers can create plans for their own customer workspaces. Each plan combines pricing, included minutes, usage rules, workspace limits, and product capabilities. ## Plan contents ### Pricing Choose a monthly or yearly price, the included minutes, and the price for additional usage. The plan card previews what the customer sees before checkout. ### Workspace limits Common limits include: | Limit | What it controls | | ------------------------------------------ | --------------------------------------------------- | | Assistants | Number of assistants in the workspace | | Campaigns | Number of saved campaigns | | Phone numbers | Connected purchased and BYO numbers | | Team members | People who can join the workspace | | [Data retention](/settings/data-retention) | Default retention period available to the workspace | Use **Unlimited** only where the plan editor offers it. A value of zero means the capability is not included. Add-on-backed capacity cannot be included free in a reseller plan, free-account default, or customer override. This includes extra Concurrent Lines, cloned-voice slots, knowledge bases, tools, CRM sync capacity and contacts, automation runs, and extra workspaces. Every workspace still has its one-line baseline; all additional add-on capacity must be purchased. ### Included capabilities Plans can include capabilities such as Flow Builder, the web widget, AI Avatar, Connect AI / MCP, additional languages, calendar integrations, custom dashboards, live monitoring, simulations, data retention, website imports, and automatic knowledge sync. Customers see the included capabilities and limits on the plan card. Actions outside the plan remain unavailable throughout the product and API. ## Add-ons Optional add-ons are selected from the plan card and billed with the same interval when supported. Platform add-ons are not offered to your customers until you explicitly enable **Offer to my users**. Add-on-backed features such as Fallbacks & Guardrails, Clone your own voice, and Revenue Autopilot, together with their related capacity, are sold here rather than included through **Plans** or **Default plan limits**. **API Access** follows the same add-on-only rule: it cannot be bundled into a reseller plan, free-account defaults, or a customer override. Offer it explicitly as a recurring add-on. **Connect AI / MCP** remains a separate capability that may still be included in a plan. When you enable an add-on for resale, set the customer-facing price shown at checkout. Recurring add-on prices are configured separately from [usage pricing](#usage-pricing). Some usage-based capabilities, such as website imports and automatic sync, are charged in credits according to your usage pricing rather than as recurring add-ons. ## Usage pricing Beyond the recurring plan price, usage-based actions — call minutes, email, web chat, messaging channels, knowledge-base crawl and sync, re-transcription, SMS, simulator messages, history re-evaluation, and automation runs — are billed in credits at rates you set on the **Usage pricing** page. Set the customer-facing rates for credit-metered actions on the **Usage pricing** page. These rates are separate from subscription and recurring add-on prices. Your customers see the resulting rates on their own Usage page. ## Registration and prepaid accounts Under **Default plan limits**, self-service registration controls whether new customers can create an account on your verified white-label domain. Prepaid access is a separate switch: it controls whether a customer without a paid plan can use prepaid credits. When prepaid access is off, registration can remain open, but the customer must select a paid plan before using the platform. Configure the prepaid limits and pay-as-you-go minute price on the same page. ## Publishing and changing plans Review the customer-facing name, description, limits, prices, and checkout before publishing a plan. Paid plan changes take effect through the billing flow. Included minutes are credited according to the customer's billing cycle. The plan editor prevents incomplete or invalid pricing combinations. Existing customers keep access according to their active subscription and any changes shown in the billing flow. See [How minutes are billed](/billing/minutes) and [Billing setup](/admin/stripe) for the customer billing experience. # Payments with Stripe Source: https://docs.famulor.io/admin/stripe Manage workspace billing and charge white-label customers Famulor uses Stripe for secure subscription payments, credit top-ups, and phone-number charges. Workspace owners manage payment methods, invoices, and cancellations through the Stripe customer portal opened from **Billing**. ## Billing your white-label customers White-label resellers can connect their own Stripe account and sell plans under their own brand. Open **Billing platform** in the white-label admin area and complete Stripe's guided onboarding. The page shows when the account is ready to accept payments and receive payouts. Define the prices, included credits, limits, and optional add-ons you want to offer. See [Plans & limits](/admin/plans-and-limits). Customers choose a plan through checkout on your branded domain. Payments are collected through your connected account and your applicable platform fees are shown in the billing area. Use Stripe for payout and payment details. Use [Famulor's billing overview](/admin/dashboard) to compare plan revenue with your service costs. ## What customers can manage Customers can open their billing portal to: * update payment methods, * download invoices, * change or cancel a subscription, and * buy additional credits when available. Availability and payout timing depend on the status and country of your connected Stripe account. # White-label workspaces Source: https://docs.famulor.io/admin/tenants-and-whitelabel Brand your reseller workspace, manage customer workspaces, and support your users White-label access lets an existing workspace operate as a branded reseller environment. Customers use your domain and branding while their assistants, calls, campaigns, plan, credits, and team remain isolated in separate customer workspaces. White-label access comes either with a plan tier that includes it or as a standalone add-on bought from **Settings → Plan**. Unlike Fallbacks & Guardrails, Clone your own voice, and Revenue Autopilot, it can never be resold onward to your own customers. ## What you can customise * **Domain** — app, login, public API (`/api/v1`), and [MCP](/mcp/overview) use your verified domain. * **Branding** — app name, logos, favicon, colours, and authentication screens. * **Support details** — the contact information shown to your customers. * **[Plans and pricing](/admin/plans-and-limits)** — customer-facing plans, included minutes, limits, and add-ons. * **[Billing](/admin/stripe)** — customer checkout, subscriptions, top-ups, and invoices through your connected billing account. * **Currency** — the display currency your customers see; stored prices remain in EUR and convert at a platform-managed rate. * **Custom SMTP server** — send transactional email to your customers through your own mail provider instead of the platform default. * **Mail template** — the welcome email sent right after a customer creates an account; leave fields blank to use the default text. * **Email notifications** — which transactional emails go out to your customers. * **Signup webhook** — an HTTP callback fired when someone signs up on your domain. * **Bot protection** — an optional Cloudflare Turnstile challenge on your signup form, available once your custom domain is verified. * **Retention limits** — the min/max range your customers can choose for their own data retention, separate from the default retention period you set on each plan. White-label administration appears only when your workspace has White-label access. ## Customer workspaces When a person registers on your white-label domain, Famulor creates a separate customer workspace owned by that person. The customer does not become a member of your reseller workspace. This separation keeps customer resources, billing, credits, and team access independent. Manage customers from the **Tenant Admin** area or use the [White Label API](/admin/whitelabel-api) for your own onboarding and support workflows. Open a single customer under **Users** to reach two override tools, both scoped to that one customer only: * **Custom User Appearance** hides specific navigation pages or product features from that customer, independent of your global white-label branding and navigation. * **Custom User Limits** overrides individual plan-limit values — such as the number of assistants, campaigns, or team members — for that one workspace. An override here takes priority over whatever the customer's subscribed plan specifies. ## Cross-customer history and live monitoring Your admin console has its own **History** and **Live monitoring** views that aggregate every customer workspace into one place, so support and quality checks do not mean opening each workspace in turn. They are separate from the single-workspace [History](/monitoring/history) and [Live monitoring](/monitoring/live-monitoring) your customers use inside the product. Admin History lists calls, email, and messaging conversations from every customer workspace in one grid, with a **Workspace** column identifying which customer each conversation belongs to, and opens the same detail views as the customer-facing History. Admin Live monitoring shows the active calls across all your customer workspaces. On any of them you can listen in, whisper to the assistant, take over the conversation, or hang up — the same controls as a single workspace's own Live monitoring — alongside response-latency percentiles from the last 24 hours. This view is gated by your own reseller plan's **Live monitoring** capability, not by any individual customer's plan. ## Connect a custom domain Open **Tenant Admin → Settings** and add the full hostname you want to use. 1. Publish the ownership TXT record shown in the setup. 2. Publish the recommended A or CNAME record for routing. 3. Wait for DNS propagation, then choose **Check DNS**. The domain becomes active only after ownership, routing, and certificate checks succeed. Removing the domain disables sign-in and branding on that hostname. The same workflow is available through `GET`, `POST`, and `DELETE /api/v1/custom-domain`, `POST /api/v1/custom-domain/verify`, and the matching MCP tools. ## Registration and prepaid accounts Under **Tenant Admin → Default plan limits**, **Allow self-service registration** controls only whether new customers can create an account from your verified custom-domain login page. Existing customers can still sign in when it is off, and customers created by an authorised reseller operator through the dashboard, REST API, or MCP remain available. **Allow prepaid accounts** is independent. It controls whether customers without a paid plan can use prepaid credits. When it is off, registration may still be open, but new customers must choose a paid plan before using the platform. Prepaid limits and the pay-as-you-go minute price apply until a customer selects a paid plan. You can also set **Welcome credits for new customers** on the same page. The recommended starting value is 800 credits. Each new prepaid customer receives the configured amount once as non-expiring wallet credits funded from your reseller wallet. Enter 0 to turn automatic grants off; disabling prepaid accounts pauses grants without removing your saved amount. If your wallet cannot cover the full amount, the customer signup still succeeds with 0 welcome credits. The missed grant is not applied later automatically. The customer list and detail view show an action to transfer the originally requested amount manually after you fund your wallet. Changes affect only customers created after you save; existing customers never receive a retroactive grant. Use `GET` or `PATCH /api/v1/platform/welcome-credits` for the same setting, or the MCP tools `get_platform_welcome_credit_settings` and `update_platform_welcome_credit_settings` in the `platform` toolset. Customer registration and detail responses include the public welcome-credit status and the requested and granted amounts. Registration, prepaid access, the prepaid minute price, and prepaid defaults are also available through `GET` or `PATCH /api/v1/platform/default-limits`, or the MCP tools `get_platform_default_limits` and `update_platform_default_limits`. ## User view Authorised reseller admins can open **User view** for one of their own customers to reproduce that customer's dashboard experience. A persistent banner identifies the customer and provides a clear return to the admin area. Each session is recorded in the audit history. Use User view only for legitimate support and administration, and follow your organisation's access policy. ## Prompt templates Create workspace prompt and flow templates in the Tenant Admin area. They are available to your reseller team and customer workspaces according to the visibility you choose. End users can select a template while creating an assistant or from the system-prompt card, preview it, and apply a copy. Later template changes do not overwrite an existing assistant. The customer-visible catalog is also available through `GET /api/v1/prompt-templates` and the MCP `list_prompt_templates` tool. ## Voice catalog Choose which voices from the platform catalog your customers can pick from in the assistant voice picker. Turn individual voices on or off in an allow-list, and add further voices to the catalog when a customer needs one that isn't listed yet. A voice switched off further upstream carries an **Upstream** marker and cannot be turned back on from here. A voice whose text-to-speech source has been retired platform-wide is flagged separately on its row, so you can replace it on the affected assistants or delete it from the catalog. ## Moving customer resources Reseller admins can move supported resources between their own customer accounts, for example when handing an agency-built setup to the final customer. Review assistant assignments, numbers, tools, knowledge, and billing before completing a handover. Every migration is recorded as a run with a reviewable history — who moved what, from where, to where — and a completed run can be rolled back from the same list. # White Label API Source: https://docs.famulor.io/admin/whitelabel-api Manage your reseller platform's customers programmatically — list, register, mint tokens, log in, log out, and transfer credits If you run a [white-label reseller workspace](/admin/tenants-and-whitelabel), the White Label API lets you manage your own end-customers programmatically instead of through the dashboard — build your own admin console, automate onboarding, run custom auth flows on your own domain, or wire credit top-ups into your billing system. Every endpoint on this page requires API Access plus an API key created in your white-label workspace with the `platform:read` or `platform:write` scope and an owner or admin role. Results are always limited to your own customer workspaces. A key issued for a customer can use the REST API only while that customer workspace also has API Access; issuing or revoking a key does not grant the capability. ## Get platform users `GET /api/v1/platform/users` lists your customers, newest first. Paginate with `limit` / `offset` (see [pagination](/api-reference/introduction#pagination)) and search by name or email with `q`. ```bash theme={null} curl "https://your-domain.example/api/v1/platform/users?limit=20&q=jane" \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" ``` ## Register a platform user `POST /api/v1/platform/users` creates a new customer account and workspace on your behalf. Two modes: * **`invite` (default)** — no password required. The account is created without credentials; pair it with a login or token call below to actually get the customer (or your own frontend) into it. * **`password`** — you choose an initial password (8+ characters) for the customer up front. ```bash theme={null} curl https://your-domain.example/api/v1/platform/users \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"name": "Jane Doe", "email": "jane@customer.example", "mode": "invite"}' ``` An email that's already registered anywhere on the platform fails with `409` — the message never reveals whether that account is inside or outside your own scope. The registration response includes `welcome_credit` with `status`, `requested_credits`, and `granted_credits`. This lets your onboarding UI show whether the one-time welcome credits were granted or need a later manual transfer. This is an authorised operator action. It remains available when hosted self-service registration is disabled. ## Configure registration and prepaid defaults `GET /api/v1/platform/default-limits` returns the independent self-service-registration and prepaid-access controls, the prepaid extra-minute price in EUR, and the default limits for prepaid customer accounts. `PATCH` updates any subset of those settings. ```bash theme={null} curl https://your-domain.example/api/v1/platform/default-limits \ -X PATCH \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"self_service_registration_enabled":false,"prepaid_accounts_enabled":true,"prepaid_extra_minute_price_eur":0.49}' ``` Self-service registration affects only account creation from the hosted login page on your verified custom domain. Existing customers can still sign in, and operator-created customers remain available. Prepaid access separately determines whether customers without a paid plan can use prepaid credits; when it is off, registered customers must choose a paid plan before using the platform. The equivalent MCP tools are `get_platform_default_limits` and `update_platform_default_limits` in the `platform` toolset. ## Configure welcome credits `GET /api/v1/platform/welcome-credits` returns the configured one-time amount, whether prepaid accounts and automatic grants are active, your current wallet balance, and the estimated number of new customers you can currently fund. `PATCH` updates the amount for future customers; 800 credits is the recommended starting point, and 0 disables automatic grants. ```bash theme={null} curl https://your-domain.example/api/v1/platform/welcome-credits \ -X PATCH \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"welcome_credits": 800}' ``` Saving is allowed even when the amount is above your current wallet balance. If the wallet cannot cover a new customer's full grant, signup still succeeds with 0 welcome credits. It is not caught up automatically; use the balance transfer action when your wallet is funded. Existing customers are never credited retroactively, and later setting changes apply only to future customers. ## Log in a platform user `POST /api/v1/platform/users/login` authenticates a customer with their own email and password and returns an access token on success. Use it to build a login form on your white-label platform instead of sending customers to the hosted login page. Failed sign-ins return the same generic `401` response and do not reveal whether an account exists. ```bash theme={null} curl https://your-domain.example/api/v1/platform/users/login \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"email": "jane@customer.example", "password": "correct horse battery staple"}' ``` This is the one White Label API operation with no MCP equivalent — credentials should never travel through an MCP tool call. ## Create a user token `POST /api/v1/platform/users/{user_id}/token` creates an API key for a customer without needing their password — useful for a dashboard, onboarding flow, or approved automation acting on the customer's behalf. ```bash theme={null} curl https://your-domain.example/api/v1/platform/users/USER_ID/token \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"name": "Onboarding token", "expires_in_days": 90}' ``` The plaintext key is returned exactly once — store it immediately, it cannot be retrieved again. It belongs to the customer, not you: an omitted `scopes` grants full access for that customer, not just the scopes your own operator credential happens to have. ## Log out a platform user `POST /api/v1/platform/users/{user_id}/logout` revokes the customer's active API keys and OAuth tokens in your customer scope. Use it to force a sign-out after an account is compromised or your relationship with that customer ends. Repeating the request is safe. ```bash theme={null} curl https://your-domain.example/api/v1/platform/users/USER_ID/logout \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" ``` ## Transfer balance `POST /api/v1/platform/users/{user_id}/balance` moves credits between your workspace balance and a customer's: * **Positive `credits`** — grants credits from your wallet to the customer (the standard way to provision a customer account). * **Negative `credits`** — reclaims credits back from the customer into your wallet. Either direction requires the source wallet to cover the amount — a wallet balance never goes below zero, and an attempted reclaim that exceeds the customer's balance fails outright instead of partially applying. ```bash theme={null} curl https://your-domain.example/api/v1/platform/users/USER_ID/balance \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"credits": 50, "note": "Onboarding credit"}' ``` ## Manage API keys Every workspace — including customer workspaces created through this API — can manage its own API keys through `/api/v1/api-keys` or **Settings → API Keys** in the dashboard. A user-owned credential can also mint a key directly for another same-brand workspace where that user is currently an owner or admin by calling `/api/v1/workspaces/{workspace_id}/api-keys`. That nested endpoint is a general multi-workspace capability and does not require white-label access. ```bash theme={null} curl https://your-domain.example/api/v1/api-keys \ -X POST \ -H "Authorization: Bearer fam_XXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"name": "CRM integration", "scopes": ["calls:read", "leads:write"]}' ``` A key can never create another key with broader access than itself: `scopes` on a new key must be a subset of the calling credential's scopes. `GET /api/v1/api-keys` lists a workspace's keys without exposing their secrets; `DELETE /api/v1/api-keys/{id}` revokes one. ## MCP Everything above is also available as MCP tools, grouped in the **`platform`** toolset (plus `list_api_keys` / `create_api_key` / `revoke_api_key` in the `settings` toolset). Connect with the toolset selector: ```text theme={null} https://your-domain.example/mcp?toolsets=platform ``` | Tool | Maps to | | ----------------------------------------- | ----------------------------------------------- | | `list_platform_users` | `GET /api/v1/platform/users` | | `get_platform_user` | `GET /api/v1/platform/users/{user_id}` | | `register_platform_user` | `POST /api/v1/platform/users` | | `get_platform_default_limits` | `GET /api/v1/platform/default-limits` | | `update_platform_default_limits` | `PATCH /api/v1/platform/default-limits` | | `get_platform_welcome_credit_settings` | `GET /api/v1/platform/welcome-credits` | | `update_platform_welcome_credit_settings` | `PATCH /api/v1/platform/welcome-credits` | | `create_platform_user_token` | `POST /api/v1/platform/users/{user_id}/token` | | `logout_platform_user` | `POST /api/v1/platform/users/{user_id}/logout` | | `transfer_platform_credits` | `POST /api/v1/platform/users/{user_id}/balance` | There's no `login_platform_user` tool — logging in stays REST-only, for the reason above. The MCP tools accept either a `user_id` or an `email` to identify the target customer; REST always takes `user_id` from the URL path. ## Include services in one customer plan In Plans, select the features and additional capacity to include in the recurring plan price. Customers see these services as **Included in plan**. Optional capacity purchases add to that allowance; an included feature is not charged again as a separate add-on. One-time services remain separate purchases. The plan editor shows the platform fee, its tax, an estimated payment-cost reserve and your remaining contribution per customer. This is an estimate before your own operating costs and taxes. Annual offers use available annual service prices; otherwise the editor explicitly shows twelve monthly cost periods. Included credits remain a monthly allowance for both billing intervals. Payment confirmation activates the purchased inclusions. A scheduled cancellation keeps access until the paid period ends. A failed renewal blocks paid access; a successful payment restores the purchased contract. Purchased credit balances remain separate. After cancellation, prepaid access follows your existing Free-account policy. Duplicate a plan with existing subscriptions before changing its price or inclusions. The new plan starts inactive so you can review it before offering it to customers. ### Manage inclusions through the API Use `GET /api/v1/reseller/plans` with `settings:read` to find your plans and available inclusion codes. Use `PUT /api/v1/reseller/plans/{id}/inclusions` with `settings:write` to replace inclusions on an eligible plan. Both operations require owner or admin authority in your Whitelabel workspace. The matching MCP tools are `list_reseller_plans` and `update_reseller_plan_inclusions`. These operations configure the offer; they do not charge customers or create paid subscriptions. # Custom dashboards Source: https://docs.famulor.io/analytics/custom-dashboards Build your own analytics dashboards from live workspace data A custom dashboard puts the numbers you care about on one screen — call volume, assistant performance, campaign outcomes, booking conversion, and more — instead of moving between separate pages to piece them together. Each dashboard is made of **widgets**, and you control what every one of them shows. Availability depends on your plan's **Custom dashboards** feature. Prefer describing what you want in plain language? Select **Create with Milian** on any dashboard and [natural-language dashboards](/analytics/natural-language-dashboards) turns a written question into a previewable set of widgets you can add in one go — the fastest way to get a first dashboard going. This page covers building and editing widgets by hand. ## Creating a dashboard Custom dashboards don't have their own index page — each one is its own icon in the sidebar. Select the **+** (New dashboard) at the bottom of that section, give the dashboard a name, and you land straight in it. A new dashboard starts with the built-in overview: dashboard filters, headline numbers (conversations, completion rate, average duration, success rate, conversation spend), call activity, outcome mix, assistant performance, post-call intelligence, campaign funnel, a customer reach map, recent calls, and a row of module cards linking to the areas your plan includes. Every part of it is optional — see **Editing the layout** below for removing sections or clearing the overview entirely. ## Adding a widget Select **Add insight** to open the widget editor. You can: * **Start from a recommended insight** — ready-made widgets covering common questions (below), pre-filled with a sensible source, visualization, and grouping. Templates that need a plan feature you don't have show as **Locked**. * **Build from scratch** — name the widget, then pick a data source, a visualization, and how to aggregate it. See [Dashboard widgets](/analytics/dashboard-widgets) for the full reference of what's available at each step. | Template | Shows | Needs | | --------------------- | --------------------------------------------------------------------- | ------------------ | | Conversation activity | Call volume over time, compared to the previous period | — | | Assistant performance | Conversation volume by assistant | — | | Outcome mix | Successful, unsuccessful, and unknown call outcomes | Post-call analysis | | Campaign funnel | Campaign progress from assigned leads through calls made to completed | Campaigns | | Live conversations | Calls currently in progress | Live monitoring | | Simulation quality | Passing tests and recurring evaluation failures | Simulations | | Booking conversion | How conversations turn into confirmed bookings | Booking | | Knowledge health | Stale, failed, and healthy knowledge sources | Knowledge | Your own widgets sit under **Custom insights**, below the overview. A new one lands at the end of that group; move it into place from Customize mode (below). ## Editing the layout Select **Customize** to enter edit mode. The dashboard name becomes editable, and each widget gets its own controls: * **Edit** reopens the widget editor to change its source, visualization, filters, or name. * **Width** sets how much of the row the widget fills — a quarter, a third, a half, two thirds, or full width. * **Move left / right** reorders it among your other widgets. * **Remove** takes it off the dashboard, after a confirmation. Rebuilding it later means adding the insight again, so note its settings first if it was fiddly. The built-in overview sections have their own **Remove** control while customizing. **Restore removed** brings them back, **Start blank** clears the whole overview so only your own widgets remain, and **Restore overview** puts it back. Select **Done** to leave edit mode. Layout changes save automatically as you make them. Deleting a dashboard (the trash icon, in Customize mode) is permanent. The dashboard, its layout, and the insights you arranged on it are gone, and there's no undo. ## Filtering a dashboard The filter bar at the top of a dashboard scopes everything below it: a date range (last 7, 14, 30, or 90 days, or a custom range) plus direction, status, outcome, sentiment, assistants, and campaigns. These apply on top of each widget's own configuration, so you can reuse the same widgets across a "last 7 days" view and a "last 90 days" view without rebuilding them. ## API and MCP Dashboards and their widgets are fully manageable through the public API: `GET/POST /api/v1/dashboards`, `GET/PATCH/DELETE /api/v1/dashboards/{id}`, `GET/POST /api/v1/dashboards/{id}/widgets`, and `PATCH/DELETE /api/v1/dashboards/{id}/widgets/{widgetId}` (scope `dashboards:write`). The API also exposes `GET /api/v1/dashboards/{id}/analytics` for the computed data behind a dashboard. MCP: `list_dashboards`, `get_dashboard`, `create_dashboard`, `update_dashboard`, `delete_dashboard`, `get_dashboard_analytics`, `list_dashboard_widgets`, `create_dashboard_widget`, `update_dashboard_widget`, `remove_dashboard_widget`. See [Dashboard widgets](/analytics/dashboard-widgets) for the field reference. # Dashboard widgets Source: https://docs.famulor.io/analytics/dashboard-widgets Reference for widget data sources, visualizations, aggregations, and filters This page is the field reference for building a widget by hand in [Custom dashboards](/analytics/custom-dashboards) — what data you can pull from, how to visualize it, and how to filter it down. ## Data sources | Source | Covers | Measures you can aggregate | | --------------------- | -------------------------------------------------------------------------------- | --------------------------------------- | | **Calls** | Phone calls, web voice and avatar sessions, widget live chat, and WhatsApp voice | Calls, Duration, Cost, Successful calls | | **Assistants** | Per-assistant conversation counts | Assistants | | **Campaigns** | Campaign delivery and funnel data | Campaigns, Calls made, Completed leads | | **Usage and cost** | Credit spend over time | Conversation cost, Conversation minutes | | **Simulations** | Assistant test runs and results | Simulation runs, Evaluation score | | **Bookings** | Calendar bookings created through your assistants | Bookings | | **Knowledge sources** | Knowledge base document and crawl-source health | Documents, Knowledge chunks | ## Visualizations | Visualization | Best for | | ------------------- | ---------------------------------------------------------------------- | | **Number** | One headline figure — a total, a rate, an average | | **Line** | A trend over time | | **Area** | A trend over time, with the volume underneath emphasized | | **Bar** | Comparing a metric across categories (assistants, campaigns, statuses) | | **Donut** / **Pie** | A share of one total (outcome mix, sentiment split) | | **Funnel** | Progress through ordered stages (assigned → called → completed) | | **Table** | Row-level detail rather than a single aggregate | Not every visualization applies to every source — the widget editor only offers the combinations that make sense for the source you picked. For example, Calls supports Number, Line, Area, Bar, Donut, Pie, and Table; Campaigns supports Number, Bar, and Funnel; Usage and cost supports only the time-based views (Number, Line, Area). ## Aggregations | Aggregation | What it computes | | ----------- | ---------------------------------------------------------------------- | | **Count** | How many records match | | **Sum** | Total of a numeric measure (for example, total duration or total cost) | | **Average** | Mean of a numeric measure | The editor only offers the aggregations that make sense for what you picked: * Category-style visualizations (Bar, Donut, Pie, Funnel, Table) always count records. * **Sum or Average** — call Duration and Cost, Conversation cost, Conversation minutes. * **Sum only** — Calls made, Completed leads, Knowledge chunks. * **Average only** — Successful calls (a success rate) and Evaluation score. * Everything else counts records. ## Grouping and filtering * **Group by** splits an aggregate into a trend or a set of categories. Calls can group by Date, Assistant, Campaign, Status, Direction, Sentiment, Success, or Post-call outcome; Campaigns, Bookings, Knowledge sources, and Simulations group by status (Bookings can also group by source); Usage and cost has no grouping. * **Filters** narrow one widget without touching the rest of the dashboard. They're available on the Calls source, on the fields with a fixed set of values — Status, Direction, Sentiment, and Success — and the only operator today is **is** (an exact match), so a live-conversations widget filters Status **is** In progress. * **Date range** sets the time window: last 7, 14, 30, or 90 days, with an optional comparison to the immediately preceding period of the same length. * **Assistant scope** and **Campaign scope** limit a widget to one assistant or one campaign. Assistant scope applies to the Calls and Usage sources; campaign scope also applies to Campaigns. ## API and MCP Widgets are fully scriptable through the public API — useful for building or migrating dashboards programmatically. The schema accepts a few more values than the in-product editor offers today; a widget built on a combination the dashboard can't render shows a short note in its place asking you to edit it and pick a supported one, so stick to the combinations above. A widget (`POST/PATCH /api/v1/dashboards/{id}/widgets[/{widgetId}]`, scope `dashboards:write`) has: * `widget_type` — `statistic`, `chart`, or `table` (the broad shape; `visualization` picks the specific chart style within it) * `visualization` — `auto`, `number`, `line`, `area`, `bar`, `stacked_bar`, `donut`, `pie`, `funnel`, `heatmap`, `table`, or `leaderboard` * `data_table` — the data source (`calls`, `campaigns`, `assistants`, `leads`, `bookings`, `knowledge_bases`, `simulations`, `tools`, `phone_numbers`, `conversions`) * `aggregation` — `count`, `sum`, `avg`, `max`, or `min` (`max` and `min` are API-only today) * `column_name` / `group_by` — which field to aggregate or group by * `conditions` — up to 20 filters, each a field, an operator (defaults to `equals`), and a value * `compare_previous_period`, `rate_range` (`7d`/`14d`/`30d`/`90d`), `show_legend`, `show_values` * `grid_w` (3–12) / `grid_h` (1–4) — layout size within the dashboard MCP: `create_dashboard_widget`, `update_dashboard_widget`, `remove_dashboard_widget`, `list_dashboard_widgets`. See the [API reference](/api-reference/introduction) for the complete widget schema. # Natural-language dashboards Source: https://docs.famulor.io/analytics/natural-language-dashboards Turn a plain-language analytics question into reviewable dashboard insights Natural-language dashboards let you describe an analytics view in everyday language. Famulor prepares a preview, and nothing is added to your dashboard until you confirm it. ## Build a dashboard view 1. Open a [custom dashboard](/analytics/custom-dashboards). 2. Select **Create with Milian**. 3. Describe the metrics, time range, comparison, and filters you need. 4. Select **Preview insights** and review every proposed card. 5. Select **Add insights** to save the cards. For example: > Show success rate and average duration for outbound calls in the last 30 days. Generated cards work like manually created [dashboard widgets](/analytics/dashboard-widgets). You can edit, resize, reorder, or remove them afterward. ## Supported questions You can ask about conversation volume, activity over time, success rate, call duration, assistant and campaign performance, outcomes, status, direction, sentiment, and recent conversations. Supported time ranges include 7, 14, 30, and 90 days, with optional comparison to the previous period. Filters use the values available in Famulor. If a request cannot be represented, the preview explains what to change instead of adding an uncertain result. Dashboards always use data from the active workspace. Preview every proposed card before adding it, especially when your question contains several filters. ## Public API Use `POST /api/v1/dashboards/{id}/natural-language` to generate a preview. Send the returned plan to `PUT /api/v1/dashboards/{id}/natural-language` to validate and save its widgets. Both operations require the `dashboards:write` scope. See the API reference for the complete request and response schema. # Agent Tools Source: https://docs.famulor.io/assistants/agent-tools A workspace-wide catalog of custom tools and pre-built connectors any assistant can call Assistants act on the world through tools — actions they can take during a conversation. **Agent Tools** (`/tools` in the sidebar, under **Agents**) is where you build your own tools once and connect pre-built ones, so any assistant in the workspace can use them. Agent Tools is workspace-wide: a tool lives here once and is assigned to as many assistants as you like. An assistant's own **Tools** tab is the per-assistant view, where you switch platform actions like call transfer, SMS, and end call on or off for that one assistant — see [Built-in tools](/assistants/built-in-tools). ## Agent Tools vs. Automations Both are ways for an assistant to act on outside systems, but they run at different moments. A tool on this page is something the assistant reaches for itself, live, while it's already talking to someone — deciding in the moment that it needs to look something up or create a record. An automation is a fixed sequence of steps you (or Milian) design in advance, usually started by a background event like a call ending. | | Agent Tools (this page) | Automations | | --------------- | ------------------------------- | -------------------------------------- | | Runs | Live, mid-conversation | Mostly in the background, on a trigger | | Steps chosen by | The assistant, as it needs them | You or Milian, in advance | The two meet in one place: an automation you make assistant-callable appears in **Installed** as an **Automation-managed** tool — listed here, but edited from the automation itself. For background workflows started by events like **On Call Completed** or a new contact, see [Automations](/automations/overview). ## Installed Your workspace's own tools, grouped by type: * **HTTP API tools** — call your own HTTP endpoint from any supported conversation channel, for example `book_appointment → POST https://…`. * **MCP servers** — connect an external MCP server and allow every tool it offers, or select only specific ones. * **Built-in** — platform capabilities such as call transfer, SMS, or end call, set up once here and reused across assistants. The same actions can be configured per assistant instead; see [Built-in tools](/assistants/built-in-tools). Each tool is created once and can be assigned to several assistants — select **Assign** on a tool to see and change which ones use it. Editing a tool updates it everywhere it's assigned, and each row shows how many assistants use it (or **Unused**). Rows also carry the tool's health: the result of its last run, and a warning when a connection stopped working. If an MCP server's sign-in expired, select **Reauthorize** on that tool — the connection is repaired in place, so assignments, allowed tools, and settings stay as they were. ## Agent Connectors The **Agent Connectors** tab is a searchable app store of pre-built integrations — CRM, Calendar, Telephony, Automation, Productivity, Utilities, and Other apps, filterable by category or narrowed to MCP-only — that attach to an assistant as a callable tool in a couple of clicks instead of building an API tool by hand. Connect with an API key or an OAuth sign-in, depending on the app. ## Execution behavior Every tool an MCP server exposes has its own **Execution behavior** section in the server's editor, controlling how that tool runs during a call or chat: * **Allow cancellation** — lets the assistant cancel a running invocation. Cancellation can't undo a remote change the tool already made. * **Duplicate calls** — what happens if the assistant tries to call the same tool again while it's still running: allow it, reject it, replace the running call, or ask the assistant to confirm first. * **Speak progress updates** — read out progress text the MCP server sends while the tool runs. Only enable this for servers you trust, since that text becomes part of the conversation. ## Always available Some tools are attached by the platform itself and never appear under **Installed** — you don't assign them, and they can't be removed: | Tool | When it's available | | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `get_current_time` | Always, on every call and chat. Returns the current date and time in the assistant's timezone (a campaign timezone overrides it). The system prompt also receives a "Today is …" line at call start, and `{{date}}` / `{{time}}` are available as variables. | | `search_knowledgebase` | As soon as a knowledge base is attached to the assistant. | | `submit_knowledge_gap_draft` | When a knowledge base is attached and knowledge-gap capture is enabled. | | `check_availability`, `book_appointment` | When a calendar integration is connected under the assistant's **Integrations** tab. | | Recall job tools | Only on a [Famulor Loop](/telephony/famulor-loop) Recall call. | A prompt that tells the assistant to call one of these works without any tool assignment. Everything else — built-ins, API tools, MCP servers, connectors — must be installed and assigned. ## Max tool steps Each assistant has its own **Max tool steps** setting, in its **Tools** tab — how many tool calls it may chain within a single turn before it has to answer without calling another tool. Range 1–20, default 3. ## Tool versions Every change to a tool is versioned. Use the API or MCP to review a tool's history and restore an earlier version if a recent edit broke something. ## Managing tools Workspace admins create, edit, and assign tools. Other members see a notice that tools are managed by workspace admins. ## Availability Your plan's **Tools & MCP** limit caps how many tools the workspace can have installed at once. MCP servers additionally need the **Connect AI (MCP)** plan feature — without it, creating an MCP tool is refused. Both are shown under **Settings → Plan**. ## API & MCP | REST | MCP tool | Scope | | ----------------------------------------------------- | -------------------------------------------- | -------------------------------------- | | `GET/POST /api/v1/tools` | `list_tools`, `create_tool` | `assistants:read` / `assistants:write` | | `GET/PATCH/DELETE /api/v1/tools/{id}` | `get_tool`, `update_tool`, `delete_tool` | `assistants:read` / `assistants:write` | | `GET /api/v1/tools/{id}/versions` | `list_tool_versions` | `assistants:read` | | `POST /api/v1/tools/{id}/versions/{revision}/restore` | `restore_tool_version` | `assistants:write` | | `GET /api/v1/tools/{id}/usage` | `get_tool_usage` | `assistants:read` | | `POST /api/v1/tools/{id}/reauthorize` | `reauthorize_tool` | `assistants:write` | | `GET/PUT /api/v1/assistants/{id}/tools` | `get_assistant_tools`, `set_assistant_tools` | `assistants:read` / `assistants:write` | See [Tools & webhooks](/api/tools-and-webhooks) for request and response details. ## Next steps Turn on call transfer, SMS, email, and other platform actions per assistant Full API and MCP reference for building and assigning tools # AI Quality Assurance Source: https://docs.famulor.io/assistants/ai-quality-assurance Run cohort QA over call transcripts — packs, credits, dashboard. Analyze completed calls with structured insights across language and performance. Pick a **pack**, choose a **date range**, and review average score, resolution rate, trends, and top user questions. Audio-level metrics (WER, overlapping speech) are not included in v1 — analysis is transcript-based. ## QA packs | Pack | Focus | | ------------------------- | ------------------------------------------------------------------- | | Full QA | Score, resolution, hallucinations, sentiment, trends, top questions | | Language & Hallucinations | Hallucinations, language quality, score | | Resolution & Sentiment | Resolution, sentiment, top questions | | Performance Trends | Score and resolution trends | ## QA credits QA runs consume workspace credits based on LLM usage for each analysed call. The Usage page shows charges as **QA usage**. Cost breakdowns and markup are not exposed in the product UI. ## Availability Requires **AI Quality Assurance** in your plan. This is distinct from per-assistant **[AI QA scorecards](/assistants/analysis#ai-qa-scorecards)**. ## UI Open **AI QA** in the sidebar (`/qa`). Create a run, wait for the analysis progress, then open the Call QA Overview dashboard. ## API * `GET/POST /api/v1/qa/runs` * `GET /api/v1/qa/runs/{id}?include_results=true` Scopes: `calls:read` / `calls:write`. ## MCP * `list_qa_packs` * `list_qa_runs` * `get_qa_run` * `create_qa_run` # Post-call analysis Source: https://docs.famulor.io/assistants/analysis Automatically score sentiment, success, and extract structured data from every call After a call ends, **AI analysis** can evaluate the transcript. It can rate caller sentiment, decide whether the call met a success criterion, and extract structured fields such as a callback number, order ID, or yes/no answer. The result is available in [History](/monitoring/history), the public API, and MCP. ## What analysis produces For each analyzed call the result can include: * **Sentiment** — `positive`, `neutral`, or `negative` (overall caller sentiment). * **Success** — `true` / `false` (or `null` when success evaluation is off), plus a short **reason** explaining the verdict. * **Data** — a map of the structured fields you defined, keyed by field name. * **Analysis time** — when the result was produced. Use sentiment and success filters in History or `GET /api/v1/calls?sentiment=&success=` to find matching calls quickly. Analysis runs **after** the call and never affects the live conversation. If analysis is unavailable, the call and its transcript remain unchanged and no result is shown. ## Configuring analysis Open the assistant's **Analysis** card and turn on the parts you need. Everything is optional; an empty configuration means no analysis runs. Enabled by default. Turn it off if you don't need per-call sentiment. Enable **Success** and describe, in plain language, what a successful call looks like — e.g. *"The caller booked an appointment"* or *"The caller confirmed their delivery address."* The result contains a boolean plus a reason. Add fields to extract. Each field has a `name` (snake\_case, unique), a `type` (`string`, `number`, `boolean`, or `enum`), a `description` explaining what to extract (max. 500 characters), and — for `enum` — a list of `choices`. Every field is always attempted — there's no editor control to make one optional, though the API's `required` flag still exists in the schema. ### Example configuration ```json theme={null} { "sentiment": true, "success": { "enabled": true, "criteria": "The caller booked an appointment" }, "fields": [ { "name": "callback_number", "type": "string", "description": "Phone number the caller wants a callback on" }, { "name": "appointment_day", "type": "enum", "description": "Requested weekday", "choices": ["mon", "tue", "wed", "thu", "fri"] }, { "name": "is_existing_customer", "type": "boolean", "description": "Whether the caller is already a customer" } ] } ``` A resulting `calls.analysis` looks like: ```json theme={null} { "sentiment": "positive", "success": true, "success_reason": "Caller agreed to a Tuesday appointment and gave a callback number.", "data": { "callback_number": "+493012345678", "appointment_day": "tue", "is_existing_customer": false }, "analyzed_at": "2026-07-05T09:12:44Z" } ``` ## Using analysis results * **History filters** — filter the call list by sentiment and success to find, say, all negative calls that did *not* succeed. * **Public API** — every call in `GET /api/v1/calls` and `GET /api/v1/calls/{id}` carries `analysis`, `sentiment`, and `success`. Filter the list with `?sentiment=negative` and `?success=false`. * **MCP** — the same call fields are exposed through the MCP `list_calls` / `get_call` tools. Re-running analysis on a past call — **History → Re-evaluate** — overwrites the stored sentiment, success, and extracted fields with a fresh result. It costs extra credits at the workspace's **History re-evaluate** rate; current rates are on the [Usage page](https://app.famulor.io/usage). ## AI QA scorecards **AI QA scorecards** (Beta) score every finished call against your own quality checklist — a separate, complementary result from the sentiment/success/fields analysis above. Configure it in the same **Analysis & QA** tab as post-call analysis. Off by default. The card is only shown once **Beta features** are switched on for the workspace under [Settings → Workspace](/settings/workspaces), and enabling it needs a plan that includes AI QA scorecards. An overall score from 0–100; a call passes once it meets or exceeds this value. Each criterion has a name, a weight (how much it counts toward the overall score), and a source: * **LLM judge** — the AI reviewer reads the transcript and scores the criterion from a free-text description you write. Costs an extra evaluation per criterion. * **Reuse success** — reuses this call's Analysis success flag (yes = 1, no = 0), at no extra cost. * **Reuse sentiment** — reuses this call's Analysis sentiment (positive = 1, neutral = 0.5, negative = 0), at no extra cost. Results appear in **History**, on the call's detail view. Configure scorecards the same way as analysis — through the assistant editor, `PATCH /api/v1/assistants/{id}`, or the MCP `update_assistant` tool. This is different from the cohort-level [AI Quality Assurance](/assistants/ai-quality-assurance) tool, which runs a QA pack you choose against a batch of past calls on demand. Scorecards run automatically, per call, as it finishes. ## Configuring via the API Use `PATCH /api/v1/assistants/{id}` or the MCP `update_assistant` tool to update the same analysis options programmatically. An empty configuration means analysis does not run. See the [API reference](/api-reference/introduction) for the request schema. ## Turn a real call into a simulation test On a finished call in **History**, use **Create Simulation Test**. Famulor prepares a persona, script, and success criteria from the transcript and analysis, then opens the assistant's [Simulations](/assistants/simulations) panel for review. The same action is available as: * `POST /api/v1/assistants/{id}/tests/from-call` with `{ "call_id": "…" }` (`assistants:write`; Simulations must be included in the plan) * MCP tool `create_assistant_test_from_call` Clicking a transcript line in History jumps the recording to that moment. # Built-in tools Source: https://docs.famulor.io/assistants/built-in-tools Give assistants safe actions for calls, messages, scheduling, and data capture Built-in tools let an assistant take approved actions during a conversation. Configure them under **Assistant → Tools** and write a clear description of when each tool may be used. If a tool is unavailable or misconfigured, the assistant receives a safe failure result and can continue the conversation. ## Available tools | Tool | What it does | | ------------------------- | ---------------------------------------------------------------------------- | | **End call** | Ends the call after the assistant has completed the request and said goodbye | | **Call transfer** | Transfers the caller to a configured phone number | | **Warm call transfer** | Briefs a colleague before bringing the caller into the conversation | | **Transfer to assistant** | Hands the live call to another assistant in the same workspace | | **Send SMS** | Sends a text message to the caller or a configured number | | **Send email** | Sends a fixed, templated, or assistant-written email | | **Business hours** | Checks a weekly opening-hours schedule in the assistant's timezone | | **Schedule callback** | Confirms a future callback and adds it to **Audience → Scheduled Callbacks** | | **DTMF Input** | Sends keypad tones to navigate an external IVR or phone menu | | **Collect Keypad Input** | Collects an exact number of keypad or spoken digits from the caller | | **Collect payment card** | Securely captures a payment method into your connected payment account | | **Set call variable** | Saves a value for later flow conditions, tools, emails, and webhooks | Calendar availability and booking are configured through [Calendar booking](/assistants/calendar-booking). ## DTMF and keypad input **DTMF Input** sends tones from the assistant to an external IVR. Configure `0–9`, `*`, `#`, or `A–D`, up to 32 characters. Leave the sequence empty when a prompt-based assistant should choose it during the call; a **Send DTMF** Flow node always requires fixed tones. **Collect Keypad Input** receives keypad or spoken digits. Choose **Exact number of digits** for a fixed PIN or one menu choice (1–32 digits), or **Until the stop key** for a variable-length number. In the latter mode, `#` or `*` submits once the minimum length is reached; reaching the maximum also finishes. The stop key is not returned. New unconfigured tools accept 1–32 digits until the stop key. Existing tools with a saved digit count retain their exact length. The total timeout is 5–120 seconds. In the [Flow Builder](/flow-builder/overview), use a **Collect** node with type **Keypad or spoken digits**; its input-length mode and digit bounds control that step, while the assigned tool provides timeout and stop key. The default total timeout is 30 seconds, including the entry prompt; explicitly saved timeouts stay unchanged. ## Transfers ### Phone transfer Choose a destination, transfer type (cold or warm), and the condition under which the assistant should transfer — describe it in as much detail as you can, since precise wording makes the trigger more reliable. You can also let the assistant determine the destination number dynamically instead of fixing it. **Cold transfer** connects the caller straight through to the destination. Set a ringing timeout (15–80 seconds, 30 by default) before the attempt is considered unanswered. **Warm transfer** briefs a colleague before connecting the caller — use it whenever the recipient needs context first. It needs a few extra settings: | Setting | What it's for | | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Outbound number | A workspace number with an outbound trunk, used to call the supervisor | | Hold music | Plays to the caller while the supervisor is briefed | | Hold message | Spoken to the caller right before they're placed on hold | | Briefing initial message | The first thing the assistant says once the supervisor picks up | | Summary instructions | What the assistant should tell the supervisor about the call | | Share supervisor conversation with the AI | After a failed transfer, lets the AI use relevant supervisor consultation notes in the current call. The full consultation is always retained in the call record | | Connected message | Spoken to the caller once the supervisor is connected | | Ringing timeout | 5–120 seconds (30 by default) before the attempt times out | **Fallback on failure** decides what happens if the colleague doesn't pick up: the assistant continues the conversation itself and offers alternatives, says goodbye and ends the call, or connects the caller straight through to a fallback number without a briefing. The AI always receives the provider-neutral failure status (busy, declined, no answer, or unavailable). Supervisor consultation notes are shared with the AI only when the setting above is enabled and the supervisor actually spoke. ### Transfer to another assistant Hand off a live call to a different assistant in the same workspace — useful for language routing (detect the caller's language, transfer to a language-specialist assistant), a different compliance or consent path (move to an assistant configured for a different recording setup), or chaining specialized assistants (sales → onboarding, triage → expert) without provisioning a separate number for each step. Choose the target assistant and a **Context Engineering Plan** — how much of the conversation it receives. Options run from the full message history down to a summary plus the last few messages (recommended), only the last few messages, a summary alone, or no prior context at all for a clean handoff. Optionally set a **message before transfer**, and choose whether the target assistant speaks its own initial message once it takes over. The **Squad** view shows the resulting assistant-routing graph. Transfers to the same assistant are rejected, and a transfer limit prevents loops. ## Ending the call Write the **End call** description as clearly as you'd explain it to a new hire — the tool only fires when its condition actually matches: * **Simple** — end the call once all questions are answered and the caller no longer needs help. * **More detailed** — also end after a successful booking, once the caller says goodbye, or once the conversation is clearly finished. Cover the realistic paths you expect (success, goodbye, "nothing else needed") so the assistant doesn't hang up too early or drag a finished call out. ## SMS and email For SMS, choose whether the recipient is the caller or a fixed E.164 number. The assistant must use a workspace number with outbound messaging enabled. For email, choose a verified sender and one of three content modes: * **Assistant-written** — creates the subject and body from the conversation. * **Fixed** — always sends the exact configured content. * **Template** — inserts call variables and stops if a required value is missing. A successful send means the message was accepted for delivery; it does not guarantee delivery to the final inbox or handset. ## Business hours and callbacks Business hours can contain one or more time windows for each weekday. The check always uses the assistant's configured timezone. For callbacks, choose the destination and the maximum number of days customers may book ahead. The assistant must repeat the agreed time and obtain confirmation. Past dates and dates outside the allowed window are rejected. ## Payment-card collection Connect your payment account under **Tools → [Agent Connectors](/assistants/agent-tools#agent-connectors)**, then add **Collect payment card** to the assistant or a Flow Collect node. The caller enters card details securely. Famulor never exposes the full card number or security code in conversation history. Only use this feature where your legal basis, consent flow, and account permissions allow it. Collecting a payment card costs extra credits at the workspace's **Card collection** rate; current rates are on the [Usage page](https://app.famulor.io/usage). ## Call variables and current time **[Set call variable](/assistants/variables)** lets the assistant store approved values such as a company name or appointment preference. Limit the allowed keys when the assistant should only update specific fields. Every assistant also has a current-time tool. It uses the assistant's timezone to resolve requests such as “tomorrow at 3” or “next Tuesday”. ## API and MCP Built-in tools can be managed through `PATCH /api/v1/assistants/{id}` and the assistant tools in [MCP](/mcp/tools-and-scopes). Use `GET /api/v1/email-senders` or its MCP equivalent to list verified senders without exposing credentials. # Calendar & booking Source: https://docs.famulor.io/assistants/calendar-booking Let assistants check availability and book appointments mid-call via Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel, or the built-in engine Appointment scheduling is the classic voice-agent use case: the assistant checks open slots during the call, offers a few options, and books the one the caller picks. The platform supports this in two ways that can be combined freely: 1. **Calendar integrations** — connect an external scheduling provider (Acuity Scheduling, Cal.com, Calendly, eTermin, HighLevel) once, assign it to an assistant, and the assistant automatically gets booking tools for every call. Google Calendar and Outlook connect in the same place, but they feed the built-in engine's calendar sync rather than mid-call booking — see the note under the table. 2. **The built-in booking engine** — define your own event types with weekly availability and get a public, embeddable booking page at `/book/{workspace}/{slug}`, ICS invitation emails, and a `native` integration your assistants can book against. No external account required. See [Built-in calendar](/assistants/native-calendar) for the full picture. ## Providers at a glance | Provider | Availability | Booking | Credentials | | ---------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | | **Cal.com** | ✓ open slots of an event type | ✓ direct booking | API key (`cal_…`) + API endpoint (US, EU, or self-hosted), event type picked from a synced list | | **Calendly** | ✓ available times of a selected event type | ✓ direct booking (paid Calendly plans), single-use scheduling link, confirmed cancellation | OAuth connect (one time) | | **Acuity Scheduling** | ✓ live slots or class availability for a selected appointment type | ✓ direct booking, confirmed cancellation and rescheduling (series cannot be rescheduled) | OAuth connect (one time) | | **eTermin** | ✓ live slots for a selected service + calendar/person | ✓ direct booking | Public Key + Secret Key (Account Settings → API), service and calendar/person picked from synced lists | | **HighLevel** | ✓ live free slots of a selected calendar | ✓ direct booking | An existing HighLevel connection (from Automations → Connections) + calendar | | **Google Calendar** | ✓ free/busy of a connected calendar, for the built-in engine | ✓ event creation with attendee invite, from the built-in engine | OAuth connect (one time) | | **Outlook / Microsoft 365** | ✓ free/busy of a connected calendar, for the built-in engine | ✓ event creation with attendee invite, from the built-in engine | OAuth connect (one time) | | **Native (built-in engine)** | ✓ computed from your event type's weekly availability | ✓ direct booking + ICS email | none — see [Built-in calendar](/assistants/native-calendar) | **Google Calendar, Outlook, CalDAV, and ICS feeds are calendars for the built-in booking engine, not mid-call booking providers.** Connecting them makes their busy times — and for Google, Outlook, and CalDAV, event write-back — available to a [native event type](/assistants/native-calendar#the-built-in-booking-engine). Assistants cannot call them directly during a conversation. To book on those calendars mid-call, assign **My booking calendar** (that event type) to the assistant, or put a Cal.com, Calendly, Acuity, or HighLevel calendar in front instead. **Calendly link mode**: Calendly's Scheduling API requires a paid Calendly plan. If your plan cannot book directly, set the integration's `booking_mode` to `link` — the assistant then agrees on a rough time with the caller and sends a **single-use scheduling link** by SMS or email (`link_channel`) instead of hard-booking. Integrations that hit the paid-plan restriction at call time are flagged with status `link_mode`. ## Connecting an integration Go to **Booking → Integrations** and pick a provider card: Paste your API key (Cal.com → Settings → Developer → API Keys) and pick the **API endpoint**: US (default), EU, or Custom for a self-hosted Cal.com instance. Select **Load event types** to fetch your events by name and duration — no need to copy a numeric ID from the URL. The integration also reads the event type's custom booking questions automatically; use **Refresh fields** if you change them later in Cal.com. Optional timezone override — make sure it matches the Cal.com event type. Click **Connect with Calendly**, approve access, then choose an active event type by **name and duration**. One account connection can be reused by multiple integrations. If the event type has more than one location configured in Calendly, pick the one the assistant should use under **Meeting location**. Choose the booking mode, link channel, and Book/Cancel permissions. Click **Connect with Acuity**, approve access, then choose an appointment type. Optionally select a specific calendar or person, or let the service choose any available calendar. Enable or disable Book, Cancel, and Reschedule for each integration. Paste your **Public Key** and **Secret Key** (eTermin → Account Settings → API), then select **Load services** to fetch your services by name and duration. Picking a service loads only the calendars/persons eTermin offers for it — pick one and adjust the duration if it needs to differ from the service default. After the integration is saved, a **Web Push URL** appears: paste it into eTermin's **API → API & Web Push** settings (enable **Send Web Push**, prefer JSON format) so eTermin notifies the platform whenever an appointment is created, changed, or cancelled on its side. The editor then shows when the last event arrived — the quickest way to confirm the connection is live. An optional shared secret can be set on both sides and is checked as the `X-Webhook-Secret` header. First connect a HighLevel account under **Automations → Connections** if you haven't already. Back in **Booking → Integrations**, choose **Connect HighLevel**, select that connection, then pick one of its active calendars. Book, Cancel, and Reschedule toggles are stored per integration, but assistants currently get availability and booking only for HighLevel — there is no HighLevel cancel or reschedule tool yet. Click **Connect** and complete the OAuth consent. The connection can be reused by multiple event types in the workspace. Pick one of your [booking event types](/assistants/native-calendar#the-built-in-booking-engine). Every integration is **verified before it is saved**. Invalid credentials or event settings are rejected with a clear error. Secret values are never displayed again after saving. Deleting the final integration that uses an Acuity account revokes its OAuth token through Acuity's disconnect endpoint and removes the local connection. An unused account can also be removed with **Disconnect account** in the Acuity editor; shared accounts cannot be disconnected until their remaining integrations are removed. Existing personal-access-token integrations remain operational but appear as **Legacy connection — reconnect with Calendly**. Reconnecting upgrades them to OAuth and removes the PAT from the integration. ## Assigning to an assistant Open the assistant's settings and tick the integrations it should use (or `PUT /api/v1/assistants/{id}/integrations`). Each assigned integration adds its own booking tools to every call: | Tool | Type | What it does | | -------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `check_availability(start_date, end_date?)` | read-only, interruptible | Fetches open slots for the date range and reads them out in the assistant's timezone (capped so the agent never recites 200 slots). | | `book_appointment(name, email, start, notes?)` | write — runs with a filler phrase, not interruptible | Books the chosen slot. On success the booking start/ID are stored as call variables for flows, analysis, and webhooks. If the slot was just taken, the agent is told to offer another one. | | `send_booking_link(email?, phone?)` | Calendly link mode only | Creates a single-use scheduling link and sends it via SMS or email. | | `find_appointment(email, name)` | Calendly/Acuity management | Finds upcoming appointments for the selected event/appointment type. Both the exact booking email and full name are required. | | `cancel_appointment(event_id / appointment_id, confirmed)` | write — not interruptible | Cancels only an event or appointment returned by `find_appointment` during the same call, after the assistant reads it back and receives explicit confirmation. | | `reschedule_appointment(appointment_id, new_start, confirmed)` | Acuity management | Moves only an Acuity appointment returned in the same call, after availability was checked and the caller explicitly confirmed the new time. | Every integration gets `check_availability` and `book_appointment`. The management tools are added only where the provider supports them: **Calendly** (find and cancel), **Acuity** (find, cancel, and reschedule, following the toggles you set), and the **built-in engine**, which adds a workspace-wide set that identifies the caller by phone number first and falls back to email plus full name. **Cal.com**, **eTermin**, and **HighLevel** calendars currently offer availability and booking only — the assistant can read slots and book on them, but not look up, cancel, or move an existing appointment during a call. If more than one integration is assigned, tool names get the integration name as a suffix (for example `check_availability_sales`). Slots are always spoken in the **assistant [timezone](/assistants/timezone)** — set it in the assistant's settings. Calendly bookings can't be rescheduled through its API — a caller who wants a different time gets a fresh `cancel_appointment` and `book_appointment` instead, or reschedules through the link in their Calendly confirmation email. Tell the assistant **when** to book in its prompt, e.g.: *"Before offering any time, call check\_availability. Once the caller confirms a slot, call book\_appointment with their name and email."* ## Booking questions Event types on the built-in engine can ask for more than a name and an email address. In the event type editor, the **Booking questions** section below the description lets you add custom questions — short text, long text, email, phone, address, URL, number, a single checkbox, checkbox group, radio group, select, multi-select, or multiple email addresses — each with its own label, an optional placeholder, and a required toggle. **Name** and **Email** are collected on every booking and are always required. **Phone** is asked by default but optional — switch it to **Required** in the same section when every booking needs a callback number. Every question gets an identifier (derived from its label, editable) that doubles as a URL parameter for prefilling the public booking page, e.g. `?name=Jane+Doe&email=jane@example.com&company=Acme` — repeat the parameter or use a comma-separated list for a multi-value field. A question can also be marked **Disable input if the URL identifier is prefilled**, which makes it read-only whenever that parameter is present — useful when an embedding page already knows the answer. Assistants read these requirements automatically, no extra prompt needed: on the built-in engine, `check_availability` states in plain English what to collect before booking — for example *"To book, collect: full name; email address ([user@domain.tld](mailto:user@domain.tld)); phone number in E.164 format (e.g. +4915123456789); Company (required, short text)…"* (the message continues with a reminder never to confirm a booking before the booking tool succeeds) — and `book_appointment` requires exactly those fields, one parameter per question. It never reports a successful booking unless the underlying request actually succeeded. Providers other than the built-in engine ask for a full name and an email address. Custom answers appear on the booking record — in the dashboard, under `answers` in `GET /api/v1/bookings/{id}` and the `get_booking`/`list_bookings` MCP tools, in the guest and host confirmation emails, in the ICS invite, and in every booking webhook payload (creation, cancellation, and reschedule). ## Plan gating Your plan must include **Calendar integrations**. If it is not included, you cannot create integrations. ## Reconnecting an expired connection Google Calendar, Outlook Calendar, Calendly, Acuity Scheduling, and HighLevel connections can expire — the account's password changed, access was revoked, or the stored refresh token lapsed. Famulor detects this the moment a refresh fails and flags the connection immediately, instead of waiting for a booking to fail. * The affected row in **Booking → Integrations** shows an amber **Reconnect required** badge with a short reason, and a banner at the top of the tab counts how many connections need attention. * Click **Reconnect** (↻) on the row to sign in again. Google, Outlook, Calendly, and Acuity return you to the same **Booking → Integrations** tab; for HighLevel the sign-in flow returns you to **Automations → Connections** instead — pick the same sub-account you originally connected, or reconnecting creates a separate connection. * CalDAV/ICS calendars have no sign-in flow to restart: remove the calendar and add it again with a fresh app password. Workspace owners and admins receive an email the moment a connection breaks, and a reminder every 7 days while it stays broken. This reminder is managed by your platform administrator. Via the API or MCP, the integration object exposes `connection_status` and `needs_reauth` so you can monitor connection health programmatically. ## Troubleshooting Confirm the key is still active in Cal.com and that you pasted a live key (Cal.com's live keys begin with `cal_live_`), then select **Load event types** again. If you get an authentication error instead of an empty list, you likely picked the wrong API endpoint — an EU Cal.com account needs the EU endpoint (or Custom for a self-hosted instance), not the US default. `book_appointment` needs a valid email address, because Cal.com rejects a booking without one. Spoken addresses ("anna at example dot com") and German umlauts are converted automatically before the request goes out, so most dictated addresses work; if what the assistant heard still isn't usable, it is told to ask again rather than booking. Tell it in the prompt to collect and confirm the email before booking, and to reuse an address you already hold as a [call variable](/assistants/variables) instead of asking twice. The event type's only location in Calendly is a video-conferencing link (Google Meet, Zoom, Teams), and the voice agent can't generate meeting links. In Calendly, edit the event type and add **Custom** or **Phone Call → Inbound call** as a location — Custom is the safest choice and works in every case. If the event type ends up with more than one location, pick the right one under **Meeting location** in the integration. In a Calendly organization, admin and owner accounts see every member's event types, including Round Robin and Collective events; a regular member account only sees its own. A **Web Call** test runs without a phone number, so anything the booking flow derives from the caller's number (sending a scheduling link by SMS, looking an appointment up by phone) can't work the same way. Use **Test → Call** in the assistant header for a realistic run: the assistant dials a number you enter, or you dial its inbound number yourself. Still stuck? Contact support with the integration's name, the error shown in the assistant editor, and a transcript of the call that failed to book. ## API & MCP Everything above is available in the [public REST API](/api-reference/introduction) and as MCP tools at `https:///mcp`: | REST | MCP tool | Scope | | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------- | | `GET/POST /api/v1/integrations`, `GET/PATCH/DELETE /api/v1/integrations/{id}` | `list_integrations`, `get_integration`, `create_integration`, `update_integration`, `delete_integration` | `integrations:read/write` | | `POST /api/v1/integrations/calendly/oauth-url` | `create_calendly_oauth_url` | `integrations:write` | | `GET /api/v1/integrations/calendly/connections` | `list_calendly_connections` | `integrations:read` | | `GET /api/v1/integrations/calendly/event-types?connection_id=…` | `list_calendly_event_types` | `integrations:read` | | `POST /api/v1/integrations/acuity/oauth-url` | `create_acuity_oauth_url` | `integrations:write` | | `GET /api/v1/integrations/acuity/connections` | `list_acuity_connections` | `integrations:read` | | `GET /api/v1/integrations/acuity/appointment-types?connection_id=…` | `list_acuity_appointment_types` | `integrations:read` | | `GET /api/v1/integrations/acuity/calendars?connection_id=…` | `list_acuity_calendars` | `integrations:read` | | `GET/PUT /api/v1/assistants/{id}/integrations` | `get_assistant_integrations`, `set_assistant_integrations` | `integrations:*` or `assistants:*` | Integration objects include `connection_status` / `needs_reauth`. Event types, connections, and booking records for the built-in engine are covered in [Built-in calendar](/assistants/native-calendar). # Assistant compliance review Source: https://docs.famulor.io/assistants/compliance-review Why an assistant gets blocked for fraud or abuse risk, and how to fix it or request manual review Famulor checks assistant instructions and greetings for clear fraud or abuse risks whenever you save changes. ## When an assistant is blocked Blocking is reserved for serious risks such as impersonating an unrelated bank, government body, or brand; caller-ID spoofing; credential theft; or similar scam intent. A blocked assistant cannot handle phone, web, messaging, or email conversations, including calls started through API v1 or MCP. The assistant editor shows the reason and the content that needs attention. When a new block is created, every current member of the affected workspace receives an email. The message uses the workspace's configured brand, app link and email sender. ## Fix and check again Remove or rewrite the flagged content, then save the assistant. Famulor checks the updated version and restores the assistant when the issue is resolved. ## Request manual review If you believe the content is legitimate, select **Request manual review** in the assistant editor and explain the intended use. The current version is reviewed, and the result appears in the editor. You can also use: * `GET /api/v1/assistants/{id}/compliance-review` * `POST /api/v1/assistants/{id}/compliance-review` with `{ "reason": "..." }` * the [MCP](/mcp/tools-and-scopes) tools `get_assistant_compliance_review` and `request_assistant_compliance_review` If you edit the assistant while a review is pending, request a new review for the updated content. # Guardrails & conversation quality Source: https://docs.famulor.io/assistants/conversation-quality Background audio, interruptions, filler phrases, idle and voicemail handling, ringing, consent, transcript privacy, and guardrails These settings make the difference between "obviously a robot" and a conversation people stay in. All of them are per-assistant. ## Background audio Complete silence sounds artificial on the phone. You can layer in: * **Ambient sound** — office, city, forest, crowded room, or keyboard typing, with adjustable volume (or your own uploaded audio). * **Thinking sound** — a subtle sound while the assistant is thinking — during the LLM wait and any tool calls — so processing never sounds like a dropped call. Hold music is not part of this section: it's configured directly on the [warm transfer tool](/flow-builder/nodes#warm-transfer) (built-in track or your own upload), since it only ever plays while a supervisor is being briefed. ## Interruption handling Callers interrupt — good assistants deal with it gracefully. * **Allow interruptions** — on by default; the assistant stops speaking when the caller talks over it. * **Minimum interruption duration** — ignores very short noises so a cough doesn't cut the assistant off. * **Adaptive interruptions** — backchanneling like "mhm", "okay", or "right" is *not* treated as an interruption, so the assistant keeps talking through natural listener feedback but yields to a real interjection. In compatible realtime modes, select **Adaptive** under **Turn detection** to use this behavior. * **Resume after false interruptions** — in supported modes, the assistant resumes its interrupted output when an apparent interruption produces no transcript during the two-second detection window. This control is disabled when interruptions are off. As a starting point, outbound assistants usually work better when they're easier to interrupt — a caller who wants to jump in shouldn't have to talk over a pitch. Reception and front-desk assistants often benefit from a bit more stability, so a stray cough or background voice doesn't cut the assistant off mid-sentence. ## Noise cancellation and voice detection Under **Conversation → Latency**, **Noise & background voice cancellation** is a single on/off toggle. It suppresses environmental noise and competing background voices before speech detection, with the appropriate audio model selected automatically for phone or web calls. Browser echo cancellation is separate and remains active independently of this assistant setting. The **Custom voice detection threshold** control lives under **Conversation → Turn taking**. It changes how readily audio is classified as speech; it does **not** filter the audio. Auto uses 0.50 for pipeline and adaptive voice detection. Server voice detection uses 0.50 for web calls and 0.70 for phone calls. Lower values hear quieter speech but may react to noise; higher values reject more noise but may miss soft voices. A live **latency waterfall** (STT / LLM TTFT / TTS TTFB / E2E) appears only in the studio web-call test panel — never in the public widget. Telecom guidance (ITU-T G.114) targets one-way latency under 150 ms for a call to feel natural — a useful benchmark when deciding how aggressively to tune interruption and VAD sensitivity for your use case. ## Filler phrases & async tools When a tool call (CRM lookup, availability check) takes seconds, the assistant can bridge the gap: * **Speak-during text** — a fixed announcement at tool start ("One moment, I'm checking that…"). * **Filler phrases** — a rotating set of short phrases spoken during longer waits, with configurable initial delay and interval. Spoken only in pauses — they never talk over the caller. * **Async tools** — mark a [tool node](/flow-builder/nodes#tool) as asynchronous and the conversation continues while the tool runs; the result is woven in once it arrives. ## Idle handling Nobody wants a call that hangs forever in silence: * **Idle timeout** — after this many seconds of silence, the assistant checks in ("Are you still there?"). * **Idle messages** — optional fixed phrases for those check-ins; leave empty for natural LLM-generated ones. * **Max rounds** — after N unanswered check-ins, the assistant says goodbye and hangs up. This also protects your minute balance. The same idle settings are available through `PATCH /api/v1/assistants/{id}` and the MCP `update_assistant` tool. Independently, **max call duration** caps every call: when reached, the assistant wraps up politely and ends the call. ## Voicemail This setting only decides what happens once answering-machine detection (AMD) reports a mailbox on an outbound call — not what happens when a call simply rings out unanswered. * **Leave a voicemail message** — on: the assistant speaks a message, then hangs up. Off: the assistant hangs up immediately, leaving nothing. * **Voicemail message** — the free-text message spoken via TTS when a mailbox is detected. Keep it short and include a callback number. Leave it empty and the greeting / first message is used instead. Campaign calls use **On voicemail** and **Voicemail message** in Campaign Settings. These override the assistant for that campaign. Direct calls use [Assistant settings → Conversation → Voicemail](/assistants/conversation-quality#voicemail). An empty message falls back to the greeting. A message counts as left only when playback finishes. An unavailable mailbox cannot receive a message. Automatic IVR navigation enables detection and presses menu digits when workspace Beta Features are enabled. With navigation off, an interactive receptionist remains on the normal conversation path. Call Screen handling takes priority. Turning campaign AMD off disables detection unless automatic IVR navigation or Call Screen handling is enabled. ## Ringing Two independent timeouts control how long a call rings before something happens: | Control | Range | Default | What it does | | ----------------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- | | **Inbound ringing duration** | 30–120 s | 60 s | How long an inbound caller hears ringing while the assistant joins. Applies to both bring-your-own and platform-managed trunks. | | **Outbound ringing duration** | 15–80 s | 45 s | How long outbound and WhatsApp voice calls ring before counting as no answer. | This is separate from the [Call transfer](/assistants/built-in-tools#transfers) tool's own ringing timeout, which times a single transfer attempt rather than the original call. ## Consent For jurisdictions requiring all-party consent (Germany: §201 StGB): * **Consent announcement** — a configurable message played at call start (pre-generated, zero added latency). * **Consent mode** — the caller agrees **verbally** or by **pressing a key** (DTMF). * **On decline** — either continue the call, or end it politely. * The consent result is stored with the call, audit-proof. ### What the consent covers One announcement can cover two separate purposes. Tick them independently in the assistant editor: * **Recording the call** — the recording starts *only after* consent, never before, and additionally requires **Record calls**. Asked on **every** call, because each recording needs its own permission. * **Remember callers** — a granted consent unlocks that caller's durable memory, so returning callers are recognised without anyone approving them by hand under **Audience → Customer memory**. Asked **once**. A declined consent is never stored as a permanent refusal: the caller is simply asked again on a later call. The memory consent is re-asked only after the retention window under **Settings → [Memory](/assistants/memory)** has lapsed without a call — the expired memory is deleted, so the next call starts fresh. Each purpose must be named in the announcement. Consent to being recorded is **not** consent to storing a customer profile — they are different purposes under GDPR. When you tick a purpose, the editor offers matching wording in the assistant's language; leaving the text empty falls back to a purpose- and language-aware default. If **Record calls** is on while the announcement does not cover recording, the assistant refuses to record and logs `recording_skipped_no_consent` — it will never record without a notice. ## Recording privacy: redaction and re-transcription Two more controls sit next to recording, under **Settings → Privacy**. ### Redact PII in transcript Selected categories of personal data are replaced with `[REDACTED:type]` before the transcript is stored — data minimisation, not just display masking. It applies to newly finished calls only; transcripts already stored keep their original text. Turning it on starts with four categories selected — email address, phone number, IBAN, and credit card number. The full built-in list is much larger, spanning identity, contact, government-ID, financial, security-credential, and health information, and you can select any combination of it. Beyond the built-in categories, add up to 20 of your own named patterns (regular expressions) for anything specific to your business. ### Automatic re-transcription Independently of the manual **Re-transcribe** action in History, **Re-transcribe recording** can run for every recorded call automatically. When it's on, each finished call's recording is transcribed again with a higher-accuracy engine once the call ends; the enhanced transcript appears in the call's detail view next to the live transcript. It requires **Record calls** to be on. Automatic re-transcription bills per recorded minute (rounded up) at the workspace's **Re-transcribe** rate; current rates are on the [Usage page](https://app.famulor.io/usage). ## Guardrails Deterministic safety rails on top of the prompt: * **Manipulation → Prompt injection** — blocks attempts to bypass or override system instructions (jailbreak detection in the caller’s speech). Available on every plan, **on by default**; uncheck to opt out (`guardrails.input.jailbreak`). * **Blocked topics** — subjects the assistant must refuse; matched output is replaced by your **refusal text** (Fallbacks & Guardrails). * **Escalation keywords** — if the caller mentions one (e.g. "lawyer", "emergency"), the platform — not the LLM — triggers an immediate transfer to your **escalation number** (Fallbacks & Guardrails). Topic and category filters are enforced in the output path, so they hold even when a clever caller talks the model around its prompt. ## Pronunciation & text cleanup See [Models & voices → Speaking style](/assistants/models-and-voices#speaking-style): pronunciation dictionary, markdown/emoji filtering, speaking rate, and output volume. ## Troubleshooting | Symptom | Try | | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Noise cancellation eats caller speech in the transcript | Turn **Noise & background voice cancellation** off for that assistant (Conversation → Latency) and test again | | Assistant answers while the caller is still speaking | Raise **Min. silence (VAD)** so it waits longer before deciding the turn is over | | A cough or background voice stops the assistant mid-sentence | Raise **Min. interruption duration**; in supported modes, keep **Resume after false interruptions** on | | Responses feel sluggish to start | Lower **Min. silence (VAD)** in small steps; only lower the voice-detection threshold if quiet speech is being missed | | A caller declines something mid-call and you want a human to take over | The built-in **On decline** setting only continues or ends the call — add a prompt rule that detects the decline (for example: "if the caller says they don't want to share personal data, transfer the call") and pair it with a [Call transfer](/assistants/built-in-tools#transfers) tool pointed at a team member | Change one setting at a time and re-test with a realistic call — small, isolated changes are much easier to judge than several at once. # Engine modes Source: https://docs.famulor.io/assistants/engine-modes Pipeline, realtime, half-cascade, and Translate — choose how a conversation works The **Engine mode** setting selects how conversations work. Pipeline, Realtime, and Half-cascade are assistant modes that support prompts and flows. **Translate** interprets a conversation between two people and uses its own language and voice settings. Your workspace plan can include Pipeline, Realtime, Half-Cascade, and Translate independently. Locked modes remain visible in the assistant editor and link to the Plan page. These controls apply when a voice call or Translate room starts; text-only messaging continues through the assistant's text conversation path. ## Pipeline (default) Classic three-stage architecture: **speech-to-text → LLM → text-to-speech**. Choose each stage from the models available to your workspace. * Full control: pick STT, LLM, and TTS independently, including fallback chains per stage. * Widest model and voice selection, best multilingual coverage. * Turn detection via a semantic turn model or voice-activity detection (configurable). **Use it when** you want maximum control over quality, cost, and language behavior. This is the right default for production telephony. ## Realtime A single **speech-to-speech** model listens and speaks directly — no separate STT or TTS. * Lowest latency and very natural prosody (laughter, hesitation, tone). * Voice selection comes from the realtime model. * Turn detection can be robust, semantic, or adaptive when the selected voice mode supports it. Other voice modes manage turn timing automatically. * Fewer knobs: voice library and per-stage fallbacks do not apply. **Use it when** conversational feel matters more than fine-grained control — demos, concierge experiences, voice-first products. ## Half-cascade A hybrid: a realtime model does the **listening and thinking** (text-only), while a separate **TTS voice** does the speaking. Half-cascade has its own text-capable realtime model selection, independent of the full realtime selection. Changing it never changes the separate TTS voice. * Realtime-grade understanding and turn taking, combined with your chosen TTS voice — including cloned or brand voices. * Output voice is configured exactly like in pipeline mode. **Use it when** you want realtime responsiveness but need a specific voice the realtime model doesn't offer. ## Translate A live interpreter for two people. The host chooses both languages and voices, then each speaker joins on the web or by phone. Each person hears the other speaker in their own language. A private guest invitation does not require an account. Translate keeps prompt, flow, tool, knowledge, and memory settings stored for other modes, but does not execute them. See [Translate](/assistants/translate) for room setup, invitations, phone participation, voices, and usage. ## Realtime turn detection For compatible realtime and half-cascade assistants, choose how the assistant decides that the caller has finished speaking: * **Robust (VAD)** — responds after a clear pause. Fast and predictable. * **Semantic** — waits until the caller seems to have completed their thought, even with a mid-sentence pause. **Response eagerness** controls how soon it answers. * **Adaptive** — short acknowledgements such as "mhm" or "okay" do not stop the assistant, while a clear interruption lets the caller take over. You can also tune minimum silence, voice sensitivity, interruption duration, or disable interruptions. Assistants that do not expose these choices continue to manage turn timing automatically. Existing assistants remain on **Robust (VAD)** until you select another mode. ## Reliability behavior If the selected realtime or half-cascade setup is temporarily unavailable, the assistant uses a compatible fallback when possible so the live call can continue. ## Quick comparison | | Pipeline | Realtime | Half-cascade | Translate | | ---------------------- | --------------------- | ------------------------ | --------------------------- | ------------------------------------ | | Latency | Low | Lowest | Low | As phrases are ready | | Voice selection | Full library + clones | Model-native voices | Full library + clones | Compatible library voices + clones | | Per-stage fallbacks | Yes | — | TTS side only | Stops if translation cannot continue | | Multilingual switching | Yes | Model-dependent | Yes (output) | Chosen language pair | | Best for | Production telephony | Natural-feel experiences | Realtime feel + brand voice | Human-to-human interpreting | ## Troubleshooting ### Losing context mid-call The assistant asks for information already given, or seems to miss something said earlier. This is a comprehension issue, not an engine-mode dial. Keep the facts it needs in the [knowledge base](/assistants/knowledge-base) rather than only in the prompt, and in a flow, use `collect` nodes so captured answers become [call variables](/assistants/variables) the rest of the flow can reference instead of asking again. If your plan lets you pick the [language model](/assistants/models-and-voices) yourself, a stronger one also holds a long conversation together more reliably. ### Unnatural conversation flow Awkward pauses, the assistant talking over the caller, or the exchange feeling robotic. Try Realtime or half-cascade for more natural prosody and turn-taking, tune [interruption handling and filler phrases](/assistants/conversation-quality) so waits get bridged instead of going silent, and revisit the turn-detection mode above if the assistant answers too early or too late. ### Repetitive responses The assistant reuses the same phrasing or confirmation across a call. This comes from the prompt, not the engine mode — add an explicit instruction such as "vary your phrasing, don't repeat the same sentence twice" and test a few different conversation paths to see where it recurs. As a starting point: **Realtime** for fast sales or qualification calls, **Pipeline** for support and detailed troubleshooting, **Pipeline with a flow** for lead qualification that needs structured data capture. # Appointment booking Source: https://docs.famulor.io/assistants/example-prompts/appointment-booking Understands why the caller wants an appointment, picks the right type, and books it Pairs naturally with [Calendar & booking](/assistants/calendar-booking): this prompt handles the conversation, and the connected calendar handles availability and the booking itself. ## What it does * Asks why the caller wants an appointment and matches it to an appointment type * Answers a couple of common questions directly * Declines unsolicited sales pitches * Requires a connected calendar to check availability and book This prompt only works with a [calendar integration](/assistants/calendar-booking) assigned to the assistant — that's what gives it `check_availability` and `book_appointment`. ## The prompt ```text theme={null} ## Identity Your name is Sophie, booking assistant for [Company name]. ## Call flow Ask why the caller wants an appointment, then pick the matching type: - Initial consultation → 15 minutes - Follow-up → 30 minutes Before offering a time, call check_availability. Once the caller confirms a slot, call book_appointment with their name and email. If the caller tries to sell you something, politely decline. ## Frequently asked questions Q: Do you have parking? A: [Insert your answer here.] Q: What are your opening hours? A: [Insert your hours here.] ## Guidelines - Ask one question at a time; keep responses short and conversational. - Only end the call once the caller confirms they have what they need. - If asked whether you're a real person, say you're an AI assistant for [Company name] — don't speculate about the underlying technology. ``` ## Set it up Set up a [calendar integration](/assistants/calendar-booking) — or the built-in booking engine — and assign it to the assistant. Paste the prompt above into **System prompt**, replace `[Company name]`, and fill in your real FAQ answers. Update the appointment types and durations to your own, and add more if you offer them. Use the editor's **Test** button and walk through a full booking, including a slot that's already taken. See [Example prompts](/assistants/example-prompts/overview) for more starting points. # First-level support Source: https://docs.famulor.io/assistants/example-prompts/first-level-support Triages a support request, answers common questions, and routes what it can't resolve Combines the routing pattern from [Receptionist](/assistants/example-prompts/receptionist) with a first pass at technical triage — asking for a product or reference number before deciding where the call should go. ## What it does * Asks for a product number on technical issues * Answers a short list of common questions directly * Routes by topic, with a fallback to message-taking if the transfer fails * Declines unsolicited sales pitches If you record calls, turn on the built-in [consent announcement](/assistants/conversation-quality#consent) rather than scripting a recording disclosure into the prompt. ## The prompt ```text theme={null} ## Identity Your name is Sophie, first-level support for [Company name]. ## Call flow If the caller has a technical problem, ask for the product number. If they don't have it, tell them where to find it (for example, on the device label). If the caller tries to sell you something, decline politely. Route by topic: - Wants a quote → transfer to Sales - Wants to speak to a person → transfer to Reception - Emergency → transfer to Management If the transfer fails or no one answers, collect the caller's details for a written follow-up, in this order: 1. Full address 2. First and last name 3. Callback number 4. A short summary of what they need ## Frequently asked questions Q: Do you have parking? A: [Insert your answer here.] Q: What are your opening hours? A: [Insert your hours here.] ## Guidelines - Keep responses short and focused. Ask one question at a time. - You don't answer detailed content questions — that's what routing and the knowledge base are for. - If asked whether you're a real person, say you're an AI assistant for [Company name] — don't speculate about the underlying technology. ## Sensitive topics If the caller raises any of the following, say you can't help with it: legal matters, medical information, political topics, discounts, or detailed quotes. ``` ## Set it up Paste the prompt above into **System prompt**, replace `[Company name]`, and fill in your real FAQ answers. Add [Call transfer](/assistants/built-in-tools#transfers) for each destination, with a matching condition. For anything beyond the short FAQ above, connect a [knowledge base](/assistants/knowledge-base) instead of growing this list indefinitely. Use the editor's **Test** button to run through a technical issue, a sales pitch, and a failed transfer. See [Receptionist](/assistants/example-prompts/receptionist) for the same routing pattern without the technical-triage step. # Intelligent voicemail Source: https://docs.famulor.io/assistants/example-prompts/intelligent-voicemail Captures a caller's request and contact details for a callback, without trying to resolve it Use this when you'd rather have a clean, structured message than let calls ring out unanswered. It asks what the caller needs, confirms it understood, collects contact details in a fixed order, then ends politely. ## What it does * Asks for the caller's concern and confirms it back to them * Collects name and a callback number in a fixed order * Ends the call once it has what it needs — it doesn't try to resolve the request * Refuses to discuss sensitive topics If you record calls, turn on the built-in [consent announcement](/assistants/conversation-quality#consent) rather than scripting a recording disclosure into the prompt. ## The prompt ```text theme={null} ## Identity Your name is Sophie. You take messages for [Company name] when no one is available to answer. ## Call flow Ask what the caller is calling about. Summarize it back and confirm you understood correctly, then say you'll pass it to the right person. Then collect, in this order: 1. First and last name 2. Callback number — confirm it's the best number to reach them on Once you have both, end the call politely. ## Guidelines - Keep responses short and focused — your only job is capturing the request and contact details, not resolving it or giving advice. - If asked whether you're a real person, say you're an AI assistant for [Company name] — don't speculate about the underlying technology. ## Sensitive topics If the caller raises any of the following, say you can't help with it: legal matters, medical information, political topics, discounts, or detailed quotes. ``` ## Set it up Paste the prompt above into **System prompt** and replace `[Company name]`. Add matching fields under [Analysis](/assistants/analysis) — a request summary, name, and callback number — so every message is available as structured data after the call. Add the [Send email](/assistants/built-in-tools#sms-and-email) tool and tell the assistant to send the message to the right inbox before it ends the call. Use the editor's **Test** button and confirm the assistant ends the call once it has a name and a number. See [First-level support](/assistants/example-prompts/first-level-support) for a version of this pattern that also tries a transfer first. # Example prompts Source: https://docs.famulor.io/assistants/example-prompts/overview Ready-to-adapt system prompts for common assistant scenarios Each page below is a complete, working system prompt for a common scenario — not just a snippet. Copy one into a new assistant, swap the placeholders for your own business details, and test it before it takes a real call. The assistant editor offers the same kind of head start from the other direction: **Choose template** applies a ready-made prompt (and sometimes a whole flow) from your workspace's template library. Use these pages when you'd rather see the full text and adapt it by hand. For the craft behind these prompts — how to structure one, write clear tool conditions, and get spoken details right — see [Prompt writing](/assistants/prompt-writing) and [Prompting for speech](/assistants/prompting-for-speech). Greets callers, routes requests to the right team, and takes a message when no one is available. Understands why the caller wants an appointment, picks the right appointment type, and books it. Captures the caller's request and contact details for a callback, without trying to resolve it. Triages a support request, answers common questions, and routes what it can't resolve. Outbound scripts for a sales offer and a payment reminder, with objection handling built in. Every template only needs light editing to go live: your company name, real transfer destinations, and the [tools](/assistants/built-in-tools) it should use. # Receptionist Source: https://docs.famulor.io/assistants/example-prompts/receptionist Routes callers to the right team by topic, and takes a message when no one is available A general-purpose receptionist prompt. It doesn't try to answer every question itself — it figures out what the caller needs, routes it to the right place, and falls back to collecting a message when a transfer doesn't work. ## What it does * Identifies the caller's request and matches it to a destination * Routes with [call transfer](/assistants/built-in-tools#transfers) by topic * Falls back to structured message-taking if the transfer fails or goes unanswered * Stays out of giving advice — its job is routing and data collection, not answering questions If you record calls, turn on the built-in [consent announcement](/assistants/conversation-quality#consent) rather than scripting a recording disclosure into the prompt — Famulor plays and logs it automatically. ## The prompt ```text theme={null} ## Identity Your name is Sophie. You are the receptionist for [Company name]. ## Call flow Understand the caller's request, then route it: - Quote or pricing request → transfer to Sales - Urgent matter → transfer to Management - Everything else → stay with you (Reception) If the transfer fails or no one answers, collect the caller's details for a written follow-up, in this order: 1. Full address 2. First and last name 3. Callback number — confirm it's the best number to reach them on 4. A short summary of what they need ## Guidelines - Use a warm, professional tone. Keep responses short and natural. - Your job is limited to routing and collecting these details — don't give advice or answer questions about the request itself. - If asked whether you're a real person, say you're an AI assistant for [Company name] — don't speculate about the underlying technology. ## Sensitive topics If the caller raises any of the following, say you can't help with it: legal matters, medical information, political topics, discounts, or detailed quotes. ``` For a hard requirement, add the same list under **Blocked topics** in [Guardrails](/assistants/conversation-quality#guardrails) too — guardrails are enforced even if a caller talks the model around the prompt. ## Set it up Paste the prompt above into **System prompt**, then replace `[Company name]` and the transfer destinations with your own. Add [Call transfer](/assistants/built-in-tools#transfers) for each destination, and write a matching condition for when it should fire. Add matching fields under [Analysis](/assistants/analysis) so the address, name, and callback number are saved as structured data after every call. Use the editor's **Test** button to run through a quote request, an urgent matter, and a failed transfer. See [Example prompts](/assistants/example-prompts/overview) for more starting points, including [First-level support](/assistants/example-prompts/first-level-support) for a similar routing pattern built around technical questions. # Sales and collections Source: https://docs.famulor.io/assistants/example-prompts/sales-and-collections Outbound scripts for a sales offer and a payment reminder, with objection handling built in Two starting points for outbound campaigns — a sales offer and a payment reminder — plus a simple framework for handling however the person responds. ## Sales offer ```text theme={null} ## Identity You are calling on behalf of [Company name]. ## Call flow Greet the person, briefly mention [the offer or new product], and offer a [10%] discount if they're interested. If they ask for more detail, offer to schedule a call with a person on the team. If they decline or aren't interested, thank them and end the call politely. ``` ## Payment reminder ```text theme={null} ## Identity You are calling on behalf of [Company name] regarding an outstanding payment. ## Call flow Greet the person and verify their name and the date of their last payment. If they confirm they're able to pay, collect payment details or schedule a callback. If they can't pay now, note the reason and end the call politely. ``` Payment-reminder and debt-collection calls are subject to strict rules on timing, frequency, and required disclosures in most markets. Check [dialer, retries & compliance](/campaigns/dialer-and-compliance) and applicable regulations before running this kind of campaign. ## Handling the response Give the assistant a simple framework for the three ways a call can go: * **Yes** — provide the next detail, or transfer to a person to finalize. * **No** — close respectfully and record the outcome as not interested. * **Maybe** — offer a follow-up call, or send more information. ```text theme={null} ## Guidelines Keep the pitch short and direct — a concise call stays focused and respects the person's time. If asked whether you're a real person, say you're an AI assistant calling for [Company name]. ``` ## Set it up Paste one of the prompts above into **System prompt** and fill in your company, offer, or payment details. Assign the assistant to an [outbound campaign](/campaigns/overview) with your contact list and calling schedule. Add a success criterion and structured fields under [Analysis](/assistants/analysis) — for example whether the person agreed, and any reason they gave — so campaign results are easy to filter. Use the editor's **Test** button to run through a "yes," a "no," and a "maybe" before the first real dial. See the [Outbound playbook](/campaigns/outbound-playbook) for who to call, when to call, and what to measure around these scripts, and [Example prompts](/assistants/example-prompts/overview) for more starting points. # iOS & Android call screening Source: https://docs.famulor.io/assistants/ios-call-screening Turn on Pre-Call Automation so your assistant answers the screening question and waits for a real person Modern phones can screen unknown callers. iPhones on **iOS 26** with Call Screening enabled — and Android phones with Google's call screening — answer the call first and ask for the caller's **name** and **reason for calling** before the phone ever rings. Your assistant hears the screening service's question, not the human it's trying to reach. Famulor handles this for you: turn on **Call screen handling**, and when a screening service asks who is calling, the assistant identifies itself with the details you set, then waits silently until a real person picks up. Only then does the actual conversation start. This mainly affects **outbound calls** your assistant places to mobile numbers. Without a response to the screening question, the call may never be put through. ## Turn it on In the assistant editor, open **Settings → Conversation → iOS / Android Call Screen Handling**. If the assistant uses a conversational flow, the same settings live on the **Pre-Call node** in the flow builder — both places edit the same configuration. Switch on the **Call screen handling** toggle under **Pre-Call Automation**. * **Agent name** — the name the assistant gives when asked who is calling. Left empty, it uses the assistant's voice name. * **Company name** — where the assistant is calling from. Left empty, it uses your workspace name. * **Reason for calling** — one short sentence, for example *"to schedule a follow-up appointment"*. Once enabled, the assistant answers the screening prompt with name, company, and reason, then stays quiet until the recipient accepts the call and speaks. ## Tips * **Keep the reason short** — a single clear sentence passes screening best. * **Avoid double greetings** — the assistant introduces itself to the screener, so make sure its normal opening doesn't repeat the full introduction a second time when the human picks up. ## Test it 1. Enable **Call Screening** on an iPhone running iOS 26 (**Settings → Apps → Phone → Screen Unknown Callers**), or Google call screening on an Android phone. 2. In the assistant header, choose **Test → Call** and dial that number. 3. Check that the assistant states its name, company, and reason, waits for you to accept, and then starts the conversation normally. Still failing the screening? [Contact support](/support) with the assistant's configuration and a transcript of the test call. ## Next steps Structure and tighten the instructions your assistant follows Fine-tune behavior and responses # Knowledge bases Source: https://docs.famulor.io/assistants/knowledge-base Help assistants answer from your documents and websites A knowledge base gives an assistant approved information about your products, policies, opening hours, prices, and other business topics. When a caller asks a related question, the assistant can use the most relevant parts of your content instead of guessing. ## How it works Everything you add is split into short passages and indexed. During a conversation, the caller's question is matched against that index, and only the best-matching passages are handed to the assistant as background for its answer — not the whole document, and not the whole knowledge base. That has one practical consequence: the assistant only ever sees the passages that matched. If the answer to a question is spread across three documents, or the condition that qualifies it sits in a different section than the fact itself, the retrieved passage may be true but incomplete. Writing each topic as a self-contained section is what makes retrieval reliable — see below. ## Create and connect a knowledge base Open **Knowledge bases → New**, enter a name, and add a short description of the content. Upload PDF, DOCX, HTML, or text files. You can also add text, document URLs, or a website source. Each item shows its status. If an item cannot be processed, open it to see what needs to be changed. Use **RAG Search** to ask real customer questions and preview the passages an assistant would find. Improve any document that comes back unclear or contradictory. Select the knowledge base in the assistant editor. No prompt change is required. ## Write content that answers well * Use a clear heading for each topic. * Keep the facts and conditions needed for an answer in the same section. * Put important numbers in text, not only in complex tables. * Remove outdated or contradictory copies. * Prefer one subject per document where practical. * Watch latency on very large knowledge bases, especially many heavy PDFs — converting core content to text files usually processes and retrieves faster. ## Import a website Add a website source with a root URL. You can limit it to selected path prefixes, exclude unwanted sections, and set the maximum number of pages to import. Before saving, choose **Load pages** beside **Website URL** to preview crawlable same-host pages. The preview checks `robots.txt` and available sitemaps, does not index anything, and spends no credits. Review the suggested sections, then explicitly add a path to **Include paths** or **Exclude paths**; suggestions are never saved automatically. Run the import once, or enable automatic synchronization to check the site again at your chosen interval. Only new or changed pages use import credits. Give each auto-refresh source a custom name when you add it. This is the name shown under **Auto Refresh**; it does not change the website URL or connected folder. Choose **Edit** on the source later to rename it or change its refresh settings. Choose **Load pages** on a website source to view paths whose indexing is complete. Loading this list only reads the current index; it does not refresh the website or use credits. For API or MCP access, use `GET /knowledge-bases/{id}/crawl-sources/{sourceId}/pages` or `list_crawl_source_pages`. Both return only ready, indexed pages and never start a refresh or use credits. To run the same pre-save preview through API or MCP, use `POST /knowledge-bases/{id}/crawl-sources/discover` or `discover_crawl_source_paths`. Website imports: * follow pages on the same host, * respect website crawling rules, * work best with pages whose main text is present in HTML, and * skip unsupported or oversized pages. If a site loads all meaningful text only after JavaScript runs, add its content as documents or direct text instead. ## Cloud drive sync Add a Google Drive, OneDrive, Box, Dropbox, or SharePoint folder as a knowledge-base source that stays up to date automatically, the same way a website source does. Connect the account under **[Automations → Connections](/automations/overview)** first if it isn't connected yet — an OAuth sign-in, not a pasted key — then add the folder as a source and pick that connection. SharePoint additionally requires the document library's drive ID — a folder path alone isn't enough to list its contents. Run a sync once, or turn on auto-sync to check the folder again on your chosen interval. Only new or changed files use sync credits. Cloud drive sync is Beta: turn on **Beta Features** under **Settings → Workspace** before the cloud-drive options appear. It is gated by its own plan feature, separately from website crawling, and billed per synced file at twice the per-page website-crawl rate — listed as **KB cloud drive sync file** on the [Usage page](https://app.famulor.io/usage), where you can check your current rates. For API or MCP access, use `GET`/`POST /api/v1/knowledge-bases/{id}/drive-sources`, `GET`/`PATCH`/`DELETE /api/v1/knowledge-bases/{id}/drive-sources/{sourceId}`, and `POST /api/v1/knowledge-bases/{id}/drive-sources/{sourceId}/run`, or the MCP tools `list_drive_sources`, `create_drive_source`, `update_drive_source`, `delete_drive_source`, `run_drive_source`. ## Self-learning FAQ (Beta) The **FAQ (Beta)** tab appears once **Beta Features** is on under **Settings → Workspace**. Question-and-answer pairs can be written directly under **Entries** — a lighter alternative to uploading a document. Independently of that, the **Inbox** collects factual customer questions that did not have a useful knowledge result. Review a proposed answer, edit it, and select **Approve & publish** before it becomes part of the knowledge base. Assistant-generated proposals are never published automatically. Depending on the assistant setting, Famulor can collect only the question, prepare a private draft, or share a clearly tentative answer during the conversation. Select **+** immediately before the **Entries / Inbox** tabs to open a new FAQ and focus its question field. Closing the form keeps your draft. When questions need review, the numbered notice opens all pending questions in the Inbox, clearing its search and status filter. The notice counts questions awaiting review, not unread messages. Use **Search FAQs** in **Entries** or **Inbox** to search all questions, answers and proposed answers in that section. Search ignores case and treats the text literally. Inbox status filters apply before results are split into pages of 25. The page controls show the matching total and let you move to the first, previous, next or last page. The Inbox badge always counts all open entries, including those outside the current search. Unsaved edits remain available when you search, change filters or move between pages in the same knowledge base. For API access, use `GET /api/v1/knowledge-bases/{id}/faqs` with optional `search` (up to 200 characters), `status` (one or more comma-separated statuses), `limit` (1–200, default 50) and `offset` (default 0). For example, `?status=needs_answer,needs_review&search=opening%20hours&limit=25&offset=25` returns the second page of matching open entries. The MCP tool `list_faq_entries` accepts the same search and pagination options; its status filter accepts one value or an array of values. The API returns the matching total in `meta.pagination.total` and the total open count in `meta.pending`; MCP returns `total` and `pending`. ## Availability and limits The number of knowledge bases and access to website import depend on your plan. If your plan's included number of knowledge bases isn't enough, buy additional slots from **Settings → Plan** as the **Extra Knowledgebases** add-on, priced per knowledge base per month. Current per-knowledge-base limits are: | Resource | Limit | | ---------------- | -------------------------- | | Files | 25 files, up to 20 MB each | | URLs | 500 | | Text entries | 50 | | CSV, TSV or XLSX | 1,000 rows and 50 columns | Website imports are billed in credits per new or changed page, at the workspace's **KB crawl / auto-sync page** rate — current rates are on the [Usage page](https://app.famulor.io/usage). The source shows progress and any action needed if the available credit balance is exhausted. ## Tables: CSV, TSV, XLSX and Google Sheets Upload a rectangular table with its column headings in the first populated row. CSV supports comma or semicolon delimiters and quoted multiline cells; TSV uses tabs. Use UTF-8, or UTF-16 with a BOM. Legacy XLS files must be saved as XLSX or CSV. XLSX includes every sheet, including hidden sheets. Google Sheets use the existing Drive connection and include every exported sheet; exports over 10 MB fail explicitly. Existing unchanged sources keep their previous index until the source changes or is reimported. Each result keeps the original cell values, column positions, file, sheet and row. Duplicate or empty headings receive distinct positional labels. CSV row numbers refer to logical records, including blank records; a quoted multiline cell is one record. XLSX references use worksheet row numbers. Search can match an exact identifier or find a row from its description. Quote a whole value to request exact matching. Similar identifiers are never evidence for a missing identifier. Multiple matching rows require clarification. Indexed values are snapshots, not live inventory or prices. Tables are limited to 1,000 records including headings across all sheets, 50 columns, 20 sheets and 6,000 characters per rendered row. XLSX expansion is limited to 32 MB. Merged cells and values beyond the header width are rejected; split separate tables onto separate sheets. The original table file is retained. A failed replacement keeps the previous searchable index and reports the error. Formulas are not recalculated. Cached formula results are clearly marked unverified; missing results and cell errors remain unavailable. Ambiguous date/number text is preserved without guessing a locale. Verify those values in the source before answering. Use `POST /knowledge-bases/{id}/search` or the `search_knowledge_base` MCP tool. Natural-language search returns source references and positional column keys. For complete-sheet filters or totals, pass a table query using those references: rows, count, sum, minimum or maximum; at most five equality/range filters combined with AND. Numeric and date ranges require an explicit type. Numeric totals reject missing, ambiguous, formula or mixed-currency values in matching rows. Results include the number of matching rows and indicate when the displayed rows are limited. Never calculate a full-table total by adding the few excerpts returned by search. Joins, arbitrary expressions, currency conversion and formula evaluation are unsupported. ### Retry an existing document Use **Retry** on a document that failed to process. API clients can send `POST /api/v1/knowledge-bases/{id}/documents` with only `{"document_id":"44444444-4444-4444-8444-444444444444"}`. With MCP, call `add_document` with the knowledge base ID and the same document ID. Omit new content, a file URL, a name and a description when retrying. Both perform the same synchronous retry as the UI. A cloud drive document is downloaded again from its current source, even if its version is unchanged. Only that file is processed and charged at the normal sync rate; other documents are neither refreshed nor removed. Drive access, sufficient credits and an available sync slot are required. The previous searchable index remains usable if processing fails. Folder discovery checks at most 500 files; if the target falls outside that limit, use a smaller source folder. Other source types retry their retained file or website; an uploaded original that has already been purged and has no remote source must be uploaded again. The API returns HTTP 200 with the document ID, processed/total chunk counts and whether text was truncated; MCP returns the same fields. Failures return an error. Creating new content still returns HTTP 201. API access requires `knowledge:write`; MCP accepts `knowledge:write` or the existing `assistants:write` scope. Both require a workspace role allowed to write. # Languages Source: https://docs.famulor.io/assistants/languages Single-language setup, multilingual assistants, and automatic language switching Set the language an assistant listens for, add secondary languages so it can switch automatically as a caller's language changes, and choose a matching voice for each one. ## Setting the primary language Each assistant has an **STT language** that tells the transcription model what to expect. Set it to the language your callers actually speak — it measurably improves recognition of names, numbers, and addresses. For the assistant's *output* language, be explicit in the system prompt: ```text theme={null} Always answer in German, regardless of the language the caller uses. ``` Turn detection supports a **multilingual semantic model** (default) that understands sentence boundaries across languages, plus an English-optimized variant and plain VAD. ## Multilingual assistants For markets where callers switch languages (common in DACH: German, Turkish, English), configure **automatic language switching**: 1. Choose a **multilingual speech-recognition model** so the transcription follows the caller. 2. Add at least one **secondary language**. Automatic switching turns on as soon as a secondary language is present and turns off when the last one is removed. 3. Optionally map a **voice per language** — e.g. a German voice for `de`, an English voice for `en`. When the caller switches, the assistant answers in the new language *with the matching voice*. The assistant also receives a prompt hint to respond in the detected language, so the LLM follows along without extra prompt engineering. Per-language voice choices are available for **Pipeline** and **Half-cascade** engines because those [engine modes](/assistants/engine-modes) use a separate speaking voice. They are hidden for a pure **Realtime** speech-to-speech engine. Switching the editor view to **Voice per language** does not change the assistant by itself. Choose a voice for a language to save an override; languages without one keep the assistant's main voice. Keep the system prompt in one language (ideally English — LLMs follow English instructions most reliably) and state the answering rule explicitly: "Answer in the language the caller speaks." ## API and MCP The same language and voice settings are available through `PATCH /api/v1/assistants/{id}` and the MCP `update_assistant` tool. Use `GET /api/v1/languages` to list supported ISO 639-1 / ISO 639-3 language codes; see the API reference for the request fields. ## Pronunciation across languages The [pronunciation dictionary](/assistants/models-and-voices#speaking-style) applies in every language — useful for brand names that TTS voices mangle differently per language. Tenant admins can define a tenant-wide default map that merges with per-assistant entries. ## Post-call summary language The **Conversation Summary** on a call detail is always written in the assistant's **primary language** — not in the language the call was held in. A German assistant that took a call in English still gets a German summary, so a history list stays readable in one language. Re-evaluating a call (History → Re-evaluate) uses the same rule. Everything else stays in the original language: the transcript, recordings, and extracted analysis fields are never translated. When you change the primary language, only **new** summaries follow it. Use **Re-evaluate** on an older call to regenerate its summary in the new language. ## Documentation vs. call language Note that the platform UI language and the assistant's call language are independent: your team can operate an English dashboard while assistants speak German to customers, and vice versa. The language catalog includes two-letter codes and three-letter codes where needed, such as `ceb` for Cebuano. Available choices depend on both the speaking model and speech recognition. A language in the catalog is not supported by every model; check the choices shown for your assistant. Voice quality, accents, and supported writing systems can vary by language. # Cross-channel customer memory Source: https://docs.famulor.io/assistants/memory Carry consented customer context across voice, email, support, and connected messaging channels Customer memory connects exact, verified identities to one [Audience contact](/audience/contacts) and maintains a compact conversation summary. A customer can therefore continue in another channel without repeating known preferences, agreements, or open items. Memory is available for supported voice, SMS, messaging, email, and helpdesk channels. Anonymous browser visitors and unverified contact details cannot read or update customer memory. A [verified web widget](/web-widget#verify-visitors-by-email-or-sms) can use memory with a current verified email or phone, separate visitor consent, and the selected **Web Chat** or **Web Voice** channel enabled in both workspace and assistant settings. Configure the two channels independently. Web and SMS memory are available only in root workspaces, including a reseller’s own workspace, and are excluded from reseller customer workspaces. This does not restrict ordinary SMS sending. A verified email never verifies a claimed phone number or automatically merges another address. Private and None variable values are never copied into shared contact attributes; only permitted observed conversation data can update memory. ## Identity safety * Verified phone numbers, email addresses, and channel identities are matched only within the current workspace. * Display names and transcript content are never used to merge contacts. * Conflicting identities are never merged automatically. * Business sender identities are not treated as the customer's identity. * Email memory requires authenticated sender verification; the visible sender text or message body alone is not enough. * Anonymous browser calls and chats do not participate in cross-channel memory. ## Configure the workspace Open **Workspace Settings → Data → Memory** to enable memory, select allowed channels, require consent, and choose a rolling retention period. An assistant can narrow the workspace policy under **Assistant → Settings → Privacy → Caller memory** by selecting read channels, write channels, categories, and a scope. Structured contact fields are separate from conversation memory. Under **Assistant → Automations → Variables → Lead attributes**, explicitly select the contact fields that assistant may use; selecting none shares no additional contact fields. Private supervisor consultation and transfer-failure context remain limited to the current call and are not added to caller memory. Built-in caller fields such as name and email follow the assistant's **Caller memory** switch automatically and do not need individual controls. For custom variables created under **Automations → Variables**, use **Caller memory → Remembered variables** to choose one policy per variable: | Variable policy | Behavior | | --------------- | -------------------------------------------------------------------------- | | **None** | Available only during the current call and not retained afterward | | **Shared** | Stored in the consented workspace memory and available to other assistants | | **Private** | Stored only in this assistant's consented memory | Remembered variables use the same consent, channel, retention, staleness, and erasure rules as conversation memory. Lead attributes are already workspace contact fields and therefore remain shared. A **Shared** variable key identifies one workspace-wide datum: use the same key only when every assistant means the same thing by it. Retention and staleness are separate, independently configured settings. **Retention** decides how long a memory record exists at all — every successful update renews the rolling window, or you can choose to keep records until manually deleted; once retention lapses, the record is deleted. **Staleness** is optional and off by default: enable it and choose a number of days without a successful memory update. Stale content is no longer injected or reused. A later eligible conversation can create fresh memory from that conversation, while the old content remains unavailable until retention cleanup removes it. ```mermaid theme={null} stateDiagram-v2 [*] --> Active: memory record created Active --> Active: successful memory update (renews retention) Active --> Stale: no successful memory update for the chosen number of days Stale --> Active: eligible conversation creates fresh memory Active --> [*]: retention lapses (record deleted) Stale --> [*]: retention lapses (record deleted) ``` | Scope | Behavior | | ----------- | -------------------------------------------------------------------- | | `workspace` | One complete summary shared across all assistants | | `assistant` | One complete summary private to this assistant | | `both` | Two complete summaries: one shared and one private to this assistant | Every read, write, consent change, skip, and deletion is audited. **Audience → Memory** lets workspace admins grant or withdraw consent and erase all shared and assistant-scoped memories for a contact. ## API and MCP * `GET/PATCH /api/v1/settings/memory` manages the workspace's allowed channels, consent policy, and retention period. * `GET /api/v1/contacts/memory` lists customer memories. * `GET/PATCH/DELETE /api/v1/contacts/{id}/memory` reads, updates, or erases a contact's memory. An update must provide the current revision; a stale revision returns `409`. * Assistant updates can define the memory scope, read and write channels, allowed categories, and the `none`, `workspace`, or `assistant` policy on each custom variable. Equivalent MCP operations follow the same permissions and return the same customer-facing data as the REST API. Only retain customer context with a lawful basis. Explicitly denied consent always prevents memory reads and writes. Unknown consent also blocks when the workspace requires consent. **Audience → Memory** has a compact search button. Open it to search contact names, phone numbers, email addresses, and currently visible shared summaries across all matching contacts. Search combines with the consent filter and applies before pagination. Private, expired, and stale content is excluded. Closing the search clears it. The list API accepts the optional `search` parameter (up to 200 characters), and the `list_customer_memories` MCP tool offers the same search. # Milian Copilot Source: https://docs.famulor.io/assistants/milian-copilot In-app AI that builds and edits assistants in your workspace **Milian** is the workspace copilot built into the dashboard and assistant editor. Use it to create, explain, and improve your workspace configuration. To connect an external AI application such as Claude or ChatGPT, use the [MCP endpoint](/mcp/overview). ## Where to find it | Surface | What you get | | -------------------- | ------------------------------------------------------------------------------------------------------- | | **Dashboard** (`/`) | A full chat panel in the middle of the dashboard — create assistants, draft automations, ask for help | | **New assistant** | **Generate from prompt** (Suggested) — describe a use case; Milian drafts name, type, and system prompt | | **Assistant editor** | Header **Milian** — improve greeting/prompt/flow; changes appear on the canvas; click **Save** | ## Agent types Milian respects the same modes as the editor: * **Single prompt** — a standalone instruction with no saved conversation flow * **Conversational flow** — built on a saved or existing flow; the flow's Advanced / base system prompt applies to agent steps * **[Translate](/assistants/translate)** — live interpretation between a host and a guest. Ask Milian to create a Translate assistant, choose both languages and voices, and manage its room. Translate requires your plan's support and uses its own settings; recording and asking both speakers for consent are separate choices. ## What you can ask it Milian isn't limited to writing prompt text — describe what you want in plain language from the assistant editor: * **Tone and content changes** — "make the greeting friendlier," "add our 30-day return policy," "add a rule for handling angry callers." * **Troubleshooting** — describe what's going wrong ("calls sound cut off at the start," "it keeps re-asking for the phone number") and Milian proposes a fix to the prompt, flow, or settings. * **Configuration for your use case** — ask which [engine mode](/assistants/engine-modes) or settings fit a scenario such as sales, support, or appointment booking, and Milian recommends a starting configuration. You don't have to start from a blank prompt either: pick a [use-case template](/assistants/overview#use-case-templates) when you create the assistant, then ask Milian to adapt it to your business. Be specific and make one change at a time — "mention a 10% discount for new customers" works better than "add discount info," and small, testable edits are easier to review than a full rewrite. ## Use cases ### Automatic call analysis & reporting Milian can review your workspace's calls on its own, spot patterns and conversion bottlenecks, and save the complete analysis as an Excel file directly to your Google Drive — no manual export needed.