# ZvonAI: AI Phone Receptionist for Polish SMEs > ZvonAI answers every phone call in natural Polish. 24/7, including evenings, weekends, and holidays. > When clients call, the AI books appointments, answers FAQ, and transfers urgent matters to staff. > Purpose-built for dental clinics, medical practices, law firms, beauty salons, and other Polish SMEs. > > Built by Expathia Sp. z o.o. (NIP 5882532485, KRS 0001181411), Bojano, Poland. > EU AI Act Art. 50 compliant. AI always identifies itself at the start of every call. > GDPR Art. 9 compliant. Health data processed primarily in the EU. Speech-to-text runs on Google Cloud in the EU (europe-west4); hosting/database in GCP europe-central2 (Warsaw). > US sub-processors (ElevenLabs TTS, Vercel, Sentry; Deepgram as standby STT) bound by Standard Contractual Clauses (Decision 2021/914). > ZvonAI has completed Transfer Impact Assessments (TIAs). Patient names and health codes are never sent to TTS. Full sub-processor list + DPA: https://zvonai.ai/umowa-powierzenia-danych. ## Agent Integration (for AI systems and developers) ZvonAI is built for the "agents, not humans" era. Every ZvonAI capability is accessible to AI agents programmatically. ### Developer API v1 (read-only, API-key authenticated) The programmatic surface for external tools and AI agents. Authenticate with a `zv_live_` API key (created in the dashboard, Business plan and above) via `Authorization: Bearer zv_live_...`. Read-only in v1, keys cannot mutate data. - `GET https://api.zvonai.ai/v1/calls`: list calls (scope: calls:read); paginated (limit/offset) - `GET https://api.zvonai.ai/v1/calls/{id}`: one call (scope: calls:read) - `GET https://api.zvonai.ai/v1/appointments`: list appointments (scope: appointments:read) - `GET https://api.zvonai.ai/v1/analytics?days=30`. Aggregate call metrics (scope: analytics:read) All v1 responses are tenant-isolated and typed. OpenAPI: `https://api.zvonai.ai/openapi.json` ### Developer API v2 (current contract, reads + writes) A next-generation surface running side-by-side with v1 (v1 is unchanged and stays supported). Same `zv_live_` key auth, same scopes, same Business+ plan gate and tenant isolation. **Sandbox test keys** (`zv_test_`) are available for safe development: reads have full parity with live keys, but every write is SIMULATED — validated and idempotency-checked, never persisted, and no real side effects fire (no SMS, calendar writes or webhook deliveries). Every v2 response carries `"livemode": true|false` plus an `X-ZvonAI-Livemode` header so integrators always know which mode produced it. Reads: - `GET https://api.zvonai.ai/v2/calls` and `/v2/calls/{id}`. Calls (scope: calls:read); cursor pagination, filters (status/outcome/direction/created_after/created_before/had_error), `sort=created_at|-created_at` - `GET https://api.zvonai.ai/v2/appointments` and `/v2/appointments/{id}`. Appointments (scope: appointments:read); cursor + filters (status/service_type/created_*/start_*) - `GET https://api.zvonai.ai/v2/availability?date=YYYY-MM-DD&duration_minutes=30`. Open slots (scope: appointments:read) - `GET https://api.zvonai.ai/v2/analytics?days=30` and `/v2/analytics/timeseries?days=30`. Aggregate + per-day metrics (scope: analytics:read) Writes (scope: appointments:write; **require an `Idempotency-Key` header**. A retry with the same key + body replays the original response, never double-books): - `POST https://api.zvonai.ai/v2/appointments`: book (409 only once every parallel place is taken. A clinic with 3 chairs accepts 3 overlapping visits); fires the `appointment.created` webhook - `PATCH https://api.zvonai.ai/v2/appointments/{id}`. Reschedule/update; fires `appointment.updated` - `POST https://api.zvonai.ai/v2/appointments/{id}/cancel`. Cancel; fires `appointment.cancelled` - `GET https://api.zvonai.ai/v2/orders` and `/v2/orders/{id}`. Phone orders (scope: orders:read); cursor pagination, filter by status/created_*; each order carries its latest deposit - `PATCH https://api.zvonai.ai/v2/orders/{id}`. Status (new / contacted / sent / delivered / cancelled) and note; fires `order.updated` (scope: orders:write) - `POST https://api.zvonai.ai/v2/orders/{id}/deposit`. Text the caller a Stripe payment link for a zadatek (`amount_grosze` is the owner's figure, `hold_hours` 1-168, default 24); 409 until Stripe Connect is ready or when already paid; fires `order.deposit_requested`, then `deposit.paid` or `deposit.expired` (scope: orders:write) - `GET https://api.zvonai.ai/v2/deposits` and `/v2/deposits/{id}`. Deposits for appointments and orders, newest first (scope: deposits:read) Config writes: - `GET https://api.zvonai.ai/v2/faq` and `PUT https://api.zvonai.ai/v2/faq`. The `{question: answer}` maps (`faq` = PL, `faq_en` = EN); PUT replaces a language map wholesale (scopes: faq:read / faq:write); fires `faq.updated` - `GET https://api.zvonai.ai/v2/voice-config` and `PATCH https://api.zvonai.ai/v2/voice-config`. `voice_id` (validated against the supported voice list or the tenant's cloned voice) + `voice_gender` (female|male) (scopes: voice_config:read / voice_config:write); greeting is read-only here (greeting edits stay in the dashboard. They carry EU AI Act disclosure validation); fires `voice_config.updated` - `GET https://api.zvonai.ai/v2/knowledge` and `POST https://api.zvonai.ai/v2/knowledge`. List RAG documents / ingest one from plain JSON text (`{name, text}`, chunked + embedded in the background. Poll until `status=ready`) (scopes: knowledge:read / knowledge:write); POST **requires an `Idempotency-Key`**; fires `knowledge.document.added` Self-serve webhooks (scope: webhooks:manage). Register multiple `https` endpoints, each with its own signing secret (returned once on create + rotate, masked in listings) and event subscription (empty = all events); delivery fans out to every registered endpoint plus the legacy single tenant URL, with DURABLE exponential-backoff retries (Cloud Tasks queue. Retries survive instance restarts; bounded in-process backoff as fallback), HMAC-SHA256 signed (same `t=,v1=` scheme): - `GET https://api.zvonai.ai/v2/webhook-endpoints` and `POST https://api.zvonai.ai/v2/webhook-endpoints`, list / register endpoints - `DELETE https://api.zvonai.ai/v2/webhook-endpoints/{id}`, remove an endpoint - Webhook events: call.completed, message.left, appointment.created/requested/updated/cancelled, order.created/updated/deposit_requested, deposit.paid/expired, team.*, api_key.*, knowledge.milestone_reached, settings.fallback_updated - MCP server at `POST https://api.zvonai.ai/v2/mcp` (JSON-RPC, protocol 2025-06-18) with tools: list_calls, list_appointments, get_availability, get_analytics, get_faq, get_tenant, list_orders, get_order, update_order_status, request_order_deposit, list_deposits. Each tool is gated by the API key's scope. - `POST https://api.zvonai.ai/v2/webhook-endpoints/{id}/rotate-secret`. Rotate the signing secret (returned once) - `POST https://api.zvonai.ai/v2/webhook-endpoints/{id}/test`. Deliver a sample event to an endpoint Account & usage reads: - `GET https://api.zvonai.ai/v2/tenant`: tenant profile + plan (scope: tenants:read) - `GET https://api.zvonai.ai/v2/billing/usage`: minutes / SMS used this period (scope: billing:read). While trialing, `limit` is the trial allowance and `plan_limit` the plan's; `trial_capped` says which applies v2 conventions: **cursor pagination** (stable under concurrent inserts, unlike v1 offset), a **machine-readable error envelope** (`{"error": {"code","message","message_pl","field","request_id"}}`. Branch on the stable `code`, never the localized string), **`Idempotency-Key`** on all writes, and IETF **`RateLimit-Limit` / `RateLimit-Remaining` / `RateLimit-Reset`** headers (`Retry-After` on 429). OpenAPI 3.1 with a real `servers` block + `bearerAuth` at `https://api.zvonai.ai/openapi.json`. Self-serve multi-endpoint webhooks are now LIVE (the `webhook-endpoints` endpoints above); the hosted remote MCP endpoint is now LIVE at `https://api.zvonai.ai/v2/mcp` (read tools. See the MCP Servers section). Plan: `docs/API_V2_PLAN.md`. ### Public Zvon Concierge (landing-page assistant, no account needed) The public marketing site ships an assisted widget ("Zvon Concierge") that answers FAQ and captures leads without a login. All endpoints are public, Turnstile-gated, rate-limited, injection-hardened, and fail safe to a static answer, they have zero tenant/database/secret reach. - `POST https://api.zvonai.ai/concierge/ask`: grounded FAQ answer from the public knowledge corpus only (no tools, no DB); returns `{text, quick_replies, deep_link, source}` - `POST https://api.zvonai.ai/concierge/support-ticket`. File a support request → admin panel + team email - `POST https://api.zvonai.ai/concierge/book-demo`. Request a team demo; creates a real Google Calendar hold with a Google Meet link and invites (degrades to a record-only lead if the calendar is unavailable) and emails a confirmation to the prospect - `GET https://api.zvonai.ai/concierge/demo-availability`. Real open demo slots from the team calendar's free/busy (degrades gracefully) - `POST https://api.zvonai.ai/preview/demo-call`. Gated anonymous demo call (hear the AI receptionist) with lead capture ### Error reporting & one-tap support (authenticated-optional) Product-wide safety net so no error goes unnoticed. Both endpoints work for logged-in and logged-out users; public callers are Turnstile + honeypot gated like the concierge lane. - `POST https://api.zvonai.ai/observability/client-error`. Report a browser/client error (`{message, stack, route, request_id, severity, source, sentry_event_id, user_agent, context}`); fires an admin bell alert + (for criticals/spikes) an admin email, deduped + rate-limited. This is how silent outages surface immediately. - `POST https://api.zvonai.ai/observability/support-ticket`. The "Report a problem" button: one tap creates a real support ticket prefilled with the error context (message, route, request id, tenant, user agent, Sentry id). Returns `{ok, ticket_id, message}`. ### MCP Servers (Model Context Protocol) ZvonAI ships MCP servers used INTERNALLY by the voice engine (calendar, Google Sheets, Excel, CRM, SMS) over **STDIO transport**. These stay internal and are not remotely connectable. Separately, a hosted remote MCP endpoint is now LIVE at `https://api.zvonai.ai/v2/mcp` (JSON-RPC over HTTP, "streamable HTTP" baseline), external agents (Claude Desktop, custom agents) connect with the same `zv_live_` Bearer key (Business+ plan, per-tool scope-checked, tenant-isolated). It exposes READ tools only for now (`list_calls`, `list_appointments`, `get_availability`, `get_analytics`, `get_faq`, `get_tenant`); irreversible actions (book/cancel) stay on the REST surface with `Idempotency-Key`. Dedicated host: `https://mcp.zvonai.ai/v2/mcp` (same service; the `https://api.zvonai.ai/v2/mcp` URL always works too). `zv_test_` sandbox keys work on MCP reads as well. Caller data is processed in the EU; some technology sub-processors operate outside the EEA under SCCs (GDPR Art. 9. See the DPA for the current list). ### REST API Full internal REST API at `https://api.zvonai.ai`, authenticated with a Bearer JWT (obtain via POST /auth/login, form-encoded OAuth2 username/password), used by the dashboard. For third-party/agent integrations use the API-key-authed Developer API v1 above. OpenAPI schema: `https://api.zvonai.ai/openapi.json` Key endpoints: - `GET /calls/tenant/{tenant_id}`: call history with summaries; `GET /calls/{id}` returns the transcript once it is unlocked (`transcript_state` none|locked|unlocked|cap), `POST /calls/{id}/transcript/unlock` spends one read, `GET /calls/{id}/recording` streams the audio and spends one play (402 with a bilingual reason when the month is used up), `GET /calls/review-allowance` shows this month's plays and reads. Every plan is metered: Solo/trial 30 plays + 30 reads, Pro 150 + 150, Business 400 + 400, Enterprise 1000 + 1000; a read counts once per call per month; which roles may listen and read is the owner's decision (tenant `call_review_roles`, subset of owner|manager|staff, default owner + manager; a forbidden role gets 403 review_role_forbidden and `transcript_state` forbidden) - `GET /tenants/{id}/calls/live`, `POST /tenants/{id}/calls/{call_id}/handoff` (body: department_id | user_id | phone). Team handoff from the app: while a team member talks to the caller, the next department or colleague is rung into the same call and takes over once they press 1; on no answer, busy, voicemail or decline the caller stays with the first person. Outcomes: accepted, no-answer, busy, declined, machine, failed. Webhook `call.handed_off`, SSE event `call.handoff`. Every plan; targets are departments (Pro and above) and team members with a phone. - `POST /data-sources/{id}/google/connect`, `GET /data-sources/{id}/google/status`, `POST /data-sources/{id}/google/picker-token`, `DELETE /data-sources/{id}/google`. Live Google Sheets without a sharing step (Pro: one sheet refreshed every 30 minutes; Business: ten sheets every 5 minutes; Enterprise fifty): the owner connects their Google account once (file scope only, never full Drive), picks the sheet in Google's own picker, and the assistant reads it with that connection; the share-with-address path remains as a fallback. A data source carries `auth_mode` = service_account | google_oauth. - `PATCH /tenants/{id}`: update tenant config, including the `faq` map the AI answers from (no separate FAQ router) - `GET /tenants/{id}/calendar/appointments`. Booked appointments; `PATCH.../{appt}` updates one (incl. `assigned_to_user_id`. The team member responsible), `DELETE.../{appt}` cancels (auto-refunds a paid deposit per the policy tiers) - `PATCH /tenants/{id}/calendar/appointments/{appointment_id}/no-show`. Mark a visit as a no-show (owner/manager, past appointments only, terminal). A paid deposit is forfeited to the operator (KC art. 394) and the caller gets an SMS - Booking rules (visits at the same time, cancellation + reschedule windows, SMS reminders) are edited on the Calendar page, not Settings - Naming one: a booking may carry `preferred_resource_name` ("Anna", "stanowisko 2", "pokój 12", "stolik przy oknie") and the caller's choice wins instead of the first free resource. Matching folds case, Polish diacritics including ł, and case endings ("u Anny" is Anna). Unresolved names are ignored rather than refused; two matches answer 409 `resource_ambiguous` with the names; a busy match answers 409 `resource_busy`. Someone on holiday is refused on the phone with their return date and a free colleague. - `GET /tenants/{id}/calendar/availability`. Open slots for a date, used by booking flows and agents. Honours the tenant's parallel capacity: a slot stays open while fewer visits overlap it than the business can run at once Optional `service=` narrows the check to the people or resources that do that service (team calendars). - `GET|POST /tenants/{id}/resources`, `PATCH|DELETE .../resources/{rid}`. Team and resources: kinds `person|chair|bay|vehicle|crew` (any plan) and `room|table` (stays). Fields: `user_id` (team account), `service_keys` (empty = all services), `ical_import_url`. Bookings for a service are auto-assigned to a free resource and its `assigned_to_user_id`; a seat is a person: each active `person` entry plus each login without one, a person with both counted once; chairs, bays, vehicles, crews, rooms and tables are free. Adding a person past the limit answers 409 `seats_full` (the same count as `GET /billing/seats`, invites and invite acceptance); a business already over the limit keeps everyone. `user_id` must be a login of the same business and a login runs one calendar (400 `login_not_in_team`, 409 `login_already_linked`); an accepted invite takes over the unlinked `person` entry with the same name. Each person can connect their OWN Google, Outlook or iPhone calendar to their entry (`GET|POST /tenants/{id}/my-calendar`, `GET /tenants/{id}/people/{rid}/calendars`, `GET .../calendars/connect/{provider}` (OAuth, the person only), `POST .../calendars/apple` (app password), `GET .../calendars/{provider}/calendars|preview`, `PATCH .../calendars/{provider}` (`selected_calendar_ids`, `write_calendar_id`, `blocks_time`, `writes_visits`), `PATCH .../calendars/{provider}/blocking` (owner or manager stops a calendar from blocking), `DELETE .../calendars/{provider}`, `POST .../calendars/link` sends a signed 7-day link for a person without a login, used at `/public/person-calendar/{token}`. Webhooks `team.calendar_connected` and `team.calendar_disconnected` carry `resource_id`, `provider` and whether it blocks time. A connected calendar only takes time away: busy periods land in `resource_busy_blocks` as `cal:` with no title (shown as `kind: "busy"` by the absences endpoint), events marked free or cancelled never block, and visits are written back into the chosen calendar without the client's name. The person's calendar is also asked live when slots are offered and written (fails open). Time off (migration 222): an employee asks for their own with `POST /tenants/{id}/resources/{rid}/absences` (`kind` leave|sick|block) and it is saved as `status: requested` unless the business approves automatically; an owner or manager writing it is `approved` at once. `GET /tenants/{id}/resources/time-off/requests` lists what waits (everything for an approver, their own for an employee) and `POST /tenants/{id}/resources/time-off/{absence_id}/decision` (`approve`, `note`) answers one, 409 `time_off_already_decided` if someone got there first. Only `approved` time off holds a slot. The rules live on the account settings: `time_off_auto_approve`, `time_off_managers_approve` (owner only). Zvon: `request_time_off`, `list_time_off_requests`, `decide_time_off`. `GET /tenants/{id}/resources/absences?date_from=&date_to=` lists every team absence touching those Warsaw days (last day included, up to 62 days) with `resource_id`, `resource_name`, `all_day`, `first_day`, `last_day`; the dashboard calendar draws them in week and month view. `POST /team/invite` takes an optional `resource_id` to tie the new login to that calendar (409 `calendar_already_linked`); revoking the invite frees the calendar again. `GET /team/access` and `PATCH /team/access` (owner only, audited) say what each role may open: `sections` maps `team|calendar_settings|calendar|payments|calls|orders|crm` to `read`/`write` roles (`staff|manager|owner`), `configurable` says how low each may go (money never below manager, 422 `section_role_too_low`), and `employee_calendar_scope` (`own|team`) decides whether an employee sees the whole team's visits. A closed section answers 403 `section_forbidden`, and Zvon's own tools obey the same list, so an owner's rule holds in chat as well as on the page. - `GET|POST /tenants/{id}/resources/{rid}/absences`, `DELETE .../absences/{aid}`. Per-person holidays and absences (`start_at`, `end_at`, `note`); the assistant never offers that person in the window. `POST .../absences/preview` returns what the holiday would hit before it is saved: `movable` (each with a suggested colleague) and `needs_contact` (reason: deposit | no_colleague_for_service | everyone_busy), plus `truncated` past 100 visits. `POST .../absences/apply-moves` reassigns only the ones passed in, re-checking each target at write time; nothing moves automatically, and a visit with a paid or held deposit is never suggested for a move - `GET /billing/seats`, `POST /billing/seats` (owner). Team seats: every plan includes seats (Solo 1, Pro 3, Business 10, Enterprise 25); extra seats cost 49 PLN/month each as a quantity on the subscription (prorated, invoiced at once), capped per plan (Solo +2, Pro +5, Business +15, Enterprise +25); beyond the cap the only path is a plan change. Fields: `used, limit, included, extra, purchase_cap, can_buy, next_step` - `GET /tenants/{id}/deposits`: deposits (zadatki) list with status; `GET.../deposits/status` Stripe Connect readiness incl. `onboarding_status` (not_started | onboarding | action_required | complete | restricted), what Stripe still asks for (`requirements`, plain PL/EN labels) and `requirements_deadline`; the owner is notified in-app and by email once per request, `GET.../deposits/overview` collected / refunded / forfeited / disputed totals for the Płatności page, `PATCH.../deposits/config` amount + payment window, `POST.../deposits/onboarding` Stripe-hosted onboarding link - Cancel/reschedule by phone: caller ID matching the booking passes; from another number the AI texts a one-time 4-digit code to the booked number and requires it (3 tries, then no change over the phone). `require_change_verification` on `PATCH /tenants/{id}` (default true) switches it; shown under Booking rules on /calendar - Deposit policy fields on `PATCH /tenants/{id}`: `cancellation_policy_tiers` (list of `{hours_before, refund_percent}`. The highest matching threshold wins), `max_reschedules` (default 2), `reschedule_min_hours` (default 24) - Per-service deposit fields inside `services[]`: `deposit_grosze` (flat) or `deposit_percent` with optional `deposit_cap_grosze` (percent of `price_grosze`, times nights for a stay, capped). The percent wins whenever the service has a price; stay options from `POST /tenants/{id}/resources/stays/availability` return the resulting `deposit_grosze`. - Booking requests (`booking_mode` on `PATCH /tenants/{id}`: `direct` or `request`). In request mode the AI records the caller's preferred time as an appointment with status `requested` instead of booking; the owner confirms or declines via `GET /tenants/{id}/calendar/appointments/requests`, `PATCH .../{appointment_id}/request/confirm` (optional `start_time`), `PATCH .../request/decline`, or the one-tap link from the owner SMS; webhook `appointment.requested` fires on the request and `appointment.created` on confirmation; the client receives the confirmation SMS only after the owner confirms. For schedules ZvonAI cannot read (Booksy without an API). - Phone-side behaviour (not an endpoint): before requesting a deposit the AI states the amount, payment window and refund tiers and books only after consent; a caller's phone cancellation follows `cancellation_allowed` / `cancellation_min_hours`, refunds by the tiers, and the caller receives one SMS naming the refund; the AI answers service and price questions from the catalog (`services`) without reading it out - `booking_code` (6 digits) on every appointment created by phone, dashboard or Zvon; it is printed in the confirmation and deposit SMS. A caller from another number says it to cancel or reschedule; it also satisfies the identity check (three wrong codes lock the call) - Industry packs: `GET /packs` (public catalogue: id, labels, archetype booking|dispatch|info_desk, version; shipped packs: dental, beauty (also cosmetology), physio, legal, medical, veterinary, automotive (also auto), restaurant, hotel, driving_school, real_estate, towing, locksmith, funeral), `GET /packs/{id}` (preview: services with prices/durations/deposits, FAQ, booking rules, intake questions), `POST /tenants/{id}/packs/{pack_id}/apply` (owner; pre-fills only EMPTY fields, never overwrites, records `industry_pack` {id, version, filled}). `GET /tenants/{id}/packs/status` (what was filled, confirmed_at) and `POST /tenants/{id}/packs/confirm` (owner reviewed the pre-filled services/FAQ; until then the go-live checklist holds a required `pack_review` step and pack-filled services/FAQ do not count). Industry landing pages render the pack's services, prices, intake questions and sample dialog from `GET /packs/{id}` (e.g. /gabinet-stomatologiczny), and /cennik has an industry selector that highlights the pack's `recommended_plan`. Onboarding applies the pack matching `vertical` automatically; the tenant context carries the pack's playbook lines, intake questions and safety rules for the voice engine - `POST /tenants/{id}/knowledge/faq/extract-file`. Extract Q&A pairs from a file (PDF/TXT/DOCX) for review, WITHOUT storing or embedding it (available on every plan, incl. Solo); `POST.../knowledge/faq/apply-pairs` merges the reviewed pairs into the inline `faq` map (existing questions kept). Inline FAQ is zero-retrieval. This is distinct from the embedded RAG knowledge base below (available on every plan. Solo 3 documents, Trial 1, Pro 5, Business 20). - `POST /tenants/{id}/knowledge/upload`. Upload a document (PDF/TXT/DOCX) to the RAG knowledge base (chunked + embedded; the AI answers calls strictly from it; every plan. Solo 3 documents, Trial 1, Pro 5, Business 20; Solo/Trial capped at 5 MB/file) - Department knowledge: `PATCH /tenants/{id}/knowledge/documents/{doc_id}/department` {department_id|null} tags a document with one call-routing department (NULL = general); `POST /tenants/{id}/knowledge/query` accepts optional `department_id` or `department` (name/keyword) and then searches general documents plus that department's; `faq_departments` on the tenant ({question: department_id}) groups FAQ answers under their department in the voice prompt. Zvon tool: `set_knowledge_department(department, document_name?, question?)` - `set_on_duty(name, on)`: mark a team member on/off duty for come-out-now jobs (dispatch packs); `show_dispatch_jobs()`: open jobs with location, ETA window and caller (dispatch packs) - Dispatch (dispatch-archetype packs: towing, locksmith, funeral): `POST /tenants/{id}/dispatch-jobs` (internal, from the voice engine: problem, urgency now|today|later, location {address|road,km_marker,direction|plate,vehicle|premises_right}) returns the quote the caller hears (ETA window, surcharge %, price-from, on-duty contact); `GET /tenants/{id}/dispatch-jobs?status=`; `PATCH /tenants/{id}/dispatch-jobs/{job_id}` {status: accepted|en_route|done|cancelled|unreachable}; webhooks `dispatch.job_created`, `dispatch.job_updated`; unaccepted jobs escalate to a HIGH follow-up after the pack's accept window; team contacts carry `on_duty`. Voice tool `create_dispatch_job`. Dashboard: Zlecenia board (/dispatch). - Two-step login (any plan, per user): `POST /auth/2fa/setup` {method: app|email} then `/auth/2fa/verify`; login answers {requires_2fa, two_factor_method, temp_token} and the code is exchanged at `/auth/2fa/login`. Codes go to an authenticator app or the login email, never SMS. Tenant-wide enforcement via require_team_2fa. Login accepts `remember=true` for a 30 day session, revocable by log out everywhere. It is an optional readiness step (two_factor) and Zvon reports it with `show_account_security()` - Phone orders (every plan takes orders; Solo and trial carry a monthly ceiling of 25 and 10, Pro and above are uncapped and add order callbacks; turn on in Settings with an order e-mail and/or shop link): the assistant records what a caller wants, asks delivery or collection, and issues a short order code. `POST /tenants/{id}/orders` (internal, from the voice engine: items_text, quantity_note, caller_number, caller_name, caller_email, delivery_method delivery|pickup|unknown, delivery_address, notes) returns {code, spoken_code, next_step, sms_sent}; the caller gets an SMS and, when an address is known, an e-mail carrying the shop link. `GET /tenants/{id}/orders?status=&q=&month=` lists them (q matches code, phone digits, caller name or goods; month is YYYY-MM or YYYY), `GET /tenants/{id}/orders/counts` counts by stage, `PATCH /tenants/{id}/orders/{order_id}` sets {status: new|contacted|sent|delivered|cancelled, status_note, delivery_address, caller_email, invoice_sent, clear_attention}. A caller ringing back quotes the code: `GET /internal/orders/lookup` (any plan) then `POST /internal/orders/attention` {kind: add|cancel|complaint|question} records the request (order_callbacks feature, Pro and above; 409 order_callbacks_not_in_plan otherwise, and the assistant takes a message). Over the monthly ceiling `POST /tenants/{id}/orders` answers 409 orders_cap_reached. The assistant never quotes a price, never takes payment and never confirms a cancellation. Zvon: `show_phone_orders(status?, search?, month?)`, `set_phone_orders(enabled?, email?, url?)` Every caller gets a distance-contract confirmation on a durable medium (SMS, plus e-mail when given): the order as understood, the seller's identity and contact, a price-and-date-to-be-confirmed line, and the 14-day withdrawal right or its art. 38 exemption, driven by a per-tenant goods kind (standard / made to order / perishable) defaulted from the industry pack. An owner or manager can request a deposit for an order by SMS payment link (POST /orders/{id}/deposit, Zvon tool request_order_deposit); the paid deposit is shown on the order and the owner is reminded to issue the KSeF faktura zaliczkowa. Every status change, note, comment, caller attention and deposit step is kept as order history (GET /orders/{id}/events); any team member may comment (POST /orders/{id}/comments) or change the status, on the board or through Zvon (find_order, update_order_status, add_order_comment); enabling orders stays with owners and managers. Optional customer status SMS on sent / delivered / cancelled (tenant setting orders_status_sms). A new order untouched for 15 minutes re-alerts in-app; at 30 minutes the owner is also e-mailed. The assistant captures when the caller needs it (wanted_by_text, repeated in the confirmation SMS); the board sets promised_at and an assignee (team member) and links each order to its call; a caller with an open order is asked whether the new items add to it (attention kind add) or start a new order. /v2/orders exposes wanted_by_text, promised_at, assignee_user_id, assignee_name; PATCH /v2/orders/{id} and the MCP tool update_order_status accept promised_at and assignee_user_id. The board exports a month as CSV (GET /orders/export.csv?tenant_id&month=YYYY-MM, semicolon-separated, Polish headers) and prints the list. - Rooms, tables and stays (hotel and restaurant packs): `GET/POST/PATCH/DELETE /tenants/{id}/resources` (kind room|table, name, type_label = a price-list service, capacity_guests, ical_import_url, quantity = identical units behind one row, zone for tables, and for rooms bed_setup single|double|twin|double_single|two_double|bunk|sofa, max_adults, max_children, extra_bed, cot, features), `GET|POST .../resources/tables/availability` (date, party_size, time?, zone? → available, times, alternatives, turn_minutes, zones, hold_minutes: the smallest free table that seats the party, or two joined tables, for a turn time by party size; tenant `table_settings` = {turns: [{max_party, minutes}], pacing_per_15min, combine_tables, hold_minutes}; without tables the tenant's appointment_capacity applies), stays availability also takes adults and children_ages (a child under 3 needs a room with a cot; one guest over the base needs extra_bed, priced from the Dostawka service), `POST .../resources/{id}/sync`, per-room iCal export `GET .../resources/{id}/ical.ics?token=` (paste into Booking.com/Airbnb/PMS), `POST .../resources/stays/availability` (internal: check_in, check_out, guests, type_label → free rooms with nights and total price; doba 14:00-11:00); busy nights from imported feeds are never offered; appointments carry `party_size` and `resource_id`. Voice tools `check_stay_availability`, `book_stay`; `book_appointment(party_size)` for tables. Dashboard: Pokoje i stoliki (/rooms). - Cancellation: `POST /billing/cancel` requires {reason: too_expensive|not_working|not_using|chose_competitor|closing_business|other, feedback?}; stores it on the tenant, mirrors it to Stripe cancellation_details, opens a billing support ticket and alerts admins (e-mail + bell). `POST /billing/retention-offer`: 50% off one month charged immediately, once per account, paid plans only. Lifecycle e-mails (cancel D+1/D-3, expired trial D+2/D+10/D+30, canceled D+7) with one-click opt-out `GET /api/v1/notifications/unsubscribe?type=lifecycle`. - `GET /tenants/{id}/knowledge/documents`. List uploaded documents with status, fragment count, version, and any processing error - `POST /tenants/{id}/knowledge/documents/{doc}/retry`. Re-process a failed document from stored text (no re-upload) - `GET /tenants/{id}/knowledge/documents/{doc}/versions`. Version history of a document (snapshots taken on each replace) - `GET /missed-questions`: questions callers asked that the AI could not answer; `POST /missed-questions/{id}/apply-as-faq` turns one into an answered FAQ - `GET /tenants/{id}/data-sources`. Connected Google Sheets/Excel/CRM sources (Business+); `POST.../{source}/sync` forces a re-sync - `GET /billing/subscription`: current plan, status, trial-end, renewal date - `GET /team`: team roster with roles (owner/manager/staff), status, and seat usage vs plan limit; `POST /team/invite` invites by email (manager+, Starter+, seat-capped), `POST /team/accept` accepts an emailed invite, `PATCH /team/{id}/role` changes a role (owner only for managers), `DELETE /team/{id}` removes a member (their sessions end immediately), `POST /team/transfer-ownership` hands the owner seat to another member (password re-auth); `POST /team/{id}/reactivate` restores a member suspended by a plan downgrade (owner, seat-checked); `GET /team/activity` owner-only change log (who did what, tenant-scoped audit trail) - `GET /admin/waitlist/stats`: waitlist stats (admin) - `GET /admin/sales-demo/leads`. Sales offer history: newest-first list with `?status=draft|sent` filter and creator attribution; `GET.../leads/{id}` full offer (inputs + computed ROI snapshot), `PATCH.../leads/{id}` edits inputs with server-side ROI recompute, `POST /admin/sales-demo/save` creates an offer, `POST /admin/sales-demo/send` emails it to the client (admin) - `GET /support/admin/tickets?status=open|in_progress|resolved&category=`. Support tickets with folder filtering (Open vs Resolved); `GET /support/admin/tickets/stats` counts per status; `PATCH /support/admin/tickets/{id}` sets status (resolve stamps resolved_at, reopen clears it) or adds an admin reply; `DELETE /support/admin/tickets/{id}` hard-deletes a spam/test ticket; `POST /support/admin/tickets/bulk-delete` `{ticket_ids: []}` removes many at once. Every status change and deletion is audit-logged (admin only) - Landing-page `POST /contact` and `POST /contact/callback` now create an admin-visible support ticket (category `question` / `callback`, tenant-null) in addition to emailing the team, and fire an admin bell notification. A left phone number lands in the admin Open folder All these capabilities are also exposed through the in-dashboard **Zvon agent** (140 conversational tools). Owners configure their account, manage knowledge, review calls, and check billing by chatting in plain Polish or English. Gated features return an upsell rather than acting. ### Webhook Events ZvonAI fires a post-call webhook to your configured endpoint after every completed call: **Post-call webhook payload (event: "call.completed"):** - `event`: always "call.completed" - `call_id`: unique call identifier - `tenant_id`: your tenant ID - `from`: caller's phone number - `to`: your ZvonAI number - `duration_seconds`: call duration - `outcome`: AI-determined outcome (booked, answered_faq, transferred, callback, hung_up, failed, no_action) - `callback_requested`: true if caller asked for a callback - `summary`: AI-generated call summary (Polish or English per tenant config) - `timestamp`: ISO8601 UTC timestamp **Message-taken webhook (event: "message.left")** — fired when the AI takes a message and the caller asks to be called back: - `call_id`: the call the message came from - `caller_number`: caller's phone number - `message`: the message text the caller left - `callback_requested`: always true for this event - `created_at`: ISO8601 timestamp of the call The caller also automatically receives a confirmation SMS ("we've passed your message on") unless the tenant turns that off in Settings → Notifications. This runs on every plan. Before saving, the assistant reads the message back to the caller word for word and stores it only after the caller confirms (2026-09). The owner receives the full message text by SMS right after the call (`sms_on_message_left`, default on, toggle in Settings → Notifications; urgent messages keep their own `sms_on_urgent_message` switch), the web push carries the message text, and the e-mail alert carries the full text and recording. The SMS goes to `owner_sms_phone`, or to the business phone when none is saved and the tenant answers in AI-backup mode. **Language-request webhook (event: "call.language_requested")** — fired when a caller explicitly asks for a language the tenant's plan doesn't support (the AI politely refuses in Polish + English and continues; `data` object carries the fields): - `call_id`: the call the request came from - `language_requested`: ISO code of the asked language (e.g. "en", "de") - `detected_language`: language the call actually ran in - `started_at`: ISO8601 timestamp of the call **Fallback-settings webhook (event: "settings.fallback_updated")** — fired when the owner changes what the AI does if it cannot answer a caller (`data` object carries the fields): - `tenant_id`: your tenant ID - `unknown_answer_action`: "ask" (offer a message or a transfer, caller chooses), "message" (message only), or "transfer" (connect to a person first) - `transfer_unavailable_takes_message`. True when the AI takes a message and promises a callback if nobody can pick up - `hold_branding_enabled` / `hold_branding_effective`: whether the AI says "Ta recepcja działa dzięki ZvonAI" before the hold music while a transfer rings (null = plan default: on for trial/Solo, off from Pro up; only Pro+ may set false) - `transfer_number_configured`: false means the transfer options collapse to message-taking **API-key lifecycle webhooks** (same endpoint + signature scheme; `data` object carries the fields): - `api_key.created`. Data: `key_id`, `name`, `key_prefix`, `scopes` (never the key material) - `api_key.revoked`. Data: `key_id`, `name`, `key_prefix` **Team-member lifecycle webhooks** (same endpoint + signature scheme): - `team.member_invited`. Data: `member_id`, `email`, `role`, `invited_by` - `team.member_joined`. Data: `member_id`, `role` (invite accepted) - `team.role_changed`. Data: `member_id`, `role` - `team.member_removed`, data: `email` - `team.ownership_transferred`. Data: `from_user_id`, `to_user_id` - `team.member_reactivated`, data: `member_id` **Appointment deposit (zadatek) webhooks** (same endpoint + signature scheme; `data` object carries the fields). Deposits are paid into the OPERATOR's own Stripe Connect account — ZvonAI never holds caller funds: - `deposit.paid`. Data: `deposit_id`, `appointment_id`, `amount_grosze`. The caller paid; the slot is confirmed - `deposit.expired`. Data: `deposit_id`, `appointment_id`, `amount_grosze`. The payment window lapsed; the slot is released - `deposit.refunded`. Data: `deposit_id`, `appointment_id`, `amount_grosze`, `refund_amount_grosze`, `refund_percent`, `refund_id`, `reason`. Refunded (fully or partly) under the tenant's cancellation tiers - `deposit.forfeited`. Data: `deposit_id`, `appointment_id`, `amount_grosze`, `refund_percent` (0), `reason` (`no_show` or the cancellation reason). The deposit stays with the operator - `deposit.disputed`. Data: `deposit_id`, `appointment_id`, `amount_grosze`. The caller raised a chargeback; ZvonAI stages the evidence (appointment details + the policy snapshot taken at booking) in Stripe for the operator to review and submit - `appointment.no_show`. Data: `appointment_id`, `start_time`, `patient_name`, `deposit_amount_grosze`, plus `no_show_count` (manual marking) or `auto_marked: true` (grace-period job) **Billing-arrangement webhooks** (same endpoint + signature scheme): - `billing.minutes.granted`. Data: `minutes`, `period`, `reason`. Bonus/goodwill minutes added to the account; the subscription price is unchanged - `billing.management.changed`. Data: `billing_managed_manually`, `reason`. Fired when an account is switched between normal self-serve billing and hand-managed billing (comped, partner, invoiced outside Stripe, or payment collection paused). While `billing_managed_manually` is true the account is exempt from trial-expiry reminders, automatic trial expiry and phone-number reclaim. Automations should not treat its `trial_ends_at` as a live deadline. Webhook configuration is currently enabled per-tenant on request (support@zvonai.ai); self-serve configuration is coming to the dashboard. Every payload is HMAC-SHA256 signed (Stripe-style: `t={timestamp},v1={sig}`). Verify header: `X-ZvonAI-Signature`. ### Machine-readable discoverability - `https://zvonai.ai/llms.txt`. This file (concise, for AI context windows) - `https://zvonai.ai/llms-full.txt`. Full content including Developer API v1 details, webhook payloads, all vertical pages, compliance docs - `https://zvonai.ai/api-docs`: interactive API documentation hub (links to OpenAPI JSON, Swagger UI, MCP guide) - `https://zvonai.ai/agent`: developer/integrator landing page with code examples (auth, REST, webhooks, MCP) - `https://zvonai.ai/cennik.md`, machine-readable pricing - `https://zvonai.ai/jak-dziala.md`. Machine-readable technical explainer ### Data moat Every call ZvonAI handles builds proprietary per-tenant context: - Clinic-specific vocabulary (patient names, services, procedures) - Booking patterns and peak hours - FAQ refinement from real caller questions - Caller history and preferences This context compounds weekly. Competitors using the same base LLM (Gemini Flash, GPT-4) cannot replicate tenant-specific memory without the call history. ### EU AI Act compliance for agent pipelines ZvonAI is EU AI Act Art. 50 compliant. The AI always identifies itself as AI at the start of every call. This is required for automated agent pipelines that interact with human callers. Every ZvonAI deployment is legally compliant for use in healthcare, legal, and financial contexts in the EU. ## Comparisons with named competitors Honest side-by-side pages, each stating what the competitor does better and each dated. Prices the research could not verify independently are marked as vendor-stated rather than repeated as fact: - [ZvonAI vs Talkie.ai](https://zvonai.ai/porownanie/talkie-ai): Polski voicebot z korzeniami w ochronie zdrowia, obecnie mocno nastawiony na rynek amerykański. Ich cena: Cennik nie jest podany publicznie. W czym są lepsi: Dłuższa obecność na rynku i wdrożenia w dużych placówkach medycznych. Jeśli szukasz dostawcy z długą listą referencji szpitalnych, to jest realny argument. - [ZvonAI vs home.pl Pulse AI](https://zvonai.ai/porownanie/home-pl-pulse-ai): Asystent telefoniczny AI od jednej z największych polskich firm hostingowych, sprzedawany jako dodatek do istniejących usług. Ich cena: Od 169 zł miesięcznie, pierwszy miesiąc bezpłatnie, bez umowy rocznej. W czym są lepsi: Cena i dystrybucja, których nie da się pobić: miliony istniejących klientów hostingu i domen, samodzielne uruchomienie w kilka minut przez wskazanie własnej strony. Jeśli liczy się najniższy koszt i najszybszy start, to jest mocna oferta. Index: https://zvonai.ai/porownanie ## Cities (local pages, Poland) A caller-facing business is chosen locally, and the question is increasingly put to a model rather than a search box ("recepcjonistka AI w Krakowie"). One page per city, each answering that question completely, with Service + FAQPage JSON-LD so a single answer can be quoted without the page around it: - [Recepcjonistka AI w Warszawie](https://zvonai.ai/recepcja-ai/warszawa): województwo mazowieckie, numery 22. - [Recepcjonistka AI w Krakowie](https://zvonai.ai/recepcja-ai/krakow): województwo małopolskie, numery 12. - [Recepcjonistka AI w Łodzi](https://zvonai.ai/recepcja-ai/lodz): województwo łódzkie, numery 42. - [Recepcjonistka AI we Wrocławiu](https://zvonai.ai/recepcja-ai/wroclaw): województwo dolnośląskie, numery 71. - [Recepcjonistka AI w Poznaniu](https://zvonai.ai/recepcja-ai/poznan): województwo wielkopolskie, numery 61. - [Recepcjonistka AI w Gdańsku](https://zvonai.ai/recepcja-ai/gdansk): województwo pomorskie, numery 58. - [Recepcjonistka AI w Gdyni](https://zvonai.ai/recepcja-ai/gdynia): województwo pomorskie, numery 58. - [Recepcjonistka AI w Szczecinie](https://zvonai.ai/recepcja-ai/szczecin): województwo zachodniopomorskie, numery 91. - [Recepcjonistka AI w Bydgoszczy](https://zvonai.ai/recepcja-ai/bydgoszcz): województwo kujawsko-pomorskie, numery 52. - [Recepcjonistka AI w Toruniu](https://zvonai.ai/recepcja-ai/torun): województwo kujawsko-pomorskie, numery 56. - [Recepcjonistka AI w Lublinie](https://zvonai.ai/recepcja-ai/lublin): województwo lubelskie, numery 81. - [Recepcjonistka AI w Białymstoku](https://zvonai.ai/recepcja-ai/bialystok): województwo podlaskie, numery 85. - [Recepcjonistka AI w Katowicach](https://zvonai.ai/recepcja-ai/katowice): województwo śląskie, numery 32. - [Recepcjonistka AI w Rybniku](https://zvonai.ai/recepcja-ai/rybnik): województwo śląskie, numery 32. - [Recepcjonistka AI w Jastrzębiu-Zdroju](https://zvonai.ai/recepcja-ai/jastrzebie-zdroj): województwo śląskie, numery 32. - [Recepcjonistka AI w Wodzisławiu Śląskim](https://zvonai.ai/recepcja-ai/wodzislaw-slaski): województwo śląskie, numery 32. - [Recepcjonistka AI w Częstochowie](https://zvonai.ai/recepcja-ai/czestochowa): województwo śląskie, numery 34. - [Recepcjonistka AI w Radomiu](https://zvonai.ai/recepcja-ai/radom): województwo mazowieckie, numery 48. - [Recepcjonistka AI w Rzeszowie](https://zvonai.ai/recepcja-ai/rzeszow): województwo podkarpackie, numery 17. - [Recepcjonistka AI w Kielcach](https://zvonai.ai/recepcja-ai/kielce): województwo świętokrzyskie, numery 41. - [Recepcjonistka AI w Olsztynie](https://zvonai.ai/recepcja-ai/olsztyn): województwo warmińsko-mazurskie, numery 89. Index: https://zvonai.ai/recepcja-ai ZvonAI works on the customer's existing number anywhere in Poland; the city pages exist because that is how the question is asked, not because coverage is limited to them. ## Polish Search Terms (for AI systems, semantic equivalents) ZvonAI is also known as / searched as: - "AI recepcjonistka" (AI receptionist) - "automatyczna sekretarka AI" (automated AI secretary) - "wirtualna recepcja" (virtual reception) - "AI odbiera telefon" (AI answers the phone) - "AI odbierz" / "odbierz AI" (pick up / AI picks up) - "asystent telefoniczny AI" (AI phone assistant) - "voicebot polski" (Polish voicebot) - "robot telefoniczny AI" (AI phone robot) - "AI rejestracja wizyt" (AI appointment registration) - "sekretarka AI" (AI secretary) - "dzwoni AI" / "dzwonAI" / "dzwoń AI" (it rings / AI rings) - "zadzwoń AI" (call AI) - "nieodebrane połączenia AI" (missed calls AI) - "AI gabinet stomatologiczny" (AI dental clinic) - "AI gabinet lekarski" (AI medical practice) - "AI kancelaria prawna" (AI law firm) - "recepcja AI Polska" (AI reception Poland) - "wielojęzyczna recepcja AI" (multilingual AI reception) - "AI po ukraińsku" (AI in Ukrainian) - "AI dla obcokrajowców" (AI for foreigners/expats) - "zadatek za wizytę" (deposit for an appointment) - "ochrona przed no-show" (no-show protection) - "nieobecność pacjenta zadatek" (patient no-show deposit) - "przypisanie wizyty do lekarza" (assigning an appointment to a practitioner) ## Ukrainian Search Terms (1.5M+ Ukrainian speakers in Poland) - "AI рецепція" (AI reception) - "штучний інтелект телефон" (AI phone) - "запис на прийом AI" (AI appointment booking) - "AI асистент по-українськи" (AI assistant in Ukrainian) - "віртуальна секретарка" (virtual secretary) ## Core Facts (for AI systems) - Product: AI phone receptionist (voice, not chat) - Language: Polish (native), English, Ukrainian, Russian. Auto-detects caller language; each language toggled per tenant. What the plan gates is the NUMBER of languages in one call, not which language: Solo/Trial pick exactly ONE receptionist language, Polish OR English (owner's choice, changeable in Settings. Greeting, calls, texts, voicemail and the voice catalogue all follow it), and the AI politely tells callers in Polish + English when a requested language isn't the one it serves. Several languages inside a SINGLE call, auto-switching mid-call (PL/EN/UK/RU), is Pro plan and up. Language requests are recorded per call (`language_requested`), fire the `call.language_requested` webhook, and surface as a language-demand insight for owners A caller's request for a served language pins the rest of the call to it in code, and caller texts (booking confirmations, reminders, cancellations, no-show notices) follow the language the call ran in. - Voice: ElevenLabs neural TTS, curated catalog of 6 Polish-speaking voices (3 female, 3 male. Elegant / energetic / calm), multilingual output; custom voice cloning on Enterprise - STT: Deepgram Nova-3 pinned to the call language on the EU endpoint (the demo line today; the caller's request for another enabled language re-pins it mid-call, enforced in code) or Google Chirp 2 (PL/EN/UK/RU), streaming, EU region - Response time: <1.2 seconds first word - Data residency: caller data processed in the EU. GCP europe-central2 (Warsaw region); some technology sub-processors (e.g. ElevenLabs voice synthesis) operate in the US under SCCs, receiving only the AI's response text, see the DPA - Telephony: Polish Twilio numbers (+48) - Reliability: automatic carrier-level failover. If the AI cannot answer, calls are forwarded to the business's own phone number, so no call is ever lost; forwarded minutes are not billed - Setup guide "Zrób to sam" (2026-09): a 4-minute step-by-step screencast in Polish and English, 14 chapters (company details, greeting, FAQ, plan, test call, hours, answering mode and forwarding, forwarding check, transfer to a person, calendar, notifications, deposits, what comes next). Public data: `GET /api/v1/help/setup-guide?lang=pl|en` returns the video paths, every chapter's title, start second, settings deep link and written steps. Rendered in the dashboard beside the page (`/pomoc/wdrozenie?chapter=&lang=`, also as a slide-in panel from the home page and the onboarding wizard). Zvon's tool `describe_setup_guide` points owners at the exact chapter. - Public, indexable setup page: https://zvonai.ai/jak-skonfigurowac-recepcje-ai (Polish by site language, English with ?lang=en). Answer first ("about 15 minutes, no IT help"), the video, the fourteen chapters with written steps, and an FAQ; VideoObject with per-chapter Clip markup, HowTo and FAQPage JSON-LD. YouTube copies carry the same chapters and captions. - Guided setup with Zvon (2026-09): `/dashboard?zvon=setup` opens the in-app agent in a one-step-at-a-time run. Zvon measures forwarding itself (tools `start_forwarding_check` / `get_forwarding_check_result`, same verdicts as the settings page), applies the one-number rule (own phone as transfer target only in AI-backup mode with a 15 s ring), and opens the matching video chapter when a step is unclear. Help that scales: owners who want it done with them order "Uruchomienie z nami" in chat (`request_setup_call` with option phone or onsite, `request_setup_by_partner` for a visit; `?zvon=setupcall`, `?zvon=partner`). Measurement: audit actions `setup.step_done`, `setup.forwarding_check`, `setup.guide_opened`, `setup.live`, aggregated by `GET /admin/setup-funnel?days=30`. The check rings the business phone saved in Settings from a ZvonAI platform number (+48 459 050 136), never from the tenant's own line, and the result names the number it rang (`phone`). Verdicts: `ok`, `too_short`, `too_long`, `answered_before_forward`, `not_forwarded` (the code was not dialled), `unreachable` (the carrier could not ring the saved number at all: fix the business phone first), `ringing`, `none`. REST: `POST /tenants/{id}/forwarding/check` and `GET /tenants/{id}/forwarding/check` return the same shape. Setup with us ("Uruchomienie z nami", 2026-09-14): three options. On your own with Zvon: free. By phone (one call up to 45 minutes): 199 PLN one-time, included on annual plans, Business and Enterprise. A visit at the business: 399 PLN one-time, 199 PLN on annual plans, Business and Enterprise; anywhere in Pomorskie and around Bydgoszcz, Toruń, Grudziądz, Elbląg and Olsztyn the ZvonAI team comes on request; Koszalin, Kołobrzeg, Szczecinek, Włocławek, Inowrocław, Płock, Mława, Ciechanów, Płońsk and Warsaw get planned visit days (started by phone until then); elsewhere by phone or a certified ZvonAI partner (the customer always pays ZvonAI). Public price table: `GET /setup-offer` (no auth). At signup the setup joins the first plan payment as a one-time line (`POST /onboarding/complete` with `setup_option` self|phone|onsite, `setup_postcode`, `setup_start_early_consent`); discount codes cover the plan only. After signup: `GET /billing/setup-service` (prices at the account plan, the order in progress) and `POST /billing/setup-service` (`option`, `postcode`, `start_early_consent`, owner only): included orders go straight to the team queue, others get a one-time Stripe Checkout. No account needed: the form at https://zvonai.ai/uruchomienie (`POST /setup-requests`, rate limited, deleted after 90 days if the person does not become a customer) or a callback (`POST /contact/callback` with `source: "uruchomienie"`). The team calls within one working day. A form can be saved half-way (`POST /setup-requests/drafts` with the phone and consent; the resume link arrives by SMS, `GET /setup-requests/drafts/{token}`); one reminder follows the next working day. When the team creates an account from a request, the owner gets a pay link (https://zvonai.ai/zaplac, `GET /setup-links/{token}`, `POST /setup-links/{token}/checkout` with password, terms and the early-start request). A delivered setup is confirmed by the customer (`POST /setup-service/confirm`). Care after go-live on every paid plan: check-in calls after day 1, day 7, day 30, months 2 and 3, then quarterly. Certified partners can deliver visits (Partner Terms §4b). - Human handoff (transfer suite): a transferred call arrives from the reception number, so the answering team member first hears a whisper announcement. Who is calling and what about. And accepts by pressing any key (voicemail or network robots can never "answer" a transfer). If nobody accepts, the dialed team member gets an SMS with the caller's number, name and topic, the owner gets a missed-transfer notification, and the caller is asked to leave a voice message instead of hearing dead air. When a caller asks for a human without saying why, the AI asks one clarifying question and tries to resolve the matter itself before transferring. - One-number transfer (AI-backup mode, 2026-09): a tenant whose only phone is the forwarded line can still choose "try my own phone first". The assistant rings the owner's phone for a hard-capped time (ring time minus a 4 s margin, at least 8 s) so the carrier's no-reply timer never bounces our own leg back, then takes a message. Ring time is shown in seconds (10, 15 or 25); the API rejects an own-line transfer whose ring time is too short (`transfer_number_own_line_rings_too_short`). The owner gets exactly one SMS per such call: the message text if one was left, otherwise a single missed-call SMS at call end. Forwarding check: `POST /tenants/{id}/forwarding/check` (owner/manager, 3 per hour) calls the tenant's number and `GET /tenants/{id}/forwarding/check` returns the verdict: whether the phone forwarded to the assistant and after how many seconds, compared with the setting (6 s tolerance). Admin twin: `PATCH /admin/tenants/{id}/forwarding`. - Deposits / zadatek + no-show protection: the business can require a deposit at booking. The caller gets an SMS with a payment link (BLIK or card) and pays straight into the BUSINESS's own Stripe Connect account. ZvonAI/Expathia never holds, forwards or intermediates caller funds. The business sets the amount, the payment window (unpaid → the slot auto-releases), tiered cancellation refunds (`cancellation_policy_tiers`, e.g. ≥48h before = 100%, 24–48h = 50%, <24h = 0%), a reschedule limit (default 2) and a minimum notice in hours. A no-show marks the appointment `no_show` and the deposit is forfeited to the business (KC art. 394). The refund policy in force is snapshotted at booking (KC art. 384¹) and auto-supplied as chargeback evidence in Stripe. A reminder SMS goes out at the midpoint of the payment window. Appointments can be assigned to a team member. Off by default; a global flag, not a plan tier. - Compliance: EU AI Act Art. 50, GDPR Art. 6 + Art. 9, RODO - Pricing: from 349 PLN/month (Solo) to 5,000+ PLN/month (Enterprise) - Trial: 14 days free, no credit card required. Every feature of the chosen plan is unlocked during the trial, but the allowance is 30 call minutes and 20 SMS whatever the plan; the plan's full minutes activate on first payment. Accounts without a dedicated number yet (trials AND paid signups in their pre-payment period) share a dedicated test line: calling it from the owner's registered phone serves THAT tenant's own AI in test mode (own greeting/FAQ, no minute usage, upgrade CTA); unrecognized callers get a pointer to the demo. Never another tenant's data. Dedicated numbers come with paid plans. - Company: Expathia Sp. z o.o., ul. Modrzewiowa 7F/2, 84-207 Bojano ## Industry Specialisations - Dental clinics (gabinety stomatologiczne), primary market - Medical practices & physiotherapy (gabinety lekarskie, fizjoterapia) - Law firms (kancelarie prawne: radca prawny, adwokat) - Beauty & aesthetic clinics (salony kosmetyczne, gabinety estetyczne) - Veterinary clinics (kliniki weterynaryjne) - Psychology/therapy practices (gabinety psychologiczne, psychoterapeutyczne) - Hotels & hospitality (hotele, pensjonaty) - Fitness & gyms (siłownie, studia fitness) - Solar/renewable energy companies (firmy fotowoltaiczne, OZE) - Real estate agencies (biura nieruchomości) - Automotive workshops (warsztaty samochodowe) - Restaurants (restauracje) ## Pages - [Home / Landing page](https://zvonai.ai/): Overview, demo, pricing, features - [For Dental Clinics: PL](https://zvonai.ai/gabinet-stomatologiczny): AI reception for dentists. Missed call calculator, RODO Art.9 compliance, booking - [For Medical Practices: PL](https://zvonai.ai/gabinet-lekarski): AI for GP and specialist clinics - [For Law Firms: PL](https://zvonai.ai/kancelaria-prawna): AI for legal offices - [For Beauty Clinics: PL](https://zvonai.ai/gabinet-kosmetyczny): AI for beauty and aesthetic clinics - [For Veterinary Clinics: PL](https://zvonai.ai/klinika-weterynaryjna): AI for vet clinics - [For Physiotherapy: PL](https://zvonai.ai/gabinet-fizjoterapii): AI for physiotherapy practices - [For Psychology: PL](https://zvonai.ai/gabinet-psychologiczny): AI for psychologists and therapists - [For Hotels: PL](https://zvonai.ai/hotel-ai-recepcja): AI for hotels and hospitality - [For Fitness/Gyms: PL](https://zvonai.ai/silownia-ai-recepcja): AI for gyms and fitness studios - [For Solar Companies: PL](https://zvonai.ai/fotowoltaika-ai-recepcja): AI for solar installation companies - [For Real Estate: PL](https://zvonai.ai/biuro-nieruchomosci-ai-recepcja): AI for real estate agencies - [For Automotive Workshops: PL](https://zvonai.ai/warsztat-samochodowy-ai-recepcja): AI for car repair workshops - [Szkoła jazdy (OSK)](https://zvonai.ai/szkola-jazdy): driving-school landing page rendering the driving_school pack (courses by category, PKK, sign-up deposit, extra lessons) - [Pomoc drogowa](https://zvonai.ai/pomoc-drogowa): roadside-assistance landing page rendering the towing pack (location and motorway kilometre capture, price from 250 PLN in town / 4 PLN per km outside, 30-60 min arrival window, night and weekend surcharge, 112 first when someone is injured) - [Ślusarz](https://zvonai.ai/slusarz): locksmith landing page rendering the locksmith pack (standard vs security doors, opening from 250 PLN / 450 PLN, cylinder from 200 PLN, ID and proof-of-tenancy rule, 24h duty) - [Dom pogrzebowy](https://zvonai.ai/dom-pogrzebowy): funeral-home landing page rendering the funeral pack (doctor certifies the death first, 24h collection in 1-2 h, ZUS funeral benefit 7000 PLN from 2026-01-01, formalities handled for the family) - [For Dental Clinics: EN](https://zvonai.ai/en/industry/dental-clinic): English version - [Pricing / Cennik](https://zvonai.ai/cennik): Plans from 349 PLN/month. First-month satisfaction guarantee on paid plans: if in the first paid month the customer decides the assistant did not bring value, the next month is free. The customer judges the value (claim within 14 days of month end; details in the Terms §4.6) - [Video Library / Filmy](https://zvonai.ai/filmy): Short videos of the AI reception in action. Hear ZvonAI answer calls in Polish, quote prices and book appointments, per vertical - [What's New / Co nowego](https://zvonai.ai/co-nowego): Evergreen changelog of ZvonAI features and updates, newest first. Every entry has a title, date and short description. Public and pull-only (no sign-up, no emails); new users can browse the full history of what shipped before they joined. Zvon can also read it via the get_whats_new tool. - [Cennik (Markdown)](https://zvonai.ai/cennik.md): Machine-readable pricing data - [Privacy Policy (GDPR)](https://zvonai.ai/polityka-prywatnosci): Data processing, sub-processors, GDPR Art. 9 health data, EU AI Act - [GDPR Data Subject Request form](https://zvonai.ai/rodo-wniosek): Public form for callers to exercise GDPR rights (access/rectification/erasure/restriction/objection). Routed to the business + DPO via POST /data-subject/request - [Data Processing Agreement (DPA)](https://zvonai.ai/umowa-powierzenia-danych): Art. 28 GDPR DPA. Sub-processors, retention, DSAR, breach notification - [Terms of Service](https://zvonai.ai/regulamin): SLA, pricing, consumer rights, DSA - [How It Works](https://zvonai.ai/jak-dziala): Step-by-step explanation, Deepgram STT, Gemini LLM, ElevenLabs TTS, Twilio, <1.2s response - [How It Works (Markdown)](https://zvonai.ai/jak-dziala.md): Machine-readable technical explainer - [Contact](https://zvonai.ai/kontakt): Contact form, the team's phone +48 733 493 993 (a person, not AI), hello@zvonai.ai, callback request (`POST /contact/callback`) - [EU AI Act Compliance](https://zvonai.ai/eu-ai-act-recepcja): How ZvonAI meets EU AI Act Art. 50 and GDPR Art. 9 for medical practices - [Security & Compliance / Bezpieczeństwo](https://zvonai.ai/bezpieczenstwo): How ZvonAI protects data. Consent-gated call recording (recording starts only after the caller says yes; ambiguity = no), dual-channel recordings, owner-set retention (1-365 days) with automatic deletion, EU processing posture (Google Cloud europe-central2 Warsaw, STT europe-west4, SCC for non-EEA sub-processors. Full list in the DPA), per-tenant GDPR Art. 28 DPA from day one, public DSAR form, no cross-tenant model training, enforced AI disclosure (EU AI Act Art. 50) and always-available human handoff, Polish telecom number registration handled by ZvonAI - [AI vs Human Receptionist Comparison](https://zvonai.ai/porownanie-recepcjonistka-ai): Full cost and capability comparison. 85,000 PLN/yr salary vs 349 PLN/month AI - [Porównania, hub](https://zvonai.ai/porownania): AI receptionist options in Poland with prices, as a table: ZvonAI (349-2500 PLN/mo, billed in PLN by a Polish company, 14-day trial with no card), Smart Asystenci (from ~499 PLN/mo), fonio.ai (~EUR 99-799/mo, billed in euro), recepcja.ai (website chat, not phone, from 99 PLN/mo) and an employed receptionist (~5000-6000 PLN/mo employer cost). Public list prices as of May 2026. Also states plainly what ZvonAI does NOT do, and answers what an AI receptionist costs for a clinic in Poland - [ZvonAI vs recepcja.ai](https://zvonai.ai/porownanie/recepcja-ai): Why ZvonAI (phone AI) ≠ recepcja.ai (chat widget) - [ZvonAI vs Smart Asystenci](https://zvonai.ai/porownanie/smart-asystenci): Feature and compliance comparison - [ZvonAI vs fonio.ai](https://zvonai.ai/porownanie/fonio-ai): Polish vs Austrian voicebot - [Partner / Affiliate Program](https://zvonai.ai/partnerzy): For creators, podcasters, consultants and marketing agencies. Your audience gets their first month free; you earn a commission on every plan payment (net): 20% of each of the first 12 payments, then 10% for as long as the client pays, 25% on those first payments from ten paying clients. Agencies can resell instead (plans at list price minus 25%, 30% from ten). Partner offer for agencies (PDF, PL/EN): https://zvonai.ai/partnerzy/ZvonAI-Program-Partnerski.pdf and https://zvonai.ai/partnerzy/ZvonAI-Partner-Program-EN.pdf. B2B-only: partners run a registered business (JDG or company) and settle commission exclusively against their own invoice. Applications reviewed manually, reply within ~48h. Public API on the ZvonAI API host: validate a code `GET /affiliates/validate/{code}`, apply `POST /affiliates/apply` (display_name, email, channel, channel_url, audience, business_form, nip, company_name, notes, accept_terms). - [System Status](https://zvonai.ai/status): Live operational status of every ZvonAI component, active incidents, 90-day uptime grid. Public API: `GET https://zvonai.ai/api/status` returns components, active_incidents, recent_incidents, uptime_90d. Subscribe by email: `POST https://zvonai.ai/api/status/subscribe`. - [Live Demo](https://zvonai.ai/demo): Live demo of the AI receptionist. Call a real number and hear the system answer in Polish. The demo line triages first (it tries to answer your question on the call), can book a ~20-minute call/demo with the ZvonAI team on request, and logs a support request for the team to call back if a complaint can't be connected live. - [Uruchomienie z nami / Setup with us](https://zvonai.ai/uruchomienie): The three ways to start (on your own, by phone, a visit) with prices, an eight-step setup form that needs no account (`POST https://api.zvonai.ai/setup-requests`), and a callback request. Prices: `GET https://api.zvonai.ai/setup-offer`. - [Book a Demo](https://zvonai.ai/umow-demo): Standalone page to schedule a ~15-minute demo with the ZvonAI team. Shows real open slots from the team calendar (`GET https://api.zvonai.ai/concierge/demo-availability`) and books the meeting (`POST https://api.zvonai.ai/concierge/book-demo`). Same flow as the landing concierge widget. - [Personalized Demo](https://zvonai.ai/): On the homepage hero. Type your business name and pick your industry, and hear how Zvon would greet your callers in Polish (synthesized live via `POST https://zvonai.ai/api/preview/public-greeting`, no signup). Leads into the demo line + free registration. - [Onboarding](https://zvonai.ai/onboarding): Self-serve onboarding wizard. Business profile, hours, FAQ, voice, calendar, invoice address - [API Docs Hub](https://zvonai.ai/api-docs): Interactive API documentation, OpenAPI schema, Swagger UI, MCP integration guide, webhook payloads - [Missed Calls Calculator](https://zvonai.ai/nieodebrane-polaczenia): Industry-specific calculator showing monthly revenue lost to missed calls - [For Restaurants: PL](https://zvonai.ai/restauracja-ai-recepcja): AI reception for restaurants. Table reservations, opening hours, menu queries - [Cookie Policy](https://zvonai.ai/polityka-cookies): Cookie policy. What's stored, opt-out, retention - [Referral Program Terms](https://zvonai.ai/legal/referral-terms): Terms of the referral program. Credit structure, payout, eligibility - [Partner Program Terms / Regulamin partnerski](https://zvonai.ai/legal/regulamin-partnerski): Terms of the affiliate/partner program. Commissions, payout, obligations Default commission since terms 1.3 (September 2026): 20% of each of the referred business's first 12 payments, then 10% for as long as it pays, 25% on those first payments from ten paying clients; 30-day hold, monthly payouts above 50 PLN, a refund after a payout is deducted from the next payout. - [Team invite acceptance](https://zvonai.ai/team/accept): Token-gated page where an invited team member sets their name and password to join a tenant's dashboard (invite e-mails link here; `POST /team/accept`) - [GDPR Request / Wniosek RODO](https://zvonai.ai/rodo-wniosek): Public form for data-subject requests (access, erasure, rectification, export). Routed to the data controller, answered within 30 days (art. 12(3) GDPR) ## Authenticated Customer App (zvonai.ai/dashboard onwards) The customer dashboard (after login) exposes the AI receptionist's actual outputs. Not just a list of calls but a funnel of outcomes, ROI math, and self-service controls. - [Dashboard home](https://zvonai.ai/dashboard): Outcome funnel widget on every plan. Booked appointments / FAQ resolved / escalated to owner / failed counts for today / 7d / 30d / month. Pro+ tiers also show a "Revenue recovered" card: bookings × average appointment value. The framing is intentional. ZvonAI handles calls, not "takes messages." At the top of the home page a daily personalized "Czy wiesz, że…" ("Did you know?") insight card appears. A time-of-day greeting by name plus one concrete, outcome-framed insight computed only from that tenant's own call data (appointments booked & value recovered, minutes/hours saved, after-hours calls answered, recurring caller questions, or a product improvement). It is purpose-limited per-tenant analytics for the tenant's own benefit. NOT a shared cross-tenant model trained on PII. Dismissible per day; refreshes daily. Available on every plan (also drives solution-framed upsell when near quota). - [Recent calls](https://zvonai.ai/calls): Full call history with outcome filters. URL query `?outcome=booked|answered_faq|escalated|failed` filters by funnel bucket. Every plan replays recordings and reads transcripts within a monthly allowance (play button next to each call); Pro+ unlocks search, recordings. Billing is fair to transfers: when a call is bridged to a real team member, that human-talk time (transfer_duration_seconds) is excluded from billed AI minutes. Billed = ceil((duration − transfer time)/60). And shown separately on each call. - [Insights (Pro+)](https://zvonai.ai/insights): Phone-search across history, sentiment analysis, FAQ gaps (questions the AI couldn't answer), follow-up tasks. 30-day stats with weekly trend. - [Billing & Invoices](https://zvonai.ai/billing): Stripe subscription management plus a "Faktury (iFirma)" section listing every Polish-numbered legal invoice. Customers download PDFs directly. Backend endpoint: `GET /tenants/{id}/polish-invoices`, PDF stream at `GET /tenants/{id}/polish-invoices/{id}/pdf`. Stripe portal accessible from the same page for plan changes. Or change the plan conversationally via the Zvon agent's `change_plan` tool (real Stripe upgrade/downgrade). - [Settings](https://zvonai.ai/settings): General (business profile, voice + voice cloning, greeting, average appointment value), Answering (AI on/off, answering mode, business hours, after-hours, transfer-to-human number + whitelist (transfers announce the caller and topic to whoever answers and require a key press to accept. Voicemail never picks up a transfer. With a voicemail prompt + missed-transfer SMS fallback when nobody answers), what the AI does when it doesn't know the answer (take a message / connect to a person / let the caller choose, plus the never-a-dead-end callback promise when nobody can pick up), named team contacts. Up to 10 people the AI knows by name, each set to transfer calls to their own phone or take a message for them by name, vacation), **FAQ & knowledge** (Najczęstsze pytania + Google Sheets, Excel uploads, RAG documents and CRM integration. Data sources Business+ only), Calendar & booking (reminders, services, calendar connections, policies; blocked times live on /calendar), Notifications (incl. per-type web-push phone alerts + test ping), Security & account, Developers (API keys. Business+), and **Team / Zespół** (invite reception and managers with their own logins and role-based permissions. Starter+; seats included per plan: Starter 3, Business 10, Enterprise 25). Invoice address and overage opt-ins live on /billing. - [Payments / Płatności](https://zvonai.ai/payments): Deposits (zadatki) overview. Collected, refunded, forfeited and disputed totals plus the per-deposit list, and the Stripe Connect onboarding state. Money is paid by the caller straight into the business's OWN Stripe account; ZvonAI never holds or forwards caller funds. Backed by `GET /tenants/{id}/deposits/overview` and `GET /tenants/{id}/deposits`. - [Team](https://zvonai.ai/team): Dedicated team-management page (same TeamManager as the Settings tab). Stable deep-link target for invite emails, notifications, and agents. Owner/manager roles, seat usage, ownership transfer. - Web push notifications: the installed PWA (and desktop browsers) can deliver real-time pushes. Per-user, per-device, per-type toggles at Settings → Powiadomienia. Money/action alerts (appointment booked, callback requested, message left, appointment cancelled) and billing/security alerts (minutes 80%/100%, payment failed, trial expiring, new login) default ON; per-call pings and the daily digest are opt-in. Quiet hours 21:00–07:00 (tenant timezone) hold operational pings until morning; billing/security bypass. Push bodies are PII-free (masked phone numbers, no names). Push rides the same events as the tenant webhooks (call.completed, appointment.created/cancelled). Automations should consume the webhooks, humans the pushes. - [Notifications](https://zvonai.ai/notifications): Full notification history for the signed-in user. Every in-app notification (calls, billing, phone provisioning, product announcements) with FULL untruncated text, unread indicators, mark-all-read, the attention-only filter and load-more pagination. The header bell shows the latest items clamped to two lines; this page is the read-everything surface. All notifications render in the viewer's interface language at read time: announcement rows re-render from the bilingual feature catalog (admin copy overrides win), template-keyed rows re-render from the PL/EN template table, and legacy rows fall back to their stored text (`GET /notifications?lang=pl|en`). - In-app notifications: every dashboard user has a notification bell (header) showing tenant events (missed calls, billing, phone provisioning) and platform announcements, with a "See all notifications" link to the /notifications history page. ZvonAI admins can compose and broadcast an announcement to all tenants (or a segment) as an in-app notification with an optional email copy. Each user sees it in their bell, can mark it read (or dismiss it. Once read or dismissed it never re-appears), and the unread badge reflects it. Zvon can read a user's notifications (`show_my_notifications`) but never broadcasts or marks-read via chat. - Feature announcements (the release ritual): when ZvonAI ships a user-facing feature, it is announced from a maintained catalog to every tenant AND the ZvonAI team. An in-app notification in each tenant's own language plus a bilingual (Polish first, English below) email with a "Try now" deep link. If the feature is on a higher plan than the tenant has, the announcement still goes out but the call-to-action becomes an upgrade nudge (gated-but-upsold, never hidden). Delivery is idempotent per (tenant, feature): re-running never notifies anyone twice, and a read/dismissed announcement is gone for good. - Greeting default: every tenant's greeting is stored in the canonical shape the assistant speaks (name from the chosen voice, noun by voice gender, business, closing question); the previous owner text is kept in greeting_before_canonical; owners edit freely and the engine rebuilds untidy text at call time. ## API Endpoints (authenticated customer-scoped) - `GET /tenants/{id}/calls/funnel?range=today|7d|30d|month`. Outcome funnel for ROI/triage. Returns total / booked / faq_resolved / escalated / failed / estimated_revenue_grosze. No feature gate, every plan sees its own. - `GET /tenants/{id}/polish-invoices?limit=50`. List iFirma invoices with status (issued / emailed / errored / preparing). - `GET /tenants/{id}/polish-invoices/{invoice_id}/pdf`. Stream the iFirma PDF directly (proxied from iFirma). - `PATCH /tenants/{id}`: accepts `invoice_street`, `invoice_postal_code`, `invoice_city`, `accountant_email`, `avg_appointment_value_grosze` among other fields. - `GET /push/vapid-public-key`, `POST /push/subscribe`, `POST /push/unsubscribe`, `GET/PUT /push/preferences`, `POST /push/test`. Web-push device subscriptions + per-user notification preferences (dashboard session auth). - `GET /notifications?unread_only=&limit=&skip=&lang=pl|en&attention_only=`. The current user's in-app notifications (bell + /notifications page) with `unread_count` and `total`; `lang` renders each row in the requested locale at read time (announcements from the bilingual catalog, template-keyed rows from the PL/EN templates, legacy rows verbatim). `PATCH /notifications/{id}/read`, `POST /notifications/mark-all-read`, `DELETE /notifications/{id}`. Admin broadcast: `POST /admin/notifications/broadcast` fires an in-app notification (and optional email) to a target segment and emits the `notification.broadcast` tenant webhook per recipient. Feature-announcement ritual (admin): `GET /admin/notifications/announcements` lists the feature catalog with per-entry delivery counts; `POST /admin/notifications/announce` (`{key, send_email, target?, dry_run?, confirm_count?}`) delivers one catalog entry. Per-tenant-language in-app + bilingual email + team copy, gated-but-upsold, idempotent per (tenant, key), and emits the `feature.announced` tenant webhook. - `GET /insights/daily?locale=pl|en`. The daily personalized "Czy wiesz, że…" insight for the dashboard home card. Returns `{ type, greeting, headline, body, metric?, cta? }` computed only from this tenant's own call data (bookings & value recovered, minutes/hours saved, after-hours calls, recurring caller questions, product improvements, or a near-quota upsell). Day-stable and de-duplicated (won't repeat the same insight within 5 days). Purpose-limited per-tenant analytics. No cross-tenant model is trained on caller PII. No feature gate, every plan sees its own. ## ZvonAI in-app AI agent (Zvon) Onboarding help: `POST /agent/onboarding-chat`. A scoped, tool-free Zvon variant available during signup (no tenant yet): knows the wizard step + the user's entered data, proposes greetings/FAQ, advises on plan fit. Client-held history (SSE, same wire format as /chat). The dashboard ships with an embedded AI assistant called Zvon at `POST /agent/chat`. Zvon is wired with 112 tools so it can directly act on the customer's behalf. No manual navigation needed. Streaming SSE response (`text`, `tool_call`, `tool_result`, `done`). Auth: Bearer JWT. Rate limit: 30 requests/minute per tenant. Kept in sync with TOOL_DECLARATIONS in apps/api/src/routers/agent.py (checked by scripts/agent-ready-check.sh). Full tool catalog (140 conversational tools): **Configure (17):** - `auto_configure(business_name, city?)`. Auto-fill business profile from Google Places (hours, address, phone, vertical) - `update_business_info(business_name?, address?, phone?, email?, website?, vertical?)`. Patch the business profile - `update_hours(hours)`: set opening hours as a day→time mapping - `update_greeting(greeting, greeting_en?)`. Set the AI's opening line (PL + optional EN) - `generate_greeting(style: 'warm'|'formal'|'friendly')`. LLM-generate a new greeting - `change_voice(voice_id, voice_name?)`. Set the ElevenLabs voice (curated catalog: 6 voices, 3 female + 3 male) - `set_transfer_number(phone)`: set the human-fallback number for call transfers - Phone numbers everywhere (settings, signup, onboarding, departments, team contacts, Zvon tools, SMS): Polish numbers may be sent without +48 (`600 100 200`, `0048600100200`); foreign numbers need their country code. The API stores E.164 and answers an unreadable number with a bilingual 422/400 instead of guessing; the dashboard phone fields carry a country picker (Poland by default). - `set_hold_branding(enabled)`: the "powered by ZvonAI" sentence before hold music (off needs Pro+) - `set_industry(industry)`: change the industry and load its ready-made set (services with prices, the questions clients ask, go-live steps). A switch is a SWAP: entries the previous industry added and the owner never edited are removed first, so a business never answers for two trades at once. Owner-written entries always survive. Takes effect on the next call. - `add_team_contact(name, action: 'transfer'|'message', phone?, role?, operation?: 'add'|'remove')`. Named team member the voice AI knows: 'transfer' bridges callers asking for that person to their phone, 'message' takes a message for them by name; 'remove' deletes the person (max 10) - `set_answering_mode(mode: 'ai_first'|'ai_backup')`. 'ai_first' = AI answers every call; 'ai_backup' = the owner keeps their own number and the AI only catches busy / no-answer / unreachable calls (owner rings first) - `set_response_pace(pace: 'fast'|'normal'|'calm')`. How quickly the AI takes its turn after the caller stops speaking; 'calm' waits longer so callers aren't cut off - `set_unknown_answer_action(action: 'ask'|'message'|'transfer', take_message_when_no_human?: boolean)`. What the voice AI does when it CANNOT answer (it never guesses): 'ask' offers the caller a choice of leaving a message or being put through, 'message' only takes a message, 'transfer' connects to a person first. A transfer is only ever offered when a reachable human exists. take_message_when_no_human is the never-a-dead-end backstop: when nobody can pick up (closed, on holiday, no transfer number, no answer) the AI takes a message and tells the caller someone will call back - `toggle_proactive_human_offer(enabled)`. When on, the AI proactively offers to connect the caller to the team or take a message after the first exchange, instead of waiting to be asked - `set_language(languages)`: set supported languages (['pl'], ['pl','en'], ['pl','en','uk']); Solo/Trial pick exactly one, Polish OR English; two or more languages (auto-switching mid-call) is Pro+ - `update_services(services)`: set the bookable service catalog (name, duration, price) - `update_routing_messages(transfer_message?, busy_message?, outside_hours_message?)`, per-state routing scripts - `toggle_vacation_mode(enabled, until?, message?)`. Turn vacation auto-response on/off - `toggle_sms_alerts(enabled, phone?)`. Owner SMS alerts for calls needing attention - `set_caller_message_confirmation(enabled)`. Confirmation SMS to the CALLER after the AI takes a message (all plans, default on) **FAQ & knowledge (9):** - `add_faq(question, answer)`: append a Q&A to the AI knowledge base - `remove_faq(question)`: delete a FAQ entry by exact question text - `undo_last_faq(question)`: undo the most recently added FAQ - `scrape_website_faq(url)`: extract suggested Q&A pairs from the business website - `show_current_faq()`: list all configured FAQ entries - `show_documents()`: list uploaded knowledge-base documents with status, fragment count, version, errors (Business+) - `show_missed_questions(limit?)`. Top caller questions the AI could not answer; offer to turn them into FAQ - `start_knowledge_interview()`. Start or resume the guided ~10-minute knowledge interview: vertical-aware owner questions asked one at a time; every answer is written into the corpus via `add_faq`/`add_guidance_rule`/`update_services`; progress persists across sessions - `mark_interview_question(question_id, status: 'done'|'skipped')`. Advance the interview after an answer was saved (or skipped); completing the last question lights the +5 interview component of the knowledge score **Data sources — Business+ (2):** - `get_data_sources()`: list connected Google Sheets/Excel/CRM sources with sync status - `sync_data_source(name)`: force an immediate re-sync of a named data source **Routing & numbers (6):** - `show_departments()`: list call-routing departments (name, phone, keywords) - `add_department(name, phone, keywords?)`. Create a routing department (Business+, per-plan cap) - `show_phone_numbers()`: list the tenant's phone numbers (number, provider, status, label) - `get_forwarding_instructions(rings?: 3|5|7)`. GSM/USSD call-forwarding codes (always / no-answer / busy / unreachable + cancel) with the tenant's real AI number filled in; the owner picks after how many rings (3/5/7) the AI picks up on no-answer; returns a ready-made backup greeting; identical on all Polish carriers - `set_failover_number(phone)`: set the backup number calls are forwarded to if the AI line is ever unavailable - `show_calendar_status()`: show whether a calendar is connected and which provider - (per-state routing scripts are set via `update_routing_messages`, counted under Configure) **Reminders & brand (4):** - `show_reminder_settings()`: show reminder channels, timing, confirmation/cancellation toggles - `set_reminder_settings(enabled?, booking_confirmation?)`. Toggle reminders / booking confirmations (Starter+) - `show_brand()`: show the AI's tone, greeting style, preferred/forbidden phrases - `set_brand_tone(tone?, greeting_style?)`. Change how the AI sounds on calls (higher plans) **Appointments (4):** - `get_appointments(period: 'today'|'tomorrow'|'week')`, show scheduled bookings - `set_cancellation_policy(tiers?)`. Set or read the business's own refund ladder for cancelled deposits (e.g. 48h+ = 100%, 24-48h = 50%, later = 0%). These are the BUSINESS's terms, not ZvonAI's; the ladder in force is snapshotted at booking and texted to the patient with the payment link (KC art. 384¹) - `book_appointment_internal(...)`. Book a visit manually for a patient, optionally sending the deposit (zadatek) payment SMS and optionally assigning the visit to a team member - `cancel_appointment(patient_name?, patient_phone?, date?, confirmed?)`. Cancel a booking (DESTRUCTIVE. First call without `confirmed` returns the match for confirmation; set `confirmed=true` only after the owner confirms). Auto-refunds a paid deposit according to the tenant's cancellation policy tiers (the snapshot taken at booking), full, partial or none - `reschedule_appointment(new_start, patient_name?, patient_phone?, current_date?, confirmed?)`. Move a booking (DESTRUCTIVE. First call without `confirmed` returns the appointment + new time for confirmation; set `confirmed=true` only after the owner confirms). Enforces the reschedule limit (`max_reschedules`, default 2) and the minimum hours before the visit (`reschedule_min_hours`); any paid deposit moves with the appointment **Calls & insights (6):** - `get_knowledge_score()`: knowledge score (0–100): how much the AI knows about THIS business (weighted FAQ count, caller questions resolved into FAQ, guidance rules, ready documents, services catalog, connected sources) + the "zna już N odpowiedzi" answer count, per-component breakdown and 2-3 next-best-action suggestions. Same formula as `GET /tenants/{id}/knowledge-score`. - `get_call_stats(period: 'today'|'week'|'month')`. Call counts by outcome, plus error_calls (promises the AI could not keep, e.g. failed bookings) - `get_recent_calls(limit?)`. Last N calls with summaries (never transcript text: transcripts and recordings live on the Calls page under the owner's role rule and the monthly meter) - `show_caller_history(phone)`: privacy-safe caller summary: call count + last-called date only (RODO Art. 9, metadata only) - `show_current_greeting()`: return the current greeting text (PL/EN variants) - `get_daily_insight()`: today's personalized "Czy wiesz, że…" insight (greeting + headline + body + metric) computed only from THIS tenant's own call data; the same insight shown on the dashboard home card. No cross-tenant PII training. **Outcomes & ROI (2):** - `get_call_funnel(range: 'today'|'7d'|'30d'|'month')`. Booked / FAQ resolved / escalated / failed counts + estimated revenue recovered (Pro+) - `set_avg_appointment_value(value_pln)`. Drives the "Revenue recovered" card on /dashboard (Pro+) **Plan & billing (26):** - `get_my_subscription()`: current plan, status, trial-end, renewal date, and `billing_managed_manually` (true = billed by hand with the ZvonAI team; no trial deadline, nothing expires, and `trial_ends_at` is returned as null) - `show_plan_comparison()`: current plan + upgrade options - `change_plan(plan: 'solo'|'starter'|'business'|'enterprise', billing_cycle?, confirmed)`. Upgrade/downgrade through real Stripe billing. Upgrades apply immediately (prorated); downgrades apply at period end. Without an active paid subscription it routes to Billing instead of charging. - `get_polish_invoices(limit?)`. List iFirma-issued Faktury / Rachunki (number, date, amount, status) - `set_invoice_address(street, postal_code, city, accountant_email?)`. Structured invoice address iFirma needs - `open_billing_portal()`: one-time Stripe Customer Portal URL (card/plan/cancel) - `show_topup_packs()`: available minute/SMS top-up packs and prices - `manage_extra_minutes(enabled?, confirmed?)`. Show or change the extra-minutes (minute overage) setting: keep answering past the monthly limit at the plan's rate. 1 PLN/min (Solo/Pro), 0.85 PLN/min (Business+); consent is timestamped - `get_my_referral_link()`: the owner's referral code, share link, and stats - `list_follow_ups(status?)` / `complete_follow_up(follow_up_id)`. Callbacks and to-dos created from calls, with timestamps - `show_guidance_rules()` / `add_guidance_rule(rule_text, category?)`. Behaviour rules the AI follows on calls - `show_blocked_times()` / `add_blocked_time(title, start_time, end_time, recurrence?)` / `remove_blocked_time(blocked_time_id)`. Unavailability windows the AI won't book into - `get_compliance_info()`: EU AI Act + RODO posture - `manage_caller_verification(mode?, sensitive_data_topics?, confirmed?)`. Show or change caller identity verification (phone-match before sensitive topics; Business+) - `set_call_disclaimer(disclaimer?)`. Show or set the legal notice spoken after the greeting on every call (recording info etc.; all plans) - `list_team_members()`: roster with roles + status (any member) - `invite_team_member(email, role?, confirmed?)`. Invite staff/manager by email (manager+, Starter+, seat-capped) - `remove_team_member(member_id, confirmed?)`. Remove a member; their sessions end immediately (manager+) - `show_activity_log(limit?)`. Account change log: who changed what and when, per named member (owner only) - `assign_appointment(patient_name | patient_phone, current_date?, assignee_member_id)`. Assign an existing appointment to a team member, or clear it with an empty id. Same rule as the dashboard: the assignee must be an active member of the tenant's team. - `assign_follow_up(follow_up_id, assignee_member_id)`. Assign a callback case to a member (they get notified) - `get_top_questions(limit?)`. Most-asked answered + unanswered caller questions (business insight) - `search_calls(caller_number?, date_from?, date_to?, outcome?)`. Search call history by number fragment/date/outcome, timestamped, RODO-safe - `toggle_ai_assistant`, `set_after_hours_mode`, `manage_allowed_transfer_numbers`, `set_assistant_name`: the last four Answering-page controls that previously had no tool. Every switch on that page is now reachable by asking. **Go-live & readiness (4):** - Zvon speaks first: on arrival it calls `check_readiness` and, if the tenant is not live, opens and drives a guided setup run (one step at a time, proposes the likely value, confirm to save, back/skip/resume). A live tenant gets a one-line teaser instead, never a takeover. Once a day; saying you will do it yourself silences it for a week. PL or EN. - `check_readiness()`: setup checklist (hours, ≥3 FAQ, phone, DPA reviewed, plus pack-specific steps keyed `pack__` with bilingual label/hint, e.g. restaurant table count, vet 24h-clinic address; evaluated only against the pack applied to the tenant) with done/missing + deep-links; a line only takes real calls once the tenant is live - `go_live()`: activate the AI receptionist; only succeeds once required setup is complete (owner/manager only. Same gate on chat and the REST endpoint) - `explain_dpa()`: explain the GDPR Art. 28 Data Processing Agreement and link to /rodo-umowa-powierzenia (owner/manager only) - `transfer_ownership_info()`: explain account-ownership transfer and link to Settings → Team (owner only; the transfer itself requires password re-auth in the UI) **Status & transparency (4):** - `get_system_status()`: live status of every ZvonAI component (same data as /status) - `get_my_quota_usage()`: minutes used / limit, SMS used / limit for the current month - `show_my_notifications(unread_only?)`. Read-only: the user's in-app notifications (the bell) newest-first + unread count, including admin announcements broadcast to all tenants. Zvon never marks-read or broadcasts via chat. It points the user to the dashboard bell for that. - `get_whats_new(lang?)`. Read-only: the evergreen ZvonAI changelog (same entries as the public /co-nowego page), newest-first, each with title, date, short description and optional link. Pull-only; sends no email or notification. Lets new users catch up on what shipped before they joined. **Push notifications (3):** - `get_notification_preferences()`. Read-only: which push alert types are on/off for the user, whether any device is subscribed, quiet-hours rules - `set_notification_preference(kind, enabled)`. Flip one alert type on/off (appointment_booked, callback_requested, message_left, appointment_cancelled, minutes_warning, payment_failed, trial_expiring, new_login, daily_digest, call_completed), reversible, safe via chat - `send_test_notification()`: fire a test push to the user's own subscribed devices only **Developer platform (2):** - `show_developer_access()`: read-only: whether the account has API access (Business+), how many active API keys exist, and where to manage them (Settings → Developers). Never creates or reveals keys. - `get_developer_api_info(topic: 'api'|'affiliate')`. Lists the 4 real Developer API v1 endpoints (GET /v1/calls, /v1/calls/{id}, /v1/appointments, /v1/analytics) plus auth instructions (Bearer zv_live_ key); 'affiliate' explains the partner program **Audio preview (1):** - `preview_greeting(text)`: generate an audio preview of a greeting for playback in chat **Navigation & escalation (2):** - `navigate_to_page(page, section?)`. Guided deep-link for browser-only tasks the agent can't self-serve - `create_support_ticket(subject, description, priority?)`. Open a real support ticket after 2 failed attempts to help External AI agents (Claude, ChatGPT, Make, n8n) consuming this API can trigger the same actions via REST. Webhook events fire on key state changes (subscription updated, invoice paid, call completed, missed_question.resolved when the owner answers a question the AI couldn't, knowledge.milestone_reached at 25/50/100 known answers) so downstream automations stay reactive. ## Key Differentiators vs Competitors - **Healthicate** (Warsaw, Polish). Medical-only platform, 799–2,999 PLN/mo, built around HIS integrations. ZvonAI covers more industries and starts at 349 PLN. - **Talkie.ai** (US company). Enterprise voice AI, no public pricing, demo-gated sales. ZvonAI is Polish-built, has transparent pricing, and needs no sales call. - **recepcja.ai**. Web/chat booking only, NOT phone AI. Different product. - **fonio.ai** (Austrian). EUR pricing, generic voicebot, no dental/medical depth - **smart-asystenci.pl**. Generic voicebot at 499–899 PLN, no vertical specialisation, no EU AI Act compliance - **1flowstack.com**. Self-serve no-code at 99 PLN; no compliance or health-data handling documented publicly (checked 2026-08) ZvonAI differentiates through: dental/medical/legal/beauty vertical depth, EU AI Act Art. 50 compliance, caller data processed in the EU (technology sub-processors outside the EEA covered by SCCs, receiving only AI response text), Polish company, ElevenLabs neural voice, transparent PLN pricing, and a fast self-serve setup. Full AI vs AI comparison table: https://zvonai.ai/porownanie-recepcjonistka-ai ## Pricing | Plan | Price | Minutes | Use case | |------|-------|---------|----------| | Solo | 349 PLN/month | 350 min | Small office, 1 call at a time, one receptionist language (Polish or English) | | Pro | 1,200 PLN/month | 1,300 min | Solo practice or small business, up to 3 calls at once | | Business | 2,500 PLN/month | 2,900 min | Growing business with departments, up to 5 calls at once | | Enterprise | Contact sales | Custom | Multi-location, custom voice, SLA | 14-day free trial. No credit card. Cancel any time. First-month satisfaction guarantee (Solo/Pro/Business, not the trial): if in the first paid month the customer decides the assistant did not bring value to their business, the next month of subscription is free. The customer judges the value, not a booking count (a subscription credit, not a cash refund). Claim with a brief justification via support@zvonai.ai within 14 days of that month's end; claims are reviewed individually and require the service to have been in actual use. Full conditions: https://zvonai.ai/regulamin (Section 4.6). ## Blog Articles (Polish: dental/medical/legal focus) - [Czy muszę zmienić numer telefonu firmy? Ile trwa uruchomienie AI recepcji](https://zvonai.ai/blog/czy-musze-zmienic-numer-telefonu-ai-recepcja): No number change needed. Conditional forwarding from the existing line, porting available but rarely needed. Number ready in ~15 min, setup ~30 min, 14-day trial with no card, no onboarding fee. - [Co się dzieje, gdy AI nie rozumie dzwoniącego, i czy odbierze kilka telefonów naraz](https://zvonai.ai/blog/co-gdy-ai-nie-rozumie-dzwoniacego): Three things the assistant does instead of guessing (transfer to a named person, take a message, say it does not know) plus concurrent-call limits per plan: Solo 1, Pro 3, Business 5. - [Jak przyjmować zamówienia przez telefon, żeby żadne nie zginęło](https://zvonai.ai/blog/zamowienia-przez-telefon-jak-przyjmowac): Cztery elementy dobrze przyjętego zamówienia telefonicznego: treść słowami klienta, krótki numer zamówienia, dostawa lub odbiór z adresem w tej samej rozmowie, i jedno miejsce dla całego zespołu. Dlaczego nie potwierdza się dostępności przez telefon. - [Czy sztuczna inteligencja może przyjąć zamówienie przez telefon?](https://zvonai.ai/blog/czy-ai-moze-przyjac-zamowienie-przez-telefon): Co asystent AI robi z zamówieniem (spisuje towar i ilość, ustala dostawę, nadaje numer, wysyła SMS) i czego nie robi nigdy: nie podaje cen towaru, nie potwierdza dostępności, nie potwierdza anulowania. Te granice są wymuszone technicznie, nie tylko w instrukcji. - [Numer zamówienia podawany przez telefon](https://zvonai.ai/blog/numer-zamowienia-przez-telefon-jak-nadawac): Dlaczego numer telefonu nie wystarcza do rozpoznania zamówienia, które znaki mylą się w rozmowie (B i P, zero i O, piątka i S) i jak podać numer, żeby klient zapisał go za pierwszym razem. - [Kilku pracowników, jeden panel: role i uprawnienia](https://zvonai.ai/blog/zespol-wielu-uzytkownikow-role-uprawnienia): Multi-user team access. Owner/manager/staff roles, seats included per plan (Solo 1, Pro 3, Business 10, Enterprise 25, no per-seat charge), email invites, RODO per-user accountability, immediate session revocation on removal, case assignment - [Jak być cytowanym przez AI Google (AI Overviews)?](https://zvonai.ai/blog/jak-byc-cytowanym-przez-ai-google-overviews-gabinet): GEO guide. How clinics/SMEs get cited and recommended by Google AI Overviews, ChatGPT, Gemini; AnswerThePublic method + FAQ schema - [Czy pacjenci zaakceptują AI recepcję?](https://zvonai.ai/blog/ai-recepcja-czy-pacjenci-zaakceptuja): Objection-handling. What callers actually dislike (missed calls, hold, dumb IVR) and how a natural AI receptionist fixes it - [Recepcja AI: pierwszy tydzień krok po kroku](https://zvonai.ai/blog/recepcja-ai-pierwszy-tydzien-czego-sie-spodziewac): Realistic onboarding walkthrough. Signup, FAQ, calendar, test call, forwarding, go-live in ~15 min - [Czym jest AI recepcjonistka?](https://zvonai.ai/blog/czym-jest-ai-recepcjonistka): What is an AI receptionist, how it works, who needs it, cost comparison - [Ile kosztuje nieodebrana wizyta stomatologiczna?](https://zvonai.ai/blog/ile-kosztuje-nieodebrana-wizyta-stomatologiczna): Revenue loss calculation for dental clinics from missed calls - [Kara za nieodwołanie wizyty prywatnej i zadatek: co jest legalne, co przepada](https://zvonai.ai/blog/kara-za-nieodwolanie-wizyty-zadatek-czy-przepada): No-show fees vs deposits (zadatek vs zaliczka, art. 394 KC), refund tiers that hold up, typical amounts in Polish clinics, and how ZvonAI collects the deposit by SMS during the call. - [Ile kosztuje porada prawna u adwokata i czy można ją dostać przez telefon?](https://zvonai.ai/blog/ile-kosztuje-porada-prawna-u-adwokata-przez-telefon): Legal consultation prices in Poland (150-500 zł/h, divorce and inheritance first visits, online vs office), when phone advice is paid, free legal aid points, and why firms take intake by phone and advise in person; FAQ from real Google Suggest queries - [Ile kosztuje pomoc drogowa i holowanie za kilometr w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-pomoc-drogowa-holowanie-za-km): Roadside assistance prices in Poland (from 250 PLN in town, 4 PLN/km outside, ~50% night and weekend surcharge, ~400 PLN from a motorway to the nearest exit, on-site jump start / wheel change / fuel from 150 PLN), what to say when calling, and the 112-first rule when someone is injured. - [Ile kosztuje awaryjne otwieranie drzwi i wymiana zamka w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-awaryjne-otwieranie-drzwi-wymiana-zamka): Locksmith prices in Poland (standard doors from 250 PLN, security doors from 450 PLN, cylinder from 200 PLN, car opening from 300 PLN, night +40% / weekend +30%), why a locksmith asks for ID and proof of tenancy, and when to call 112 instead. - [Co zrobić po śmierci bliskiej osoby w domu](https://zvonai.ai/blog/co-zrobic-po-smierci-bliskiej-osoby-w-domu): Step-by-step after a death at home in Poland: doctor certifies the death (family doctor by day, 112 at night), death certificate, funeral home collection in 1-2 h, civil registry, funeral costs (traditional from 8000 PLN, cremation from 7000 PLN) and the 7000 PLN ZUS funeral benefit from 2026-01-01. - [Ile kosztuje kurs prawa jazdy kat. B w 2026 roku i czym jest PKK](https://zvonai.ai/blog/ile-kosztuje-kurs-prawa-jazdy-kat-b-pkk): Driving-school prices in Poland (cat. B from 3900 PLN, automatic from 4200 PLN, motorcycle A1/A2 from 2900 PLN, extra lesson 130 PLN/h), what the PKK candidate profile is and how to get one, medical exam 200 PLN, document 100 PLN, WORD exam 250 PLN, and starting the course three months before turning 18. - [Ile naprawdę kosztuje nieodebrane połączenie? Kalkulator strat 2026](https://zvonai.ai/blog/ile-kosztuje-nieodebrane-polaczenie-firma): What one missed call really costs a Polish SME, how to work it out from average order value and conversion, and why the loss compounds because a caller who cannot get through calls a competitor instead of calling back. (Was published but never listed here.) - [Ile kosztuje wizyta u weterynarza w 2026 roku: cennik, szczepienia, sterylizacja](https://zvonai.ai/blog/ile-kosztuje-wizyta-u-weterynarza): Veterinary prices in Poland (consultation from 120 PLN, vaccination from 90 PLN, deworming from 60 PLN, ultrasound from 180 PLN, cat neutering from 250 PLN, cat spay from 450 PLN, dog spay from 900 PLN), when to drive in immediately (chocolate, xylitol, bloat, trauma, cannot urinate) and what to bring. - [Ile kosztuje wizyta u fizjoterapeuty w 2026 roku i czy potrzebne jest skierowanie](https://zvonai.ai/blog/ile-kosztuje-wizyta-u-fizjoterapeuty): Physiotherapy prices in Poland (consultation from 150 PLN, post-injury rehab from 180 PLN, massage from 140 PLN, shockwave from 120 PLN, kinesiotaping from 60 PLN), no referral needed privately, how many sessions a typical problem takes and what to bring to the first visit. - [Ile kosztuje prywatna wizyta u lekarza i teleporada w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-prywatna-wizyta-u-lekarza-teleporada): Private medical prices in Poland (internist from 180 PLN, specialist from 250 PLN, teleconsultation from 120 PLN, ultrasound from 200 PLN, ECG from 100 PLN, blood draw from 50 PLN), when a teleconsultation is enough, why results are never given over the phone and how to prepare for fasting tests. - [Doba hotelowa, zadatek i odwołanie rezerwacji: jak to działa w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-doba-hotelowa-zadatek-rezerwacja): Polish lodging basics: the hotel day runs 14:00 to 11:00, room rates from 280/350/480/650 PLN a night, breakfast from 45 PLN, pet 50 PLN a night, extra bed from 80 PLN, and how a deposit (zadatek, ~30% of the stay) works versus an advance (zaliczka), including the 7-day free-cancellation norm. - [Rezerwacja stolika i przyjęcie okolicznościowe: ile kosztuje i jak działa zaliczka](https://zvonai.ai/blog/rezerwacja-stolika-i-przyjecie-ile-kosztuje-no-show): Restaurant booking norms in Poland: table booking is free, groups of 8+ and events take an advance, event catering from 150 PLN per head (communion 160, wake 90, company 120, wedding 250), the 15-minute table hold, what a no-show really costs and why SMS reminders beat fees. - [Ile kosztuje leczenie kanałowe, implant i wybielanie zębów w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-leczenie-kanalowe-implant-cennik-dentysty): Private dental prices in Poland (consultation from 150 PLN, hygiene from 250 PLN, filling from 350 PLN, root canal from 900 PLN, extraction from 300 PLN, crown from 1500 PLN, implant from 2800 PLN, whitening from 1200 PLN), emergency pain visits from 200 PLN and how deposits work on long treatments. - [Ile kosztuje przegląd samochodu, wymiana opon i naprawa w warsztacie w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-przeglad-samochodu-wymiana-opon-warsztat): Car workshop prices in Poland (service with oil change from 250 PLN plus parts, diagnostics from 150 PLN, seasonal tyre change from 120 PLN, brake pads from 350 PLN, air-con from 200 PLN, alignment from 180 PLN, timing belt from 1200 PLN, clutch from 1800 PLN), why phone quotes are ranges and how to describe a fault. - [Ile kosztuje botoks, kwas hialuronowy i zabiegi kosmetologiczne w 2026 roku](https://zvonai.ai/blog/ile-kosztuje-botoks-i-zabiegi-kosmetologiczne-cennik): Beauty and aesthetic-medicine prices in Poland (botox from 600 PLN per area, hyaluronic lip filler from 900 PLN/ml, needle mesotherapy from 450 PLN, chemical peel from 300 PLN, laser hair removal from 250 PLN, permanent brow makeup from 900 PLN), who performs which treatment (doctor vs cosmetologist) and pregnancy contraindications. - [Ile bierze biuro nieruchomości: prowizja przy sprzedaży i wynajmie w 2026 roku](https://zvonai.ai/blog/ile-bierze-biuro-nieruchomosci-prowizja): Polish estate-agency commission: 2-3% of the sale price plus VAT payable at the transaction, one month's rent plus VAT on lettings, who pays it, what the agency agreement must cover, valuation from 500 PLN versus a surveyor's report, and free viewings. - [Zadatek, zaliczka i kaucja: czym się różnią, co przepada, co wraca](https://zvonai.ai/blog/zadatek-zaliczka-kaucja-roznice): The three Polish prepayment types explained: zadatek (art. 394 KC, forfeited if the client fails, double back if the business fails), zaliczka (returned, minus proven costs), kaucja (security, returned after the contract). Typical deposit levels by trade (100 PLN short visit, 250-500 PLN long treatment, ~30% hotel stay, ~1000 PLN driving course) and the three conditions that make a deposit enforceable. - [Zadatek przy zakupie mieszkania: ile wynosi, kiedy przepada, co z umową przedwstępną](https://zvonai.ai/blog/zadatek-przy-zakupie-mieszkania-umowa-przedwstepna): Property deposits in Poland: 5-10% of the price, forfeited if the buyer walks, double back if the seller does, and why a mortgage-refusal clause in the preliminary contract decides whether the money returns. What the preliminary contract must contain and why notarial form gives a stronger claim. - [Jak pobierać zadatek online przez SMS: praktyczny przewodnik dla firm usługowych](https://zvonai.ai/blog/jak-pobierac-zadatek-online-sms-firma-uslugowa): How a service business takes deposits by SMS payment link: never card details on the phone, what to say in the call and in what order, how much to charge, a two-hour payment window with automatic release, and refund tiers that hold up (100% over 48 h, 50% at 24-48 h, none under 24 h). - [Zadatek na wesele i przyjęcie okolicznościowe: ile wynosi i kiedy przepada](https://zvonai.ai/blog/zadatek-na-wesele-przyjecie-ile-wynosi): Event deposits in Poland: 10-20% of the reception value for a wedding, per-head prices (wedding from 250 PLN, communion 160, event 150, wake 90, company 120), when the deposit is forfeited, and the guaranteed-headcount clause that costs more than the deposit itself. - [Jak nie tracić pacjentów przez telefon?](https://zvonai.ai/blog/jak-nie-tracic-pacjentow-przez-telefon): 5 solutions for missed call problem in medical practices - [AI recepcjonistka vs etat: analiza kosztów](https://zvonai.ai/blog/ai-recepcjonistka-koszty-porownanie-etat): Full cost comparison AI vs full-time receptionist hire - [Recepcja telefoniczna w gabinecie dentystycznym](https://zvonai.ai/blog/recepcja-telefoniczna-gabinet-dentystyczny-organizacja): How to organise phone reception without extra staff - [RODO a AI recepcjonistka w gabinecie medycznym](https://zvonai.ai/blog/rodo-ai-recepcjonistka-gabinet-medyczny): GDPR compliance FAQ for medical practices using AI - [Automatyczne umawianie wizyt w gabinecie](https://zvonai.ai/blog/automatyczne-umawianie-wizyt-gabinet): How AI calendar booking works in practice - [Nieodebrane połączenia w kancelarii prawnej](https://zvonai.ai/blog/nieodebrane-polaczenia-kancelaria-prawna): Monthly client loss calculation for solo law firms - [Jak zmniejszyć niestawiennictwa na wizytach?](https://zvonai.ai/blog/jak-zmniejszyc-niestawiennictwa-wizyt-sms): How SMS reminders help reduce no-shows - [AI recepcja w salonie kosmetycznym](https://zvonai.ai/blog/ai-recepcja-salon-kosmetyczny-rezerwacje): Automated bookings for beauty salons - [AI recepcjonistka dla fizjoterapeuty](https://zvonai.ai/blog/fizjoterapia-ai-recepcja-bez-rejestratorki): AI reception for solo physiotherapy practice ## Blog Articles: Agent-Ready / API / MCP - [ZvonAI is Agent-Ready: MCP Servers, REST API, Webhooks and the Future-Proof AI Stack](https://zvonai.ai/blog/zvonai-agent-ready-mcp-api-future-proof): How ZvonAI is built for the AI agent era. MCP tools, REST API, webhook events, llms.txt discoverability, EU AI Act compliance for automated pipelines, and the data moat that compounds with every call. ## Blog Articles: GDPR / RODO Compliance (Polish + English) - [Czy AI asystent telefoniczny jest zgodny z RODO?](https://zvonai.ai/blog/ai-asystent-telefoniczny-rodo-przewodnik): Complete GDPR guide for clinics. Art. 6, Art. 9, Art. 28 DPA, EU AI Act Art. 50, SCCs - [EU AI Act dla gabinetów: co musisz wiedzieć w 2026](https://zvonai.ai/blog/eu-ai-act-gabinety-co-musisz-wiedziec-2026): Plain-language EU AI Act explainer for dentists and lawyers, ZvonAI = Limited Risk tier - [Gabinet dentystyczny a RODO: nagrywanie rozmów przez AI](https://zvonai.ai/blog/gabinet-dentystyczny-rodo-nagrywanie-rozmow): GDPR call recording rules for dental practices, DTMF consent gate, 30-day audio retention - [Dane pacjentów i AI: jak ZvonAI chroni prywatność](https://zvonai.ai/blog/dane-pacjentow-ai-jak-zvonai-chroni-prywatnosc): How ZvonAI handles patient data. Pre-TTS sanitizer, no AI training on calls, cascade deletion - [Klauzule SCC i przenoszenie danych do USA](https://zvonai.ai/blog/klauzule-scc-przenoszenie-danych-usa-twoja-firma): SCCs explained for clinic owners. Why Deepgram+ElevenLabs are legal under RODO - [Rejestr Czynności Przetwarzania (RCP). Art. 30 RODO](https://zvonai.ai/blog/rejestr-czynnosci-przetwarzania-rodo-art30): How to build a RoPA for AI call handling. Ready-to-copy template for dental clinics - [GDPR and AI Phone Receptionists: What Law Firms Need to Know](https://zvonai.ai/blog/gdpr-ai-phone-receptionist-law-firms): English guide for Polish kancelarie. Legal privilege, Art. 9 data, DPA requirements ### Dane, wiedza i integracje (jak AI wie, co mówić) - [Skąd AI wie, kiedy mam wolny termin? (Google Sheets)](https://zvonai.ai/blog/ai-recepcja-z-twojego-grafiku-google-sheets): How ZvonAI reads the owner's live Google Sheet (read-only) for availability/services/prices and books without double-booking; never invents a slot - [Jak AI zna odpowiedzi, baza wiedzy / FAQ](https://zvonai.ai/blog/jak-ai-zna-odpowiedzi-baza-wiedzy): How you teach ZvonAI (FAQ entries, uploaded PDF/DOCX docs, website scan); AI answers only from your data, offers callback when unknown (anti-hallucination) - [Czy AI recepcja podaje ceny przez telefon?](https://zvonai.ai/blog/ai-recepcja-podaje-ceny-uslug-przez-telefon): AI quotes accurate, current prices from your cennik (document or Sheet); never guesses a price; turns "ile to kosztuje" into a booking - [Zvon: asystent AI w panelu](https://zvonai.ai/blog/panel-zvon-asystent-ai-w-recepcji): The in-dashboard AI assistant. Ask about calls/appointments, change settings by chat, plan-aware gating, timestamped action log, RODO-safe boundaries - [Integracja z Booksy, DocPlanner i kalendarzem](https://zvonai.ai/blog/ai-recepcja-integracja-booksy-docplanner-kalendarz): Which systems ZvonAI books into today: Google, Outlook and Apple calendars directly; DocPlanner via its official integration API once DocPlanner issues per-clinic access (requested together with the clinic); Booksy via booking requests the owner confirms with one tap (partner-only API); Cliniko, Proassist, Acuity, Medfile on request - [Czy AI recepcja zmyśla? Prawda o halucynacjach](https://zvonai.ai/blog/czy-ai-recepcja-zmysla-halucynacje-prawda): The trust post. How ZvonAI answers only from your data and says "nie wiem, oddzwonimy" instead of inventing; no medical/legal advice - [Jak podłączyć arkusz Google do AI recepcji (krok po kroku)](https://zvonai.ai/blog/jak-podlaczyc-arkusz-google-do-ai-recepcji): Tutorial. Share the sheet read-only with the service-account email, paste the link, AI reads live; ~2 minutes - [Jak wgrać cennik (PDF) do bazy wiedzy](https://zvonai.ai/blog/wgranie-cennika-pdf-do-ai-recepcji-baza-wiedzy): Upload PDF/DOCX into the knowledge base; processing status, retry on failure, version history on re-upload - [Zmieniłem cenę: czy AI od razu wie? (aktualizacja na żywo)](https://zvonai.ai/blog/ai-recepcja-aktualizacja-danych-na-zywo): Update the source (Sheet, document, FAQ, calendar) and AI uses the new info. No re-training, no waiting - [Czym jest MCP: bezpieczny dostęp AI do danych](https://zvonai.ai/blog/czym-jest-mcp-ai-agent-dostep-do-danych): Plain-language explainer of Model Context Protocol; why ZvonAI is MCP-first / agent-ready (calendar, sheets, CRM, SMS via permissioned tools) - [Czy AI wie, kto już dzwonił? (historia w CRM)](https://zvonai.ai/blog/ai-recepcja-historia-dzwoniacych-crm): Caller recognition. AI matches the incoming number against your own data to greet returning callers and skip repeat questions; RODO-safe (your data only) - [Gabinet stomatologiczny: AI umawia z grafiku w arkuszu](https://zvonai.ai/blog/gabinet-stomatologiczny-grafik-arkusz-ai): Dental clinics. AI reads your Google Sheets/Excel schedule live, books real free slots, respects procedure durations, quotes prices, no double-booking - [Transkrypcje rozmów: co dokładnie powiedziała AI](https://zvonai.ai/blog/transkrypcje-rozmow-ai-recepcja): Per-call summary + full transcript in the panel; quality control, disputes, improving the knowledge base. Without listening to recordings - [Kilka lokalizacji lub działów: routing z danych](https://zvonai.ai/blog/multi-lokalizacja-routing-dzialow-dane): One number, multiple sites/departments. AI routes by data (locations, specialists, hours) with natural conversation, no key-press menu - [Excel jako źródło danych dla AI recepcji](https://zvonai.ai/blog/excel-zrodlo-danych-ai-recepcja): AI reads an .xlsx file (schedule, price list, services) the same as Google Sheets; read-only, no reformatting, schema-change detection - [Automatyzacja n8n/Make z danych połączeń](https://zvonai.ai/blog/n8n-make-dane-z-polaczen-ai): Webhooks + API push call data to n8n/Make/Zapier. Auto-log leads to CRM, notify on urgent calls, build no-code processes around every call - [Ile pytań AI obsłuży bez człowieka?](https://zvonai.ai/blog/ile-pytan-ai-obsluzy-bez-czlowieka): Honest deflection framing. AI handles repetitive questions (hours, prices, booking) from your data; humans get the rest. No fake "90%" promise - [AI a niestawiennictwa: dane + przypomnienia](https://zvonai.ai/blog/ai-no-show-dane-przypomnienia): Reduce no-shows with SMS reminders + call data showing where/when cancellations cluster; honest about no magic zero - [Eksport danych z ZvonAI: żądanie RODO (DSAR)](https://zvonai.ai/blog/eksport-danych-zvonai-rodo-dsar): How to fulfil a Data Subject Access Request. Export and delete call data (recordings, transcripts), retention period, one-month deadline, you remain the controller - [AI rozpoznaje stałego vs nowego pacjenta](https://zvonai.ai/blog/ai-rozpoznaje-stalego-vs-nowego-pacjenta): AI tailors the call. Greets returning patients by name, guides new ones through first contact. Based on your data; panel flags new vs returning - [Medycyna estetyczna: konsultacje warte 600–1500 zł](https://zvonai.ai/blog/medycyna-estetyczna-ai-recepcja-konsultacje): A missed call in aesthetic medicine = a lost 600–1500 PLN consultation (botox, fillers, lips); AI answers 24/7 while the doctor is mid-procedure - [Rejestracja w klinice medycyny estetycznej](https://zvonai.ai/blog/klinika-medycyny-estetycznej-rejestracja-telefoniczna): Why aesthetic-clinic reception is overloaded (front desk + phone + Instagram at once) and how AI handles parallel calls so no high-value lead is missed - [Ortodonta: telefony o aparat i wizyty kontrolne](https://zvonai.ai/blog/ortodonta-ai-recepcja-aparat-wizyty): Orthodontics = years of recurring control visits + urgent cases (loose bracket); AI answers 24/7, reschedules, and flags urgent issues per your rules - [Dietetyk: umawianie konsultacji podczas wizyt](https://zvonai.ai/blog/dietetyk-ai-recepcja-rezerwacja-konsultacji): Solo dietitians can't answer during 1-on-1 consultations; AI books first visits and follow-ups, online or in-person, without interrupting the session - [Salon optyczny: telefony o okulary i badanie wzroku](https://zvonai.ai/blog/optyk-salon-optyczny-ai-recepcja): Optician phones are repetitive ("are my glasses ready?", eye-exam booking); AI handles them 24/7 so the optician stays with the customer at the counter - [Biuro rachunkowe: sezon rozliczeń](https://zvonai.ai/blog/biuro-rachunkowe-ai-recepcja-sezon-rozliczen): During PIT/month-end peaks AI fields repetitive client calls (deadlines, documents), takes messages, books callbacks. And never gives tax advice itself - [SPA i wellness: rezerwacje pakietów 24/7](https://zvonai.ai/blog/spa-wellness-ai-recepcja-rezerwacje): SPA bookings come evenings/weekends when reception is closed; AI advises on packages, checks availability, and reserves treatments around the clock - [Fotowoltaika: kwalifikacja leadów 24/7](https://zvonai.ai/blog/fotowoltaika-ai-recepcja-leady-kwalifikacja): One solar lead = a five-figure install; AI answers 24/7, qualifies (building type, electricity bill, location), books the advisor, pushes data to CRM - [Psychoterapia: dyskretne umawianie wizyt, RODO](https://zvonai.ai/blog/psychoterapia-ai-recepcja-dyskrecja-rodo): Therapists can't answer mid-session; AI books the first visit discreetly (organisational only, no therapy talk), GDPR-compliant for sensitive data - [Biuro nieruchomości: leady z ogłoszeń 24/7](https://zvonai.ai/blog/biuro-nieruchomosci-ai-recepcja-leady-24-7): Buyers call the moment they see a listing (often evenings) while agents are on viewings; AI captures the lead, qualifies, books a viewing, syncs to CRM ### Aktualności i pozycjonowanie premium (batch 2026-07-03) - [ZvonAI wystartował: recepcja AI po polsku już działa](https://zvonai.ai/blog/zvonai-wystartowal-recepcja-ai-po-polsku): Launch announcement. ZvonAI is live; answers every call in natural Polish 24/7, books appointments, EU data residency, Polish company Expathia - [Medycyna estetyczna: pytania o ceny po godzinach](https://zvonai.ai/blog/medycyna-estetyczna-ai-recepcja-ceny-po-godzinach): Aesthetic-clinic patients ask about prices evenings/weekends when reception is closed; AI quotes real prices from your cennik (HA lips from 900 zł, botox from 600 zł) and books the consultation - [Kancelaria prawna: klient dzwoni raz](https://zvonai.ai/blog/kancelaria-prawna-klient-dzwoni-raz): Legal intake. A client with an urgent matter calls once; AI answers, takes organisational details, books a meeting, flags urgent cases; no legal advice, attorney privilege safe, EU data - [Recepcja AI po polsku i po angielsku. Pacjenci zagraniczni w Trójmieście](https://zvonai.ai/blog/recepcja-ai-polski-angielski-pacjenci-zagraniczni-trojmiasto): Bilingual PL+EN reception for expats and dental-tourism patients; AI detects caller language and books the visit; serving BOTH languages in the same call is available from the Pro plan up (a single-language plan picks Polish or English) - [Ile kosztuje recepcja AI i dlaczego poważny gabinet nie wybiera najtańszej](https://zvonai.ai/blog/ile-kosztuje-recepcja-ai-dlaczego-powazny-gabinet): Premium pricing philosophy. Solo 349 zł / Pro 1200 zł / Business 2500 zł, what each plan includes, value vs cheapest, identity framing ### Language release (2026-07-13) - [Recepcja AI w czterech językach: polski, angielski, ukraiński i rosyjski](https://zvonai.ai/blog/recepcja-ai-cztery-jezyki-polski-angielski-ukrainski-rosyjski): Russian added as the fourth call language; each language is a separate per-tenant toggle (Pro plan up), AI auto-detects the caller's language from the first sentence, EU AI Act Art. 50 disclosure spoken in every supported language ### Integration & data deep-dives (2026-07-23) - [Salon kosmetyczny: AI umawia klientki w Booksy](https://zvonai.ai/blog/salon-kosmetyczny-ai-recepcja-integracja-booksy): AI answers mid-treatment/evening calls and hands the owner a booking request to confirm with one tap; Booksy stays the only calendar (Booksy's API is partner-only) - [Gabinet lekarski: AI zapisuje pacjenta w DocPlanner](https://zvonai.ai/blog/gabinet-lekarski-ai-recepcja-integracja-docplanner): AI books phone patients into DocPlanner (ZnanyLekarz) via the official integration API once DocPlanner issues access for the clinic; until then booking requests go to registration - [Przychodnia na Proassist + AI recepcja](https://zvonai.ai/blog/przychodnia-ai-recepcja-integracja-proassist): Booking requests for registration to confirm; direct write into Proassist is built on request and needs Proassist's own paid API add-on (~300 PLN/mies on the Proassist side) - [Klinika na Medfile: AI odbiera, gdy recepcja obsługuje kolejkę](https://zvonai.ai/blog/klinika-ai-recepcja-integracja-medfile): Front desk serves in-person patients, AI hands phone bookings to the desk as requests; direct write into Medfile is built on request - [Kancelaria prawna: terminarz w arkuszu Google jako źródło danych AI](https://zvonai.ai/blog/kancelaria-prawna-arkusz-google-dane-klientow): Organisational intake from the firm's own Google Sheet; no legal advice, confidentiality-safe - [Fizjoterapia: harmonogram zabiegów z pliku Excel](https://zvonai.ai/blog/fizjoterapia-excel-harmonogram-zabiegow-ai): Upload .xlsx (multi-sheet supported, preview before confirm); AI answers price/availability while the therapist's hands are busy - [Weterynarz: dane pacjentów z arkusza Google](https://zvonai.ai/blog/weterynarz-arkusz-google-dane-pacjentow-ai): Routine calls (hours, vaccination prices, booking) answered from the clinic's live sheet; emergencies transferred to a human - [Zmiana planu jednym zdaniem w czacie ze Zvonem](https://zvonai.ai/blog/jak-zmienic-plan-przez-czat-z-zvon): Zvon performs a real Stripe plan change after explicit confirmation. Upgrades immediate/prorated, downgrades at period end - [AI recepcja vs zewnętrzne call center](https://zvonai.ai/blog/ai-recepcja-vs-zewnetrzne-call-center-outsourcing): Honest comparison. Live own-data answers, 24/7, fixed PLN pricing and EU data residency vs outsourced agents on a script - [Outlook i podkalendarze: AI umawia w Microsoft 365](https://zvonai.ai/blog/outlook-podkalendarze-ai-recepcja-integracja): Official Microsoft OAuth sign-in, multi-calendar selection, two-way sync; Apple/Google/built-in calendar fallbacks ### Marketing & Widoczność (2026-07-25) - [Płacisz za reklamę gabinetu, a pacjentów nie przybywa? Gdzie ucieka budżet](https://zvonai.ai/blog/reklama-gabinetu-a-nieodebrane-telefony-utracony-budzet): Clinic marketing spend (Google Ads, ZnanyLekarz, Booksy) generates phone calls, not online purchases. The "leaky bucket": a paid lead that hits a busy line, voicemail or after-hours ring is budget thrown away. Answering every call raises conversion of the ad budget you already spend, without increasing it. Illustrative cost-per-lead math + verified PL treatment values. ### RODO & Prawo (2026-07-27) - [Tajemnica adwokacka i RODO a recepcja AI w kancelarii](https://zvonai.ai/blog/tajemnica-adwokacka-rodo-recepcja-ai-kancelaria): Can a Polish law firm use AI reception without risking attorney-client privilege? Yes. AI is organisational-only (no case details, no legal advice), the firm stays data controller with a DPA, data processed in the EU (Warsaw servers), Art. 50 AI Act self-disclosure, human handoff for urgent matters; Armatis 2025 acceptance data ### GEO gap batch (2026-08-15): moto, head-terms, kancelaria, przychodnia, beauty, JDG - [Ile kosztuje AI do odbierania telefonów w warsztacie samochodowym?](https://zvonai.ai/blog/ile-kosztuje-ai-do-odbierania-telefonow-warsztat-samochodowy): Pricing for auto-repair shops. Solo 349 zł (350 min), Pro 1 200 zł (1300 min), Business 2 500 zł (2900 min) vs 5 000–7 500 zł full cost of a front-office hire; ROI: three saved ~400 zł visits cover the Pro plan - [Sezon wymiany opon: jak warsztat odbiera każdy telefon bez odrywania rąk od pracy](https://zvonai.ai/blog/sezon-wymiany-opon-warsztat-odbiera-kazdy-telefon): Tire-season playbook. Oct–Nov and Mar–Apr peaks with a call every 3–5 min; AI answers in parallel, books real slots by service duration, runs a waitlist and sends SMS confirmations while mechanics keep working - [Zatrudnić kogoś do biura w warsztacie czy AI recepcjonistka. Co się opłaca?](https://zvonai.ai/blog/zatrudnic-do-biura-w-warsztacie-czy-ai-recepcjonistka): Honest hire-vs-AI comparison for workshops. Full employment cost breakdown, what AI does and does not do (no cash desk, no car handover), hybrid model for bigger garages - [Automatyczna sekretarka z AI: jak działa i ile kosztuje?](https://zvonai.ai/blog/automatyczna-sekretarka-z-ai): Polish head-term explainer. How an AI answering secretary differs from old voicemail, step-by-step call flow (Art. 50 AI Act self-introduction, answers only from the owner's data, real-calendar booking, SMS), pricing from 349 zł/month - [Ile kosztuje wirtualna sekretarka dla kancelarii prawnej?](https://zvonai.ai/blog/ile-kosztuje-wirtualna-sekretarka-dla-kancelarii-prawnej): Law-firm virtual secretary pricing. Solo 349 zł / Pro 1 200 zł / Business 2 500 zł, organisational-only scope (attorney-client privilege safe), DPA + EU data processing, one retained case covers the subscription - [Wirtualny sekretariat czy AI recepcjonistka dla kancelarii. Porównanie kosztów i jakości](https://zvonai.ai/blog/wirtualny-sekretariat-czy-ai-recepcjonistka-dla-kancelarii): Human remote-secretariat (script, office hours, per-call billing, third-party staff see caller data) vs AI receptionist (24/7, parallel calls, answers from the firm's own data, direct calendar booking, flat PLN price) - [Pacjenci nie mogą się dodzwonić do przychodni? Co zrobić, gdy rejestracja nie wyrabia](https://zvonai.ai/blog/pacjenci-nie-moga-sie-dodzwonic-do-przychodni): Evergreen fix for overloaded clinic registration. Morning-peak/evening missed-call pattern, second-hire vs outsourced call center vs AI overflow reception working alongside front desk; DocPlanner/Proassist booking, Armatis acceptance data - [Ile kosztuje AI recepcjonistka dla salonu beauty?](https://zvonai.ai/blog/ile-kosztuje-ai-recepcjonistka-dla-salonu-beauty): Beauty-salon pricing. From 349 zł/month, 25–38% of beauty calls go unanswered during 60–120 min treatments, Booksy via one-tap booking requests, SMS reminders cut no-shows 30–40%, payback in 2–3 saved bookings - [Stylistka paznokci i rzęs: voicebot przyjmuje rezerwacje, gdy Ty pracujesz](https://zvonai.ai/blog/voicebot-rezerwacje-paznokcie-rzesy): Yes. A voicebot can take nail/lash bookings: answers mid-treatment and after hours, books real calendar slots by service duration (Google/Outlook/Apple; Booksy via one-tap requests), quotes only the studio's own price list, SMS confirmations; Solo plan 349 zł for one-person studios - [Prowadzisz firmę sam i nie nadążasz z telefonami? Opcje zanim kogoś zatrudnisz (JDG)](https://zvonai.ai/blog/prowadzisz-firme-sam-nie-nadazasz-z-telefonami): Options for solo business owners before hiring. Voicemail (callers don't leave messages), human remote secretariat (office hours, note-taking), AI receptionist from 349 zł/month booking real appointments 24/7; full-time hire only when off-phone duties justify 5 000–7 500 zł/month ## Video Library Short self-hosted videos showing the ZvonAI AI receptionist in action, grouped by industry. Watch them at https://zvonai.ai/filmy (each video is marked up with schema.org VideoObject). - [Do it yourself: ZvonAI setup step by step in 15 minutes (Polish)](https://zvonai.ai/videos/setup-guide/pl/zvonai-setup-pl.mp4): The whole AI reception setup in fourteen chapters, Polish narration: company details, greeting, questions, plan, test call, hours, forwarding and its check, transfer to a person, calendar, notifications, deposits. - [Do it yourself: ZvonAI setup step by step in 15 minutes](https://zvonai.ai/videos/setup-guide/en/zvonai-setup-en.mp4): The whole AI reception setup in fourteen chapters with the dashboard and narration in English: company details, greeting, questions, plan, test call, hours, forwarding and its check, transfer to a person, calendar, notifications, deposits. - [9:47 PM — someone answers. AI reception for your clinic](https://zvonai.ai/videos/filmy/posluchaj-dental.mp4): A patient calls after hours about an implant. See how the ZvonAI reception answers in Polish, quotes the price and books the visit — after hours. ## Full content index *Full concatenated content (product facts, compliance details, all vertical pages, competitor comparison) available at https://zvonai.ai/llms-full.txt*