# meiti

> meiti answers phone calls, WhatsApp, chats and email for businesses with an AI assistant. Connect it to a CRM, ERP or shop with three building blocks: the CRM webhook (call/chat events, your answer adds context), the public REST API v1 (messages, contacts, appointments, conversations, signed appointment webhooks) and deep links into the meiti app.

Hosts: `meiti.app` (docs), `api.meiti.ai` (API), `m.meiti.ai` (app links).

Key facts:
- API base: https://api.meiti.ai/v1/ (to test, use an inbox or organisation of your own set up only for testing). Auth: `X-Api-Key: meiti_sk_…` or `Authorization: Bearer meiti_sk_…`; each key belongs to exactly one inbox; 60 requests/minute per key (default); errors are RFC 9457 problem details (code in `title`).
- `POST /v1/messages` needs an existing contact (create it with `POST /v1/contacts`, upsert by phone). Use an `Idempotency-Key` header. A closed WhatsApp 24h window returns `waitingForReply: true`: meiti sends a notice with a button and delivers the text when the customer taps it or replies. An API message counts as a team reply (the assistant does not take over afterwards).
- `POST /v1/messages/log` files a message sent or received OUTSIDE meiti (your own mailbox, another tool): `{ projectId|contactId|phone|email, direction: "in"|"out", channel: "email"|"whatsapp"|"sms"|"rcs", text, subject? (email only), occurredAt?, externalId?, ai?: "pause"|"resume", notify? }`. Nothing is sent; meiti's assistant never answers it but reads it as part of the conversation; an incoming one is unread for the team; the contact's reply channel stays as it is. Same `externalId` + channel again = 200 with the first message, nothing filed. `POST /v1/notes` `{ projectId|contactId|phone|email, title?, text }` adds an internal note (team only, never read by the assistant; `Idempotency-Key` supported).
- CRM webhook: meiti POSTs `{ eventType, timestampUtc, callbackUrl, contactData, projectData }` with `Authorization: Bearer <token>`. `eventType` is a string: IncomingCallLookup, FinishedCall, NewConversation, ConversationPaused, Manual, FormSubmitted, and the appointment events AppointmentCreated, AppointmentConfirmed (customer confirmed), AppointmentRescheduled, AppointmentCancelled, AppointmentFinished, AppointmentReminderSent — those also carry `appointmentData` in the API's appointment shape. Free on every plan, no quota. Answer within 2 seconds with 200 + `{ requestContactUpdate, contactData, requestProjectUpdate, projectData }` (ids are strings, only flagged parts are applied), or 202 and POST the same body to the one-time `callbackUrl` within 5 minutes; 204 = nothing to add. One webhook per inbox; events carry no inbox id. A slow or failed answer gets the same event once more (same `callbackUrl` — dedupe on it). Until October 2026 `eventType` was a number (0 IncomingCallLookup, 1 FinishedCall, 2 NewConversation, 3 ConversationPaused, 4 Manual, 5 FormSubmitted) — accept both for a while. `crmAiInfo` (max 5000 chars) is read by the assistant in every conversation: keep it short and never put anything there a stranger must not hear.
- API webhooks: subscribe with `POST /v1/webhooks`; header `X-Meiti-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, t + "." + raw body)>`, reject timestamps older than 5 minutes; events appointment.created|confirmed|rescheduled|cancelled|finished|reminder_sent; dedupe on `X-Meiti-Delivery-Id`.
- Deep links: `https://m.meiti.ai/open/project?id=<meitiProjectId>|crmId=<crmProjectId>|crmContactId=<crmContactId>` and `https://m.meiti.ai/open/dial?number=<phone>`; the same paths work as `meiti://open/…`. URL-encode values (`/` → %2F, `+` → %2B, space → %20).
- BYOAI (your own AI answers instead of meiti's assistant): create an assistant of kind "Your own AI" in the app (Settings → AI assistants → NEW), then configure it in the app or with `GET /v1/agents`, `GET`/`PATCH /v1/agents/{id}` (`chatUrl` https, `voiceUrl` wss, `timeoutSeconds` default 10, 2–30, `voiceId`; omitted = unchanged, "" = disconnect), `POST /v1/agents/{id}/secret` (signing secret, shown once; without one meiti sends nothing) and `POST /v1/agents/{id}/test`. Chat: meiti POSTs `{ id, type: "message.received", createdAt, protocol, workspaceId, agentId, data: { projectId, channel, contact, message, history, replyUrl, skills, autoReply } }` to `chatUrl` with `X-Meiti-Signature` (same scheme as API webhooks, over the raw body), `X-Meiti-Event`, `X-Meiti-Delivery-Id`, `X-Meiti-Agent-Protocol: 2026-10-11`. `data.autoReply` = `{ state: on|paused|off, pausedUntil? }`, the project's auto-reply as the team set it in the app: events also arrive while the team has the project (member took over or replied, auto-reply switched off or muted) — your agent decides; answer 204 to stay quiet. A text sent anyway is delivered (the team sees a note the first time after they stepped in); unless `state` is `on`, `data.skills` is empty, skills answer `not-allowed` and `handover` is a no-op. Answer within `timeoutSeconds` with 200 `{ text, action: none|handover|end, note }` (text max 4000, note max 500, team-only), or 202/204 and later `POST /v1/projects/{id}/agent-replies` with the same body and an API key of the inbox (202 `{ projectId, messageId, status: sent|handed_over|noop, autoReply }`, 409 `project_not_with_agent` when the project is not answered by an own-AI assistant, 422 `not_deliverable`). One attempt, no retry: timeout, non-2xx, unreadable JSON or an unknown action hand the conversation to the team (nothing extra when the team has it already). Phone: per call meiti opens a WebSocket to `voiceUrl`; the upgrade carries `X-Meiti-Call-Id` and `X-Meiti-Signature` over that call id. meiti → agent: `session.started`, `prompt { text }`, `dtmf { digit }`, `interrupt { spokenUntilInterrupt }`, `session.ended`; agent → meiti: `text { text, last }` (streamed speech), `action { action: end|handover, text, note }`. Skills as tools: forwarding (`kind: forward`) and alert (`kind: alert`) skills attached to the assistant (app: Skills section) are listed in `data.skills` / `session.started.skills` as `{ id, key, name, description, kind, announcement }` (only those allowed right now) and in `GET /v1/agents` (`skills`, `skillsPerHourLimit`, `forwardsPerCallLimit`). Trigger them with `executeSkills: ["key" or "id", …]` (max 5, alerts first, one forward last) and optional `announcement` ("" = none) in the chat answer or agent-replies body (202 adds `skills: [{ key, ok, reason }]`; a synchronous answer's outcome appears as a `system` history turn `… [key] … (reason)`), with the phone frame `{ type: "skill", executeSkills, note?, announcement? }` (meiti answers `skill.result { key, ok, reason }`; an ok forward transfers the call, no answer = reconnect with `resumed: "handover_failed"` and `resumedAfter: { key, ok: false, reason: "no-answer" }`), or `POST /v1/projects/{id}/skills/{key}` (`{ note, announcement }`, optional Idempotency-Key, 200 `{ key, ok, reason }`, chat semantics). Alert text = `note`, else `text`. Reasons: `unknown-skill`, `outside-hours`, `limit-reached`, `not-allowed`, `no-answer`, `no-target`, `no-recipient`, `one-forward-per-turn`, `failed` (`pending-approval` with ok). Each executed skill costs like any skill run. Billing: chat replies are free (like meiti's own AI); phone per started call minute; post-processing skills meiti runs cost as usual. These events go only to the agent's own endpoints — not to the CRM webhook or API webhooks.

## Docs

- [Full text for agents](https://meiti.app/docs/developers/llms-full.txt): this file plus every sample (all languages) and every payload as plain Markdown.
- [Developer guide](https://meiti.app/docs/developers): integration patterns, flows, quickstart, recipes with code in cURL, Node.js, Python, Go, C#, PHP, and the reference for API v1, deep links and the go-live checklist.
- [Webhooks](https://meiti.app/docs/developers/webhooks): the CRM webhook (events, answers, recipes, complete payload, n8n templates) and the signed API webhooks with signature verification.
- [CRM webhook fields](https://meiti.app/docs/developers/webhooks#crm-fields): every contact and project field with its length limit and whether it is read-only.
- [BYOAI](https://meiti.app/docs/developers/byoai): your own AI as the assistant — chat events, replies, phone frames, signature, billing.
- [OpenAPI v1](https://api.meiti.ai/v1/openapi.json): machine-readable spec of every endpoint, field and error code.
- [API reference](https://api.meiti.ai/v1/docs): the same spec as interactive Swagger UI.
- [Changelog](https://api.meiti.ai/v1/changelog): every caller-facing change of v1 (Beta).
- [MCP](https://meiti.app/docs/mcp): set meiti up (assistants, skills, knowledge, tests) from Claude Code, Codex, Grok or any MCP client.

## Optional

- [Developer guide in English](https://meiti.app/docs/developers?lang=en), [Webhooks in English](https://meiti.app/docs/developers/webhooks?lang=en), [BYOAI in English](https://meiti.app/docs/developers/byoai?lang=en)
- Support for integrations: WhatsApp or call +49 89 41434078 (https://wa.me/498941434078?text=Hallo%2C%20ich%20baue%20eine%20meiti-Integration.) — no email.
## MCP: set meiti up from an AI client

- [MCP guide](https://meiti.app/docs/mcp): the setup MCP server for Claude Code, Codex, Grok or any client that speaks Streamable HTTP. Server URL: `/mcp/setup` on the meiti MCP host — copy the exact URL and a bearer token (valid 8 hours) from the app: Settings → Setup & operations → Connected systems → MCP server access (Enterprise plan or on request). It configures assistants, skills, knowledge, hours and tests; for your software's day-to-day traffic use the REST API.
- Account health and guided setup: `accounthealth_get`, `accounthealth_whatsapp`, `accounthealth_updatebusinessinfo`, `accounthealth_confirmwhatsapppayment`, `accounthealth_whatsappsignuplink`
- Assistants: `botprofile_getbotprofiles`, `botprofile_getbotprofile`, `botprofile_addbotprofile`, `botprofile_updatebotprofile`, `botprofile_setupvoice`, `botprofile_upsertsystemprompt`, `botprofile_setupchat`, `botprofile_setgreeting`, `botprofile_setupemail`, `botprofile_attachskill`, `botprofile_setsimpleconversation`, `botprofile_setforwardtarget`, `botprofile_copyprofile`, `botprofile_verifyversion`, `botprofile_getskillnet`, `botprofile_getreport`, `botprofile_getagentstatus`
- Skills and handovers: `skills_getskill`, `skills_getskills`, `skills_addskill`, `skills_addworkflowskill`, `skills_updateskilltitles`, `skills_updateskillprompt`, `skills_updateskilltrigger`, `skills_updateskillquestionlimit`, `skills_addtriggercondition`, `skills_updatetriggercondition`, `skills_deletetriggercondition`, `skills_getworkflowquestions`, `skills_setworkflowquestions`, `skills_setappointmentapproval`, `skills_setapprovalpolicy`, `skills_gethandovertargets`, `skills_updatehandovertarget`, `skills_getcallbacknotestatus`, `skills_ensurecallbacknote`
- Standard replies: `standardmessages_setreplycontent`, `standardmessages_setreplyapproval`, `standardmessages_setreplyguidance`, `standardmessages_setreplyskills`
- Knowledge: `knowledge_list`, `knowledge_upsert`, `knowledge_delete`, `corpus_list`, `corpus_create`, `corpus_set_enabled`, `corpus_delete`, `corpus_import`
- Hours, phone and forwarding: `businesshours_get`, `businesshours_postworkinghours`, `forwardtargets_get`, `forwardtargets_upsert`, `forwardtargets_updatedetails`, `forwardtargets_delete`, `voiceconfig_getconfig`, `voiceconfig_savevoiceonly`, `voicebotsettings_setactiveprofile`, `voicebotsettings_postsettings`, `channels_renamesipdevice`
- Tests: `assistanttests_get`, `assistanttests_upsert`, `assistanttests_delete`, `assistanttests_run`, `assistanttests_runs`, `assistanttests_rundraft`, `assistanttests_resolvetime`, `assistanttests_preflight`, `assistanttests_generate`, `assistanttests_extendtrigger`, `assistanttests_triggersuggestion`, `assistanttests_capturetrigger`, `assistanttests_disambiguate`, `assistanttests_applydisambiguation`, `assistanttests_clarifyfirst`, `assistanttests_answerinterview`, `assistanttests_graduate`, `assistanttests_voicedrivestart`, `assistanttests_voicedriveturn`, `assistanttests_voicedrivestop`, `run_persona_tests`
- Decision rules and insights: `decisionrules_get`, `decisionrules_delete`, `decisionrules_calibration`, `insights_refresh_outcomes`
- Inbox: `workspacefeatures_get`, `readreceiptmode_readreactionmode`
- Feedback to meiti: `report_capability_gap`
- Organisation (organisation-wide token only): `org_get_map`

## App Academy (product guides, German; add ?lang=en for English)

- [Get started: meiti in four steps](https://meiti.app/docs/academy/loslegen): Get the app, create an API key, request MCP access and have everything unlocked in a compliance call.
- [How it all fits together](https://meiti.app/docs/academy/so-haengt-alles-zusammen): Organisation, inbox, channels, assistants, skills and results — the net behind meiti on one page.
- [Inboxes: team or personal](https://meiti.app/docs/academy/postfaecher): What an inbox is, and when you need a team inbox or a personal one.
- [AI assistants](https://meiti.app/docs/academy/assistenten): Who answers on the phone and in chat: persona, voice, knowledge — and how an assistant goes from training to "Proven".
- [Skills: what your assistant can do](https://meiti.app/docs/academy/skills): Book appointments, take details, put calls through, summarise: skills during the conversation and after.
- [Channels and senders](https://meiti.app/docs/academy/kanaele): Phone, WhatsApp, email, web chat and SMS: what each channel can do and which assistant answers on it.
- [Phone numbers: meiti number, local number, mobile number](https://meiti.app/docs/academy/nummern): Which number you get, when your own is worth it and how call forwarding works.
- [How meiti answers calls](https://meiti.app/docs/academy/anrufe): Call mode, greeting, putting calls through, ring groups, business hours — every option for incoming calls.
- [Calling with the meiti app](https://meiti.app/docs/academy/telefonieren-in-der-app): Take calls in the app, take over live AI calls, transfer, and call customers.
- [Team communication: chat, call, hand over](https://meiti.app/docs/academy/team): Chat and call internally, share tickets, assign them and hand them to other inboxes.
- [Calendars and appointments](https://meiti.app/docs/academy/termine): Appointment types, connecting calendars, reminders and what customers can do on their appointment page.
- [Tasks](https://meiti.app/docs/academy/aufgaben): What's next: tasks from you, from the team and from conversations.
- [100% EU: keep your calls in Europe](https://meiti.app/docs/academy/eu-routing): The path on which every call — in and out — stays in the EU. And which paths run through the US.

## Use cases and customer stories

- [meiti on meiti: our support and sales run on the same tools as yours](https://meiti.app/docs/anwendungsfaelle/meiti-auf-meiti): How we run meiti's own support, outbound and every customer message with exactly the app, APIs and webhooks you get too.
- [BYOAI: your own AI, meiti's channels](https://meiti.app/docs/anwendungsfaelle/byoai): Bring your own AI: your AI answers chats and calls, meiti provides numbers, WhatsApp, web chat, Telegram, inbox, storage and the handover to your team.
- [Germania Inkasso: from 15 to 5 people on the phone — in full control](https://meiti.app/docs/kunden/germania-inkasso): Phone system, phone AI and SMS API replaced by meiti. Webhooks and the API keep the Icarus collection system current at all times.

Full text of every lesson and story: https://meiti.app/docs/developers/llms-full.txt

## meiti: product, pricing, app, support, legal

- [meiti.ai](https://www.meiti.ai/)
- [Pricing](https://www.meiti.ai/preise)
- [Compare plans](https://www.meiti.ai/app-planvergleich)
- [Understanding credits](https://meiti.app/hilfe/credits-verstehen)
- [FAQ](https://www.meiti.ai/faq)
- [App releases](https://www.meiti.ai/app-releases)
- [App Academy](https://meiti.app/docs)
- [Use cases](https://meiti.app/docs/anwendungsfaelle)
- [API](https://meiti.app/docs/developers)
- [Webhooks](https://meiti.app/docs/developers/webhooks)
- [BYOAI](https://meiti.app/docs/developers/byoai)
- [MCP](https://meiti.app/docs/mcp)
- [Changelog](https://meiti.app/docs/changelog)
- [100% EU telephony](https://meiti.app/docs/academy/eu-routing)
- [How to get started](https://meiti.app/docs/academy/loslegen)
- [Start for free](https://meiti.app/go)
- [Book a compliance call](https://outlook.office365.com/book/booking@meiti.ai/)
- [App Store](https://apps.apple.com/app/id1596933887)
- [Google Play](https://play.google.com/store/apps/details?id=com.meitihandwerk.meiti)
- [Support on WhatsApp](https://wa.me/498962825222?text=Tippe+senden%2c+um+den+Chat+zu+starten)
- [Community](https://www.meiti.ai/community)
- [Partner program](https://partner.meiti.ai)
- [Legal notice](https://www.meiti.ai/impressum)
- [Privacy](https://www.meiti.ai/app-datenschutz)
- [Terms](https://www.meiti.ai/app-agb)
- [Data processing agreement](https://www.meiti.ai/app-avv)
