- Início
- Desenvolvedores
A Core API do WACRM para desenvolvedores e agentes
A Core API do WACRM permite que um desenvolvedor ou um agente de IA leia e escreva contatos, conversas, modelos e mensagens de WhatsApp, chame os endpoints de IA medidos e confira o saldo de tokens. Cada requisição usa uma chave de API com escopo, e cada envio leva um Idempotency-Key para nunca sair duas vezes.
Por a equipe WACRM Atualizado em
URL de produção https://api.wacrm.ai/v1 — sandbox https://api-sandbox.wacrm.ai/v1 para testes
Autentique-se com uma chave de API (Authorization: Bearer) ou uma sessão do Workspace (Basic/JWT); os escopos são concedidos por chave na criação
POST /v1/messages, POST /v1/agent-actions e POST .../tasks exigem um cabeçalho Idempotency-Key
Todo erro é um objeto JSON: {"error": {"code", "message"}} — nunca um texto simples ou um stack trace
Uma referência completa de endpoints abaixo é gerada direto de docs/api/openapi-v1.yaml a cada build
Sem console interativo nesta página — as chaves são criadas e usadas apenas no seu próprio Workspace
Autenticação, escopos e idempotência
Toda rota v1 confere os escopos da credencial antes de qualquer outra coisa: uma chave criada sem
contacts:write, por exemplo, recebe 403 insufficient_scope em
POST /v1/contacts não importa o plano do projeto. A maioria dos escopos é opcional na criação —
só alguns padrões (como templates:read para uma chave de loja) são concedidos automaticamente,
então uma chave só tem o acesso que de fato recebeu.
Uma escrita que nunca deveria rodar duas vezes — enviar uma mensagem, propor uma ação de agente, criar uma
tarefa a partir de uma conversa — exige um cabeçalho Idempotency-Key fornecido por quem chama.
Repetir a mesma requisição com a mesma chave reproduz a primeira resposta ao pé da letra, em vez de enviar ou
criar algo uma segunda vez, o que é o que permite repetir com segurança depois de uma falha de rede. Para
POST /v1/messages essa janela de repetição é de 24 horas; para propor uma ação de agente ou criar
uma tarefa, a chave é única por projeto e não expira.
Fale com um especialista
Huy Nguyen (David), Fundador e CEO
Pergunte qual endpoint combina com sua integração, ou como funcionam escopos e idempotência.
Referência de endpoints
Gerada a cada build a partir do mesmo arquivo openapi-v1.yaml contra o qual a própria Core API é testada por contrato — cada caminho, método e escopo exigido abaixo vem direto desse arquivo, agrupado pela sua tag do OpenAPI.
Versão do OpenAPI: 1.0.0
| Servidores | URL |
|---|---|
| Production | https://api.wacrm.ai/v1 |
| Sandbox (test API keys only, no wallet charges) | https://api-sandbox.wacrm.ai/v1 |
Projects
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /health | Liveness/readiness check (public, no auth, no DB write) | nenhum (público) |
GET | /crm-projects | List projects owned by the authenticated account | projects:read |
GET | /crm-projects/current | Resolve the project for the current credential (store API key, Wix app instance, etc.) | projects:read |
GET | /crm-projects/{project} | Get a project by id | projects:read |
GET | /crm-projects/{project}/plan | Current plan, the full plan catalog, and seat/contact usage for a project (screen 21 "Plans & Upgrade") | projects:read |
GET | /crm-projects/{project}/storage-usage | Storage quota usage for a project (job m5-storage-backup, M5 R-STO-02) | projects:read |
GET | /crm-projects/{project}/ai-pause | Read the project's AI pause switch and auto-send opt-in | projects:read |
PUT | /crm-projects/{project}/ai-pause | Pause/resume AI auto-reply and set the auto-send opt-in | agent:approve |
GET | /crm-projects/{project}/export | Export this project's own data as NDJSON | export:read |
POST | /crm-projects/{project}/plan/checkout | Start a PayPal recurring-subscription checkout for a WACRM plan (SANDBOX ONLY) | billing:write |
GET | /crm-projects/{project}/meta-pages | List this project's connected Messenger/Instagram Pages | meta_dm:read |
POST | /crm-projects/{project}/meta-pages | Connect a Facebook Page (Messenger) or linked Instagram Professional account | meta_dm:write |
DELETE | /crm-projects/{project}/meta-pages/{metaPage} | Disconnect a Messenger/Instagram Page | meta_dm:write |
GET | /crm-projects/{project}/contacts/{contact}/billing-history | A contact's payment/billing history, for the Inbox contact panel (R-WRK-04) | projects:read |
GET | /crm-projects/{project}/cost-report | Meta WhatsApp cost report (by number/campaign/date range) and a 30-day forecast (job m5-cost-reports, R-WA-09) | cost_reports:read |
GET | /crm-projects/{project}/contacts/{contact}/quotes | A contact's quotes ("Deal"/"Quote draft"), for the Sales B2B Chrome edition (job m8-chrome-sales-b2b) | quotations:read |
GET | /crm-projects/{project}/social-comments | List this project's Facebook Page / Instagram comments | meta_comments:read |
POST | /crm-projects/{project}/social-comments/{comment}/replies | Propose a public reply to a comment (ALWAYS needs human approval) | meta_comments:write |
POST | /crm-projects/{project}/social-comments/{comment}/private-reply | Send a one-time private reply to a comment | meta_comments:write |
POST | /crm-projects/{project}/social-comments/{comment}/hide | Hide a comment (direct human action) | meta_comments:write |
DELETE | /crm-projects/{project}/social-comments/{comment} | Delete a comment (direct human action) | meta_comments:write |
Auth
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /auth/extension/sessions | Start a device-code login session for the Chrome extension | nenhum (público) |
GET | /auth/extension/sessions/{session_id} | Poll a device-code login session | nenhum (público) |
POST | /auth/extension/sessions/{session_id}/approve | Approve a pending extension session (called from the logged-in Workspace tab) | nenhum (público) |
Wallet
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /token-balance | Current token balance and this cycle's usage | wallet:read |
AI
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /account/ai-usage | Per-AI-action call count and net tokens deducted | ai:read |
POST | /ai/translate | Translate text | ai:write |
POST | /ai/detect-language | Detect the language of a text | ai:read |
POST | /ai/summarize | Summarize a contact's conversation | ai:write |
POST | /ai/suggest-reply | Suggest reply drafts for a conversation (never sent automatically) | ai:write |
POST | /ai/product-answer | Draft a grounded answer to a product question (never an invented price) | ai:write, products:read |
POST | /ai/classify-message | Classify a message's intent and sentiment (job P27-ai-services-batch-a) | ai:write |
POST | /ai/extract-entities | Extract structured entities for a kind (order/address/booking/invoice) (job P27-ai-services-batch-a) | ai:write |
POST | /ai/score-lead | Score how sales-qualified a contact is, with a suggested next step (job P27-ai-services-batch-b) | ai:write |
POST | /ai/triage-alert | Group and rank the priority of a batch of Care alerts (job P27-ai-services-batch-b) | ai:write |
POST | /ai/suggest-next-action | Suggest the next best action for a B2B sales deal (job P27-ai-services-batch-b) | ai:write |
POST | /ai/booking-faq | Answer a booking FAQ (never an invented price or opening hour) (job m4-booking-ai-receptionist) | ai:write |
POST | /ai/booking-actions | Propose a book/reschedule/cancel action (job m4-booking-ai-receptionist) | ai:write, bookings:write |
POST | /ai/booking-actions/{action}/approve | Approve a proposed booking action, executing it through the booking core (job m4-booking-ai-receptionist) | ai:write, bookings:write |
GET | /glossary-terms | List this project's translation glossary terms (ordered by target_lang, term) | ai:read |
POST | /glossary-terms | Add a forced replacement applied to `POST /ai/translate` for a language pair | ai:write |
DELETE | /glossary-terms/{term} | Delete a glossary term | ai:write |
POST | /ai/transcribe-voice | Transcribe an existing voice-note attachment of this project (job P27-ai-services-batch-c) | ai:write |
POST | /ai/ocr-image | Extract text from an existing image attachment of this project (job P27-ai-services-batch-c) | ai:write |
POST | /ai/draft-template | Draft a WhatsApp template body from a freeform instruction (job P27-ai-services-template-tools) | ai:write |
POST | /ai/check-template-policy | Check draft template content against the brand-safety lint rules (job P27-ai-services-template-tools) | ai:read |
Products
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /commerce/products | List products (search by name or SKU) | products:read |
GET | /commerce/products/{product} | Get a product, with its SKU/price/currency/stock and variants | products:read |
Orders
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /commerce/orders | List orders (filter by contact phone/email, status, date) | orders:read |
GET | /commerce/orders/{order} | Get an order, with its lines (quantity, resolved product, sku, price) | orders:read |
GET | /commerce/orders/{order}/confirmation | Order-confirmation and COD two-way confirmation state for one order | orders:read |
GET | /commerce/order-automation | Read the project's order-automation settings (new order -> WhatsApp utility template, COD confirm) | orders:read |
PUT | /commerce/order-automation | Update the project's order-automation settings | orders:write |
Contacts
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /contacts | List contacts | contacts:read |
POST | /contacts | Create a contact | contacts:write |
GET | /contacts/{contact} | Get a contact | contacts:read |
PATCH | /contacts/{contact} | Update a contact | contacts:write |
DELETE | /contacts/{contact} | Erase a contact on request (hard delete) | contacts:write |
Audit
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /audit-logs | List this project's activity/audit log (newest first) | audit:read |
Labels
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /contacts/{contact}/labels | Attach a label to a contact | labels:write |
DELETE | /contacts/{contact}/labels/{label} | Remove a label from a contact | labels:write |
GET | /labels | List labels | labels:read |
POST | /labels | Create a label | labels:write |
DELETE | /labels/{label} | Delete a label | labels:write |
Notes
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /contacts/{contact}/notes | List notes on a contact | notes:read |
POST | /contacts/{contact}/notes | Add a note to a contact | notes:write |
Tickets
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /contacts/{contact}/tickets | List tickets on a contact | tickets:read |
POST | /contacts/{contact}/tickets | Create a ticket on a contact | tickets:write |
PATCH | /tickets/{ticket} | Update a ticket (e.g. change status) | tickets:write |
Templates
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /message-templates | List quick replies / WhatsApp message templates | templates:read |
POST | /message-templates | Create a template | templates:write |
PATCH | /message-templates/{template} | Update a template | templates:write |
Messages
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /contacts/{contact}/messages | Read a contact's WhatsApp conversation (watermark pagination) | contacts:read |
POST | /messages | Send a WhatsApp message (text or template) | messages:send |
Conversations
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /conversations | List conversations (Workspace Inbox) | contacts:read |
MCP
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /mcp/actions/authorize | Authorize one MCP tool call before `apps/mcp` invokes the tool's own endpoint (job P27-mcp-metering) | nenhum (público) |
Channels
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /channels/whatsapp/connect-sessions | Start a WhatsApp Embedded Signup connect session | channels:write |
POST | /channels/whatsapp/connect-sessions/{session}/complete | Complete a connect session (code -> token, debug_token-verified before trusting waba_id/phone_number_id) | channels:write |
POST | /channels/{channel}/activate | Activate a connected number (subscribed_apps) — connected -> active | channels:write |
GET | /channels | List this project's connected channels | channels:read |
Export
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /export/conversations | WorkChat-compat alias of GET /conversations (read-only, same scope and shape) | contacts:read |
GET | /export/contacts | WorkChat-compat alias of GET /contacts (read-only, same scope and shape) | contacts:read |
GET | /export/messages | WorkChat-compat alias of GET /contacts/{contact}/messages (contact_id moved to query — see docs/api/README.md) | contacts:read |
Webhooks
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /webhook-endpoints | List this project's outbound webhook endpoints (secret never included) | wa_webhooks:read |
POST | /webhook-endpoints | Create a webhook endpoint — the secret is returned once, in this response only | wa_webhooks:write |
DELETE | /webhook-endpoints/{endpoint} | Delete a webhook endpoint | wa_webhooks:write |
Broadcasts
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /segments | List this project's saved audience segments | broadcasts:read |
POST | /segments | Create a saved audience segment | broadcasts:write |
GET | /contacts/{contact}/consent | Read a contact's current WhatsApp consent status | contacts:read |
POST | /contacts/{contact}/consent | Record a contact's WhatsApp consent decision (upserts the current row) | consent:write |
POST | /broadcasts | Create a draft broadcast (template + segment, not started) | broadcasts:write |
GET | /broadcasts/{broadcast} | Read a broadcast's status and counts | broadcasts:read |
POST | /broadcasts/{broadcast}/start | Start (or continue pumping) a broadcast — draft/paused/running -> running | broadcasts:write |
POST | /broadcasts/{broadcast}/pause | Pause a running broadcast | broadcasts:write |
Work
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /conversations/{conversation}/tasks | Create a task from a conversation | work:write |
GET | /conversations/{conversation}/tasks | List tasks created from a conversation | work:read |
POST | /work/callbacks | Inbound task status update from the Work side | nenhum (público) |
Agent
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /agent-actions | List this project's agent actions | agent:propose |
POST | /agent-actions | Propose an agent action (auto-executes when the policy engine decides low risk) | agent:propose |
POST | /agent-actions/{action}/approve | Approve a proposed action, executing it through the guarded services | agent:approve |
POST | /agent-actions/{action}/reject | Reject a proposed action — it is never executed | agent:approve |
Relay
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /webhooks/meta/relay | Inbound WhatsApp traffic forwarded by the path-B relay (internal, not a customer-facing resource) | nenhum (público) |
Bookings
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
GET | /crm-projects/{project}/booking-services | List this project's bookable services | bookings:read |
POST | /crm-projects/{project}/booking-services | Create a bookable service | bookings:write |
PATCH | /crm-projects/{project}/booking-services/{service} | Update a bookable service | bookings:write |
GET | /crm-projects/{project}/availability | Derived free slots for a service on one calendar date | bookings:read |
GET | /crm-projects/{project}/bookings | List this project's bookings | bookings:read |
POST | /crm-projects/{project}/bookings | Book a slot | bookings:write |
PATCH | /crm-projects/{project}/bookings/{booking} | Reschedule a booking (moves it, never creates a second row) | bookings:write |
POST | /crm-projects/{project}/bookings/{booking}/cancel | Cancel a booking (sets status + cancelled_at, keeps the row) | bookings:write |
GET | /public/store/{slug}/booking-services | Public, token-free list of a project's bookable services (WACRM-hosted booking page) | nenhum (público) |
GET | /public/store/{slug}/availability | Public, token-free derived free slots for one service/date (WACRM-hosted booking page) | nenhum (público) |
POST | /public/store/{slug}/bookings | Public, token-free booking create (WACRM-hosted booking page) | nenhum (público) |
Client portal
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /crm-projects/{project}/contacts/{contact}/client-portal-links | Mint a client portal link for a contact | client_portal:write |
POST | /crm-projects/{project}/client-portal-links/{link}/revoke | Revoke a client portal link (one-way; mint a new one if needed) | client_portal:write |
GET | /client-portal/{token} | Public, token-guarded read of one contact's own tickets + bookings | nenhum (público) |
Care
| Método | Caminho | Resumo | Escopo(s) |
|---|---|---|---|
POST | /care/alerts | Post a keyed Care alert, routed to the project's recipient | care:alerts:write |
GET | /care/alerts/{alert}/ack/{token} | Public, token-guarded ack of a Care alert — stops further escalation | nenhum (público) |
POST | /care/alerts/{alert}/ack/{token} | Same handler as GET — ack a Care alert via an explicit POST | nenhum (público) |
Formato de erro
Toda resposta que não é 2xx é um objeto JSON com o mesmo formato:
{ "error": { "code": "insufficient_scope", "message": "motivo legível" } } | Status | Significado |
|---|---|
| 400 | Falha de validação |
| 401 | Credencial ausente ou inválida |
| 402 | Saldo de tokens insuficiente para uma chamada de IA, ou um limite do plano (contatos/canais/assentos) já foi usado |
| 403 | Credencial válida mas sem o escopo exigido |
| 404 | Não encontrado, ou não pertence a este projeto — nunca se distingue entre os dois |
| 409 | Um estado conflitante, por exemplo um envio de texto fora da janela de 24h de atendimento |
| 422 | Semanticamente inválido, por exemplo um modelo que ainda não foi aprovado |
| 429 | Limite de taxa atingido |
Perguntas frequentes
Preciso de um plano especial para usar a Core API?
Qualquer projeto WACRM pode criar uma chave de API e chamar os endpoints que os escopos dessa chave permitirem. Os endpoints de IA são medidos contra o saldo de tokens do projeto, da mesma forma que usar o assistente de IA na caixa de entrada do Workspace.
O que acontece se eu tentar novamente uma requisição?
Os endpoints que mais mudam de estado (enviar uma mensagem, propor uma ação de agente, criar uma tarefa a partir de uma conversa) exigem um cabeçalho Idempotency-Key. Uma nova tentativa com a mesma chave repete a resposta original em vez de repetir a ação — para uma mensagem essa janela é de 24 horas; para uma ação de agente ou uma tarefa, a chave não expira.
Existe um sandbox para testar?
Sim — api-sandbox.wacrm.ai/v1 é a URL base do sandbox: teste suas chamadas lá antes de apontar sua integração para produção.
Onde eu crio e gerencio chaves de API?
No seu Workspace do WACRM, em Developer / API & MCP. Cada chave é criada apenas com os escopos que você escolher — nada é concedido por padrão além do que config/api_keys.php define como escopo padrão para aquele tipo de chave.
Posso chamar a API a partir de um agente de IA?
Sim — qualquer chave de API com escopo funciona da mesma forma para um script, uma integração de backend ou um agente. Veja a página do wacrm-mcp para um servidor MCP pronto que envolve cinco dessas chamadas como ferramentas de agente.
Relacionado
Comece a construir sobre a Core API do WACRM
Solicite acesso antecipado para ter um Workspace e criar sua primeira chave de API.