# SendEasy documentation (en) # AI integrations and MCP Connect your AI assistant to the official documentation to build SendEasy integrations using documented endpoints, payloads and authentication. ## Choose an access method | Method | Purpose | Address | | --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------ | | `llms.txt` | Discover relevant documentation | [English index](https://docs.sendeasy.app/en/llms.txt) | | `llms-full.txt` | Read all English documentation at once | [Full English documentation](https://docs.sendeasy.app/en/llms-full.txt) | | Markdown | Read a specific page without interface HTML | [Public API example](https://docs.sendeasy.app/en/server/api-publica.md) | | MCP | Let the assistant search and read references on demand | `https://docs.sendeasy.app/mcp` | Portuguese indexes are at `/llms.txt` and `/llms-full.txt`; Spanish indexes are at `/es/llms.txt` and `/es/llms-full.txt`. Append `.md` to a documentation page URL to read its Markdown version. Home pages use `/index.md`, `/en/index.md` and `/es/index.md`. ## Connect with MCP Add a remote MCP server in a client that supports Streamable HTTP: | Setting | Value | | -------------- | ------------------------------- | | Name | `sendeasy-docs` | | URL | `https://docs.sendeasy.app/mcp` | | Transport | Streamable HTTP | | Authentication | None | Configuration formats vary by client. For clients accepting `mcpServers` entries with a `url`: ```json { "mcpServers": { "sendeasy-docs": { "url": "https://docs.sendeasy.app/mcp" } } } ``` Available tools: | Tool | Usage | | ------------- | ----------------------------------------------------------------------------------------------------------------- | | `search_docs` | Search with `query`, `locale` (`pt`, `en`, `es`) and `limit` (1 to 10). | | `get_doc` | Read the exact `path` returned by search. For long pages, pass the returned `nextOffset` as `offset` to continue. | | `list_docs` | List pages and descriptions in the requested `locale`. | The default language is Portuguese. Set `locale` to `en` for English search results. `get_doc` follows the path language, for example `/en/server/webhooks`. MCP resources also expose indexes at `sendeasy://docs/pt`, `sendeasy://docs/en` and `sendeasy://docs/es`. This MCP server reads public documentation. It does not send messages, modify contacts or access accounts. Do not provide customer tokens to the documentation server. Your integration runs in your own system through the SendEasy API using the appropriate credentials. ## Example prompt ```text Use the official SendEasy documentation to build a Node.js integration that sends a WhatsApp message when a lead submits my form. Search for /api/messages/send and read the full reference in English. Confirm the token type, required fields and phone number format. Use an environment variable for the token, handle errors, and distinguish queue acceptance from final delivery. Cite your sources and do not invent fields. ``` Without MCP, ask the assistant to start at `https://docs.sendeasy.app/en/llms.txt` and follow the relevant Markdown links. ## API authentication The API base URL is `https://backend.sendeasy.app`. Use `Authorization: Bearer YOUR_TOKEN` with the token appropriate to the endpoint: | Operation | Token | Reference | | -------------------- | ------------------- | ------------------------------------------------------------------------- | | `/api/messages/send` | Channel token | [Public API](https://docs.sendeasy.app/en/server/api-publica.md) | | `/api/v1/waba/*` | API Token | [WABA API](https://docs.sendeasy.app/en/server/waba.md) | | `/api/v1/email/*` | Email channel token | [Email API](https://docs.sendeasy.app/en/server/email.md) | | `/api/v1/ai/*` | API Token | [Bots API](https://docs.sendeasy.app/en/server/bots.md) | | `/api/integration/*` | Integration token | [Custom integration](https://docs.sendeasy.app/en/integrations/custom.md) | Keep credentials on your application server. Read the [Technical Reference](https://docs.sendeasy.app/en/server/referencia-tecnica.md) and [webhook formats](https://docs.sendeasy.app/en/server/webhooks.md). An accepted or queued request does not confirm final message delivery. --- # Create and configure AI Bots 1. Open the correct project and select **Bots**. 2. Click **Add**, enter a clear name and write the bot instructions. 3. Define its goal, tone, required customer data, limits and human handoff rules. 4. Select the available model and options, then save. 5. Open the bot to add trusted files and media to its knowledge base. Creating a bot does not activate it. Associate it directly with one or more support stages, or add it as a step in an existing flow and associate that flow with the required stages. If it does not reply, verify that the bot is active, the bot or flow is linked to the correct stage, the flow was saved, the channel is connected and the ticket entered that stage. Sendy can list, create and update bots, manage instructions, files and media, link bots to stages and add a bot to a flow. Activations and deletions require confirmation. Beyond WhatsApp support, the bot can be queried from your own application: see the [Bots API](https://docs.sendeasy.app/en/server/bots.md). --- # Broadcast Campaigns Use campaigns for outbound communication at scale. ## Before launch 1. Validate audience segmentation. 2. Validate templates/content. 3. Configure send windows and rate limits. 4. Define opt-out handling. ## After launch * Track delivery and engagement. * Monitor error rates by provider. * Pause quickly if anomaly is detected. --- # Connect Channels Use this page as a quick checklist to connect channels in your project. ## Basic flow 1. Open your project dashboard. 2. Go to **Connections**. 3. Click **Add Channel**. 4. Select provider/channel type. 5. Complete credentials/verification. 6. Validate status as **Connected**. ## Operational tips * Keep one channel marked as default when required. * Monitor reconnect events and webhook health. * Store provider credentials securely. --- # Create and publish automation flows A flow is an executable automation. It can send messages, wait, call an AI Bot, add tags and move a ticket to another stage. ## Create it manually 1. Open **Flows** and click **New Flow**. 2. Name the flow and add the steps in execution order. 3. To use AI, add an AI Bot step and select an existing bot. 4. Save the flow and associate it with the required support stages. 5. Test with an internal contact before enabling it for customers. You can also describe the complete sequence to Sendy. Sendy must show a full preview and ask for confirmation, then create the real flow. A script or example alone does not mean a flow was created. If a flow does not start, check the stage association and ticket stage. If its bot does not run, verify that the bot step was saved. Outbound steps also require a connected channel. --- # ActiveCampaign Two-way integration with **ActiveCampaign** to sync contacts, lists and trigger automated messages from marketing events. **Documentation in progress.** This page will soon include the configuration walkthrough, list sync, field mapping and common troubleshooting. For now, configure the integration in **Settings → Integrations → ActiveCampaign** inside your Sendeasy account. --- # Booking on your website (embed) With the **embed**, customers pick the service and the time and confirm the booking **without leaving your website**. Paste one line of code on the page: the `embed.js` script mounts booking in a safe `iframe` served by `https://calendar.sendeasy.app`. The fastest way is to generate the code in the dashboard: **Calendar → Public page → Share**. Pick the calendar, the service, the format, the color and the campaign, copy the ready code and check the preview. ## Requirements * Website booking enabled for your company. * A **time slot** calendar with active **event types** (services). Lodging calendars have no embed: use the calendar link. * Your website on **https**. Pages on `http` or opened as a local file cannot show booking. ## Installation Paste the code where booking should show: ```html ``` `YOUR_CALENDAR` is the calendar address, the same as in the link `https://calendar.sendeasy.app/c/YOUR_CALENDAR`. To place booking inside an element of yours (instead of right after the tag), mark the element and load the script once on the page: ```html
``` ## Formats | `data-mode` | What shows | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `inline` (default) | Booking inside the page, right after the tag (or inside the marked element). The height follows the content. | | `popup` | A button where the tag is. Clicking it opens booking in a window over the page. On a marked element that is not a ` ``` * `window.SendeasyCalendar.open(options)` opens the window and returns `true` (or `false` with an invalid calendar). Options: `calendar` (required), `type`, `color`, `lang` and `utm` (`{ source, medium, campaign, term, content }`). * `window.SendeasyCalendar.close()` closes the open window. Since the script loads with `async`, check that `window.SendeasyCalendar` exists before calling it. ## Messages to your website (postMessage v1) Booking notifies the page with `postMessage`. Every message has this shape: ```json { "source": "sendeasy", "v": 1, "type": "..." } ``` | `type` | Fields | When | | -------------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ready` | | Booking has loaded. | | `resize` | `height` (px, up to 20000) | The content height changed. `embed.js` already adjusts the `inline` format by itself. | | `slot_selected` | `date` (`YYYY-MM-DD`), `time` (`HH:mm`) | The customer picked a time. Local date and time of the business. | | `booking.created` | `code`, `status`, `startAt` | The booking was created. `code` is the 8 character code (or `null`), `status` is `HOLD`, `PENDING_PAYMENT`, `AWAITING_APPROVAL`, `CONFIRMED` or `CANCELLED`, and `startAt` is the start in ISO 8601 (UTC). | | `booking.payment_required` | `code` | The booking needs payment; the payment button opens the checkout in a new tab. | | `closed` | | The customer closed booking (Esc or Close), in the `popup` and `button` formats. | Messages **carry no personal data**: no name, email, phone, answers, payment or management links. Booking **accepts no messages** from your page. Always check the origin before using them: ```js window.addEventListener('message', function (event) { if (event.origin !== 'https://calendar.sendeasy.app') return var data = event.data if (!data || data.source !== 'sendeasy' || data.v !== 1) return if (data.type === 'booking.created') { // Example: conversion event in Google Analytics 4 gtag('event', 'booking_created', { status: data.status }) } }) ``` Messages are only sent to `https` pages whose origin the browser gives to the `iframe`. Unknown origin: no message is sent. ## Your website CSP If your website sends a `Content-Security-Policy` header, allow the calendar domain for the script and for the `iframe`: ```http Content-Security-Policy: script-src 'self' https://calendar.sendeasy.app; frame-src https://calendar.sendeasy.app ``` Add these origins to the directives you already use (`script-src` and `frame-src`, or `child-src` if the site does not use `frame-src`). On the Sendeasy side, the `iframe` can be shown by any `https` website. ### Pinned version with SRI (optional) `/embed.js` gets fixes automatically (cached for up to one day). To pin a version with Subresource Integrity, read the version and the hash from the response headers: ```bash curl -sI https://calendar.sendeasy.app/embed.js | grep -i x-sendeasy-embed ``` and use both values: ```html ``` When the script changes, the old version no longer matches the hash and the browser runs nothing: update both values. ## Limits * **Payment always opens in the top level tab**, in a new tab, outside your website. The checkout and the booking management links can never be shown inside an `iframe`. * `https` websites only. `http` pages do not show booking. * Time slot calendars with event types only. Lodging keeps using the calendar link. * The `iframe` keeps nothing between visits (browsers block third party storage); the confirmation stays on screen until the customer closes it. * The booking page inside the `iframe` is not indexed by search engines. To show up on Google, use your Public page and the [Google Business Profile](https://docs.sendeasy.app/en/integrations/calendario/google-business-profile.md). * One window at a time: opening another closes the previous one. ## Common problems | Symptom | What to check | | ------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | Nothing shows | Is the feature enabled for the company? Is the calendar address right? Does the browser console show a CSP block? | | Error page inside the frame | The calendar has no active services, or the `data-type` service does not exist. | | Booking does not show on `http` | The website must be on `https`. | | Payment opens in another tab | That is expected: the checkout never runs inside your website. | --- # Google Business Profile Your **Google Business Profile** (formerly Google My Business) shows on Search and Maps when someone looks for your business. With two Sendeasy links on the profile, customers book straight from there, and bookings are recorded with the **Google Business Profile** origin. The dashboard generates both links: **Calendar → Public page → Share**, **Google Business Profile** section. The step by step and a checklist are there too. ## The two links | Google field | Sendeasy link | | --------------------------------------- | ------------------------------------------------------------------------------------ | | **Website** | Your Public page, when it is live. Without a Public page, the calendar booking link. | | **Appointment links** (**Book** button) | The calendar booking link, optionally already on one service. | Both always carry the same UTM tags: ```text utm_source=google&utm_medium=business_profile&utm_campaign=gbp ``` Examples: ```text https://calendar.sendeasy.app/p/downtown-clinic?utm_source=google&utm_medium=business_profile&utm_campaign=gbp https://calendar.sendeasy.app/c/clinic?type=consultation-30&utm_source=google&utm_medium=business_profile&utm_campaign=gbp ``` `downtown-clinic` is the Public page address, `clinic` the calendar address and `consultation-30` the service address. For lodging, the calendar link is `https://calendar.sendeasy.app/h/YOUR_CALENDAR`. ## Step by step 1. Go to [business.google.com](https://business.google.com/) (or search for your business name on Google) with the account that manages the profile. 2. Click **Edit profile** and open the **Contact** section. 3. In the **Website** field, paste the Website link and save. 4. In **Appointment links**, add the Book button link and save. If more than one booking provider shows up, set your link as preferred. 5. Wait for the Google review, which can take a few days, and check the **Book** button on the profile. 6. Open both links in a private window and make a test booking. Field names can vary a little with the business category and the country. Some categories have no **Appointment links**: in that case, use only the **Website** field. ## Checklist * [ ] Calendar with a public address and active services. * [ ] Calendar linked to the Public page, and the Public page live (for the Website link). * [ ] Same name, address and phone on Google and on the Public page. * [ ] Links tested in a private window. * [ ] Website and Appointment links saved on Google. ## How the origin is measured Whoever arrives through one of these links and books gets the **Google Business Profile** origin. `utm_medium=business_profile` decides; the other UTM tags are recorded as they came. * Do not change the UTM tags: without `utm_medium=business_profile`, the Google visit counts as organic search. * Visits from an AI assistant, from the Sendeasy directory or from a Google ad (with `gclid`) keep their own origin, even with these UTM tags. * The origin applies to bookings made in the same browser over the next 30 days, until the next visit with another origin. * Only the origin is recorded: no visitor data goes into the URL. ## Limits * The **Website** link only points to the Public page when it is published. Before that, the dashboard uses the booking link. * Google reviews the changes and it can take a few days. * Besides your link, Google can show partner booking providers; Google decides which one shows first. * To book inside your own website, see [Booking on your website (embed)](https://docs.sendeasy.app/en/integrations/calendario/embed.md). --- # Calendar Integration Lets **any application** connect a Google Calendar to a Sendeasy calendar and keep both sides in sync — without going through the console. The connection is made through the **public API** (`/api/v1/calendars/...`), authenticated with the company's **API token**. Once connected, Sendeasy handles **webhooks** and event **synchronization** on its own. **Translation in progress.** The full guide is available in Portuguese: [Integração com Calendário](https://docs.sendeasy.app/integrations/calendario.md). ## Endpoints | Method | Endpoint | Description | | -------- | ---------------------------------------------------- | ---------------------------- | | `GET` | `/api/v1/calendars` | List the company's calendars | | `GET` | `/api/v1/calendars/{id}/integrations/google/connect` | Get the authorization URL | | `GET` | `/api/v1/calendars/{id}/integrations/google` | Integration status | | `PUT` | `/api/v1/calendars/{id}/integrations/google` | Update options | | `DELETE` | `/api/v1/calendars/{id}/integrations/google` | Disconnect the integration | --- # Custom Integration The **Custom** integration generates a generic token that your application uses to call Sendeasy's public API and send messages (WhatsApp, Email or SMS), without needing a built-in connector. Full documentation of the endpoint, per-channel payloads and response codes lives at [Integrations (Server)](https://docs.sendeasy.app/en/server/integracoes.md). Configure the token in **Settings → Integrations → Custom Integration** inside your Sendeasy account. The token can be viewed at any time by the account administrator. --- # Eduzz — Events Sendeasy reacts to 5 Eduzz event types: invoice/pix issued, payment confirmed, refund, cancellation and expiration. **Documentation in progress.** This page will soon include the full event list with payloads, HMAC-SHA256 validation, mapping to WhatsApp and/or email send, and troubleshooting tips. --- # Eduzz Integration with **Eduzz** via webhooks to react to sales events (invoice paid, purchase confirmed, refund, etc.) by sending automated WhatsApp and email messages. **Documentation in progress.** This page will soon include the configuration walkthrough, supported events, HMAC validation and common troubleshooting. For now, configure the integration in **Settings → Integrations → Eduzz** inside your Sendeasy account. --- # Eduzz — Setup Step-by-step guide to connecting Eduzz and starting to receive sales events. **Documentation in progress.** This page will soon cover HMAC key creation, the webhook URL to register on Eduzz, event mapping and an end-to-end test. --- # GreatPages Sendeasy integration with the **GreatPages** platform, to receive leads from landing pages and start conversations automatically. **Documentation in progress.** This page will soon include the configuration walkthrough, expected payload format and common troubleshooting. For now, configure the integration in **Settings → Integrations → GreatPages** inside your Sendeasy account. --- # Respondi Sendeasy integration with the **Respondi** platform, to receive leads and trigger them as WhatsApp conversations. **Documentation in progress.** This page will soon include the configuration walkthrough, expected payload format and common troubleshooting. For now, configure the integration in **Settings → Integrations → Respondi** inside your Sendeasy account. --- # WABA — Webhook events Sendeasy forwards every event received from Meta to your configured webhook: incoming messages, delivery/read statuses, failures, template status changes and more. **Documentation in progress.** This page will soon list each event type (`messages`, `statuses`, `template_status_update`) with payload, HMAC signature and examples. --- # WABA Integration with the official **WhatsApp Business API** (Cloud API). Enables authenticated message sending, approved templates and high-volume operation within Meta's official policies. **Documentation in progress.** This page will soon include the configuration walkthrough, phone number linking, template creation and approval, and common troubleshooting. For now, configure the integration in **Settings → Integrations → WABA** inside your Sendeasy account. ## Request contact sharing [Request contact sharing](https://docs.sendeasy.app/en/integrations/waba/request-contact.md): Request a phone number through WABA/BSUID or ZuckZapGo/LID using the SendEasy public API. --- # Request contact sharing Send a message with the native share-contact button. The recipient chooses whether to share their phone number with the business. ## Routes and authentication Use the company API token created in **Settings → Integrations → API Tokens**. Restricted tokens need the `waba` scope, including on the unified route. Legacy tokens without scopes remain allowed. `CHANNEL_UUID` must belong to the token company. | POST | Authentication | | ----------------------------------------------- | ---------------------------------------------------------------------------------- | | `/api/v1/channels/CHANNEL_UUID/request-contact` | WABA or ZuckZapGo; company API token | | `/api/v1/waba/CHANNEL_UUID/request-contact` | WABA only; company API token | | `/api/messages/request-contact` | Channel associated with the connection token; Authorization: Bearer CHANNEL\_TOKEN | ## WABA example: request by phone number Replace `CHANNEL_UUID`, `YOUR_API_TOKEN` and the phone number with your integration values. Include the country code and use digits only. The message text must contain 1 to 1024 characters. ```bash curl --request POST 'https://backend.sendeasy.app/api/v1/channels/CHANNEL_UUID/request-contact' \ --header 'Authorization: Bearer YOUR_API_TOKEN' \ --header 'Content-Type: application/json' \ --data '{"to":"5511999999999","body":"Share your contact so we can continue assisting you."}' ``` ## WABA: contact without a phone number If you receive only a BSUID, pass that opaque identifier in `to` unchanged. A username is a display attribute and does not replace the recipient identifier. SendEasy sends a native `request_contact_info` message to Meta. Availability and sending rules depend on the account and provider. ```json { "to": "BR.Example123", "body": "Share your contact so we can continue assisting you." } ``` ## ZuckZapGo: phone number or LID For a WhatsApp channel using ZuckZapGo/WuzAPI, use the same unified route and include `id`, required with 1 to 128 alphanumeric characters. The recipient can be a phone number, phone JID or full LID. BSUIDs, usernames, groups and device-suffixed JIDs are not accepted by this integration. ```json { "to": "123456789012345@lid", "body": "Share your contact so we can continue assisting you.", "id": "ContactRequest202610060001" } ``` ## Response and delivery confirmation HTTP 200 returns the provider response. For WABA, `messages[0].id` identifies the accepted message. Acceptance does not confirm delivery: follow Meta `statuses` events or query the status route below. This endpoint does not itself create an outgoing message or a ticket in the WABA inbox. ```json { "messaging_product": "whatsapp", "contacts": [{ "input": "5511999999999", "wa_id": "5511999999999" }], "messages": [{ "id": "wamid.EXAMPLE" }] } ``` ```bash curl 'https://backend.sendeasy.app/api/v1/waba/CHANNEL_UUID/messages/MESSAGE_ID/status' \ --header 'Authorization: Bearer YOUR_API_TOKEN' ``` ## When the recipient shares their contact The shared contact follows the normal inbound message flow, and the original payload is preserved when forwarding webhooks. For the official API, the card has `origin: "contact_request"`; the phone is in `contacts[].phones[].wa_id`. For ZuckZapGo, the `Message` event has `contactMessage.isSelfContact: true`; the vCard contains the shared identity. Correlation uses the conversation within the company and channel. An ordinary third-party contact card must not replace the sender identity. ## Errors and retries The stable ID and idempotency described here apply to ZuckZapGo. Reuse the same `id` and payload when a retry is allowed. SendEasy does not automatically retry. Including `id` on WABA does not add sending idempotency. | Error | Meaning | | ----------------------------------- | ---------------------------------------------------------------------------------------- | | `CONTACT_REQUEST_BODY_INVALID` | Empty text or more than 1024 characters. | | `CONTACT_REQUEST_RECIPIENT_INVALID` | Recipient is invalid for the provider. | | `CONTACT_REQUEST_ID_REQUIRED` | ZuckZapGo requires an alphanumeric ID with 1 to 128 characters. | | `CHANNEL_NOT_FOUND` | Channel is missing or outside the token company. | | `CONTACT_REQUEST_DISPATCH_UNKNOWN` | Outcome is unknown after a timeout/transport failure. Do not automatically resend. | | `contact_request_dispatch_unknown` | The provider cannot determine whether it dispatched. Do not resend or generate a new ID. | | `contact_request_id_conflict` | The ID was reused with different data. | Other errors retain the provider HTTP status and details in `provider`. Confirm that the account supports this message type. A failure documented by the provider as occurring before dispatch may allow a retry with the same ID and payload. See also [Public API](https://docs.sendeasy.app/en/server/api-publica.md) and [WABA API](https://docs.sendeasy.app/en/server/waba.md). --- # WABA — Setup Step-by-step guide to linking a phone number to the WhatsApp Business API (Cloud API) on Sendeasy. **Documentation in progress.** This page will soon include Meta Business prerequisites, Meta for Developers app creation, phone number linking, webhook verification and a test send. --- # WABA — Templates Templates are message formats pre-approved by Meta, used to start conversations outside the 24-hour window. **Documentation in progress.** This page will soon cover creation via Sendeasy, Meta approval policy, variables and send examples using `POST /api/v1/waba/:whatsappId/send`. --- # Webhook The **Webhook** integration sends events from your Sendeasy project (incoming/outgoing messages, delivery status, ticket changes, etc.) to an HTTPS URL of yours. Webhooks can be configured at two scopes: * **General** — receives events from every channel in the company. * **Per specific channel** — receives events only from the chosen channel. Full documentation, with event payload format and examples, is in [Integrations (Server)](https://docs.sendeasy.app/en/server/integracoes.md) and [Webhooks](https://docs.sendeasy.app/en/server/webhooks.md). Configure webhooks in **Settings → Integrations → Webhook** inside your Sendeasy account. --- # Set Up Kanban Kanban helps your team manage stages, ownership and SLA. ## Recommended setup 1. Define stages by business process. 2. Set entry rules for each stage. 3. Configure assignment rules. 4. Track bottlenecks by stage aging. ## Good practices * Keep stage names short and clear. * Avoid duplicate stage semantics. * Review stage metrics weekly. --- # Lead Capture Lead capture supports source tracking, enrichment and routing. ## Core fields * Name * Phone * Email * Source / UTM metadata ## Routing suggestions 1. Route by campaign/source. 2. Assign by region or queue. 3. Attach tags for downstream automations. --- # Introduction Welcome to Sendeasy documentation. This English section is focused on onboarding, integrations, and technical references so teams can implement fast. ## Where to start 1. Create your project. 2. Connect channels. 3. Configure workflows (Kanban, bots, automations). 4. Integrate using Server API or Web integrations. ## Developer-first docs If your team is integrating with public APIs and webhooks, start with: * [/en/server](https://docs.sendeasy.app/en/server.md) * [/en/server/referencia-tecnica](https://docs.sendeasy.app/en/server/referencia-tecnica.md) * [/en/server/api-publica](https://docs.sendeasy.app/en/server/api-publica.md) * [/en/server/webhooks](https://docs.sendeasy.app/en/server/webhooks.md) Need help with a specific integration flow? Use the support chat inside the platform and share your request/response payloads for faster troubleshooting. --- # Create a project and workspace In Sendeasy, a **project is the company workspace**. It contains the team, channels, contacts, tickets, Kanban, bots, flows, calendars and integrations. There is no separate “create workspace” step. ## Step by step 1. Sign in to the [Sendeasy console](https://console.sendeasy.app/). 2. On **Projects**, click **New Project**. 3. Enter the company name and the responsible person's name, email and mobile number. 4. Click **Next**, choose a plan and click **Create project**. 5. Complete checkout when it is displayed. 6. Open the new project card to enter the workspace. ## Recommended setup order 1. Connect a channel in **Channels**. 2. Create support stages in **Kanban**. 3. Invite agents and set permissions. 4. Configure bots or flows and associate them with the right stages. 5. Run a controlled test conversation. Each project is isolated. Channels, data and permissions are not automatically shared between projects. Sendy can manage resources inside the current project. The main project and plan are created through Projects so the owner can confirm commercial details. --- # Configure and use Sendpay Sendpay creates charges and Sendeasy checkout links. Funds are processed by and paid directly to your connected gateway account. | Gateway | PIX | Card | | ------------ | --- | ---- | | Stripe | No | Yes | | Mercado Pago | Yes | Yes | | Asaas | Yes | Yes | The Sendeasy Sendpay checkout offers PIX and cards, not bank slips. ## Setup 1. Open **Sendpay > Settings** and select a gateway. 2. Copy credentials from the gateway's official dashboard. 3. Enter the requested public and secret keys. 4. Enable supported methods and save. 5. Register the Sendeasy webhook URL and webhook secret in the gateway. 6. Create a small test charge and verify its status update. With Sendy, put the provider key in the secure **Credentials > Sendpay** field, then request the configuration in chat. The temporary key never enters the conversation and the change always requires confirmation. Never paste secrets into chat. Sendy can report whether a key is configured, but cannot reveal its value. --- # Public API (Server) ## Base URL ```txt https://backend.sendeasy.app ``` ## Authentication models 1. Channel token (`/api/messages/send`, `/api/v1/email/*`) 2. API token (`/api/v1/waba/*`, `/api/v1/ai/*`) 3. Integration token (`/api/integration/generic`) ## Main endpoints | Method | Endpoint | Auth | | ------ | -------------------------------- | ---------------------------------------------------------------------------------------------- | | `POST` | `/api/messages/send` | Channel token | | `POST` | `/api/integration/generic` | Integration token | | `POST` | `/api/v1/email/send` | Email channel token — see [/en/server/email](https://docs.sendeasy.app/en/server/email.md) | | `GET` | `/api/v1/email/health` | Email channel token | | `POST` | `/api/v1/ai/completion` | API token — see [/en/server/bots](https://docs.sendeasy.app/en/server/bots.md) | | `POST` | `/api/v1/ai/extract` | API token | | `POST` | `/api/v1/ai/search` | API token | | `GET` | `/api/v1/ai/health` | API token | | `POST` | `/api/v1/diagnostic-submissions` | API token — see [/en/server/diagnosticos](https://docs.sendeasy.app/en/server/diagnosticos.md) | ## Success and error contracts Success example: ```json { "message": "Message queued successfully" } ``` Error example: ```json { "error": "ERR_NO_PERMISSION" } ``` ## Translation strategy Keep `error` as canonical key and resolve display messages by locale in your client. --- # Bots API Use Sendeasy's AI **from your own application** — an assistant inside your product, a routine in your backend, a screen that summarizes documents — without going through WhatsApp. The bot carries the instructions: you create and edit it in the panel, and pass its `botId` here. Changing how the AI behaves means editing the bot, not changing your code. ## Prerequisites 1. **Project API Token** — in **Integrations → WABA** → *API Tokens* section, where you create a named token and can revoke it. It is the same token used by the WABA API and the Email API: one per project, not one per product. 2. **A bot created** in the panel, with its instructions and knowledge sources — see [/en/bot](https://docs.sendeasy.app/en/bot.md). Keep the `botId`. 3. **Bot credits** available in the project plan. Use [`GET /api/v1/ai/health`](https://docs.sendeasy.app/en/server/bots.md#integration-diagnostics) to check the integration without spending credits. ## Authentication Required header: ```http Authorization: BearerHi! Click the link below to create a new password.
" }' ``` Success response: ```json { "success": true, "id": "9fbbb3a9-4c1e-4b1a-9d1e-0c2b7e3f5a61" } ``` `id` is the provider's identifier for the send. The response confirms the email was **accepted for delivery** — final delivery depends on the recipient's mail server. ## Integration diagnostics ```txt GET /api/v1/email/health ``` Does not consume credits. Tells whether the token's email is already verified — the most common reason a send fails even with credits available. ```bash curl --location 'https://backend.sendeasy.app/api/v1/email/health' \ --header 'Authorization: Bearer EMAIL_TOKEN' ``` ```json { "ok": true, "senderConfigured": true, "sender": "no-reply@yourcompany.com", "domain": "yourcompany.com", "channelId": 12 } ``` With `senderConfigured: false`, finish verifying the email in **Channels → Email** before sending. (With the project API Token the response has no `channelId` and tells whether the project has *any* verified email.) ## Credits and refunds * Every accepted send debits **1 email credit** from the project. * With no credits, the route answers `402 ERR_NO_EMAIL_CREDITS` **before** any debit. * If the send fails **after** the debit (sender not configured, provider unavailable), the credit is **refunded automatically** and the route answers `502`/`503`. ## Error codes | HTTP | `error` | When it happens | | ---- | ------------------------------------------------------ | --------------------------------------------------------------------------------------- | | 400 | `ERR_EMAIL_INVALID_BODY` | invalid payload (missing `to`/`subject`, neither `html` nor `text`, no valid recipient) | | 400 | `ERR_EMAIL_TOO_MANY_RECIPIENTS` | more than 10 recipients in one send | | 401 | `ERR_API_TOKEN_NOT_PROVIDED` / `ERR_API_TOKEN_INVALID` | header missing or token invalid/inactive | | 402 | `ERR_NO_EMAIL_CREDITS` | project has no email credits | | 429 | `ERR_PUBLIC_EMAIL_RATE_LIMIT` | more than 20 requests per minute | | 502 | `ERR_EMAIL_SEND_FAILED` | provider failure while sending (credit refunded) | | 503 | `ERR_EMAIL_SENDER_NOT_CONFIGURED` | the token's email is not verified yet (with an email token, before any debit) | ## Email API vs. Custom integration Sendeasy offers two ways to send email by API — pick by the kind of token you have: | | Email API (`/api/v1/email/send`) | Custom (`/api/integration/generic`) | | ----------- | ------------------------------------------------ | ------------------------------------------------------ | | Token | **email token** (Channels → Email → Sending API) | integration token bound to **one** email channel | | Sender | the email that owns the token | the token's channel | | Typical use | transactional emails from your own application | per-channel integrations with `bcc`, `inReplyTo`, etc. | Custom integration details at [/en/server/integracoes](https://docs.sendeasy.app/en/server/integracoes.md). **Security:** treat the token like a password. Never embed it in browser JavaScript, public repositories or logs — keep it in environment variables or a secret manager on your server. --- # Integrations (Server) Sendeasy offers two integration products: * **Webhook** — Sendeasy pushes events from your project to a URL you control. * **Custom (generic)** — your application calls Sendeasy to send messages. Webhooks support **two scopes**: * **General**: receives events from **every** channel of the company. * **Channel-specific**: receives events **only** from the chosen channel (one WhatsApp instance, one Email mailbox, one SMS number). The two scopes coexist: you can have 1 general webhook + N per-channel webhooks active at the same time. Each event fires the UNION of applicable webhooks (general + specific). **Custom** tokens always require a specific channel. ## UI configuration Go to **Settings → Integrations**. There you'll see a list of integrations. For each one: 1. Click **New integration**. 2. For webhook, choose the **scope**: *General (all channels)* or *Specific channel*. 3. If "Specific channel", pick the **type** (`whatsapp`/`email`/`sms`) and instance. 4. For **webhook**: provide the URL and, optionally, a bearer token sent in the `Authorization` header. 5. For **custom**: the token is generated by the system and shown **only once**. Copy and save it immediately. ## Sending messages — `POST /api/integration/generic` This endpoint now has **different payloads per channel type**. The destination channel is **derived from the token** — your application does NOT send `channelType` in the body. A token created for Email can only send Email; an SMS token can only send SMS. Required header: ``` Authorization: BearerThanks for your purchase!
", "bcc": ["archive@company.com"] }' ``` ```json { "success": true, "channel": "email", "messageId": "msg_abc123", "contactId": null } ``` | Field | Type | Required | | ---------------- | ------------------------------- | -------- | | `to` | `string` or `string[]` (emails) | yes | | `subject` | `string` | yes | | `body` or `html` | `string` | one of | | `bcc` | `string` or `string[]` | no | | `text` | `string` | no | | `fromName` | `string` | no | | `inReplyTo` | `string` | no | | `references` | `string` or `string[]` | no | The sender address (`fromEmail`) is the channel bound to the token. ### SMS ```bash curl -X POST https://backend.sendeasy.app/api/integration/generic \ -H "Authorization: Bearer 12G3N3R1$..." \ -H "Content-Type: application/json" \ -d '{ "to": "+5511999999999", "body": "Your code: 123456" }' ``` ```json { "success": true, "channel": "sms", "messageId": "SMxxxxxxxx", "contactId": null } ``` | Field | Type | Required | | ----------- | ------------------------- | -------- | | `to` | `string` (E.164 with `+`) | yes | | `body` | `string` (≤ 1600 chars) | yes | | `mediaUrls` | `string[]` (public URLs) | no | | `metadata` | `object` | no | ## Response codes | HTTP | `error` | Meaning | | ---- | ------------------- | ------------------------------------ | | 200 | — | Success | | 400 | `VALIDATION_ERROR` | Invalid payload — see `details[]` | | 401 | `ERR_NO_PERMISSION` | Missing/invalid token | | 402 | `PROVIDER_ERROR` | No credits on this channel | | 404 | `CHANNEL_NOT_FOUND` | Channel deleted after token created | | 502 | `PROVIDER_ERROR` | Provider failure (Twilio, Resend, …) | | 410 | `GONE` | Deprecated legacy endpoint | ## Token rotation `custom` tokens can be rotated at any time under **Settings → Integrations**. **Rotation invalidates the previous token immediately.** We recommend periodic rotation (90 days) and immediate rotation on suspected leaks. ## Security **Never** embed tokens in browser JavaScript, public repos, screenshots, or logs. Treat the token like a password. Store it in environment variables, a vault, or a secret manager. If exposed, rotate immediately. ## Where to manage All token and webhook management lives on the platform, under **Settings → Integrations**. Previously created tokens continue to work — just review and adjust the configuration on the new screen. --- # Server Integration This section is the technical entry point for backend integrations with Sendeasy. ## What is covered * **Technical Reference**: practical request/response contracts. * **Public API**: authentication, payloads and endpoint catalog. * **Integrations**: public Generic flow. * **WABA API**: template and media endpoints. * **Email API**: transactional email sending via `/api/v1/email/*`, billed in project credits. * **Bots API**: text generation, PDF extraction and search via `/api/v1/ai/*`, billed in project bot credits. * **Webhooks**: events effectively forwarded to your project webhook. * **Error Translations**: multilingual error catalog strategy. ## Recommended reading order 1. [/en/server/referencia-tecnica](https://docs.sendeasy.app/en/server/referencia-tecnica.md) 2. [/en/server/api-publica](https://docs.sendeasy.app/en/server/api-publica.md) 3. [/en/server/integracoes](https://docs.sendeasy.app/en/server/integracoes.md) 4. [/en/server/waba](https://docs.sendeasy.app/en/server/waba.md) 5. [/en/server/email](https://docs.sendeasy.app/en/server/email.md) 6. [/en/server/bots](https://docs.sendeasy.app/en/server/bots.md) 7. [/en/server/webhooks](https://docs.sendeasy.app/en/server/webhooks.md) 8. [/en/server/traducoes](https://docs.sendeasy.app/en/server/traducoes.md) --- # Technical Reference Developer-focused runbook for real integrations: endpoint, payload, response and operational behavior. ## Integration TL;DR * Base URL: `https://backend.sendeasy.app` * Auth: `Authorization: Bearer...
", "messageId": "