Pular para o conteúdo
WACRM.AI
Funciona hoje

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.

Huy Nguyen (David), Founder and CEO of Netbase JSC

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

ServidoresURL
Productionhttps://api.wacrm.ai/v1
Sandbox (test API keys only, no wallet charges)https://api-sandbox.wacrm.ai/v1

Projects

MétodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(s)
GET /token-balance Current token balance and this cycle's usage wallet:read

AI

MétodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(s)
GET /audit-logs List this project's activity/audit log (newest first) audit:read

Labels

MétodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(s)
GET /conversations List conversations (Workspace Inbox) contacts:read

MCP

MétodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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étodoCaminhoResumoEscopo(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" } }
StatusSignificado
400Falha de validação
401Credencial ausente ou inválida
402Saldo de tokens insuficiente para uma chamada de IA, ou um limite do plano (contatos/canais/assentos) já foi usado
403Credencial válida mas sem o escopo exigido
404Não encontrado, ou não pertence a este projeto — nunca se distingue entre os dois
409Um estado conflitante, por exemplo um envio de texto fora da janela de 24h de atendimento
422Semanticamente inválido, por exemplo um modelo que ainda não foi aprovado
429Limite 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.

Comece a construir sobre a Core API do WACRM

Solicite acesso antecipado para ter um Workspace e criar sua primeira chave de API.