CRM Oficina Martech
ReferênciaMensagens

Enviar mensagem

POST /messages/send — envia uma mensagem WhatsApp (texto ou mídia) pela fila do CRM, para conversa, contato ou telefone, com operador opcional.

POST/messages/sendBeta

Escopo necessário: messages:write

Envia uma mensagem WhatsApp (texto ou mídia) por uma conexão WhatsApp da organização. A organização é resolvida a partir da própria API key — não envie organization_id.

O envio é assíncrono: a mensagem é gravada no CRM com status pending e entra na fila de envio. O queued: true da resposta confirma o enfileiramento — a entrega ao destinatário aparece depois, na conversa do CRM.

Destino: informe exatamente um entre conversation_id, contact_id ou phone. Com phone, o contato e a conversa são criados automaticamente se não existirem.

Endpoint

POST https://crm.oficinamartech.com/api/v1/messages/send

Corpo da requisição

CampoTipoObrigatórioDescrição
instance_idstring (UUID)✅Conexão WhatsApp da organização usada no envio.
conversation_idstring (UUID)△Conversa existente na organização e na conexão instance_id informada. Um dos três destinos possíveis.
contact_idstring (UUID)△Contato existente; usa/cria a conversa dele na instância (requer telefone no contato).
phonestring (até 40)△Telefone em qualquer formato; normalizado para dígitos com DDI. Resolve/cria contato e conversa.
contentstring (1–4096)✅Texto da mensagem. Em envios de mídia, funciona como caption.
message_typetext | image | video | audio | document❌Tipo da mensagem. Default: text. Tipos de mídia exigem media_url.
media_urlstring (URL pública, até 2048)△URL pública da mídia. Obrigatória quando message_type não é text.
media_mime_typestring (até 120)❌MIME type da mídia. Ex.: image/jpeg.
media_filenamestring (até 200)❌Nome do arquivo (útil em document). Ex.: contrato.pdf.
sender_user_idstring (UUID)❌Operador (membro ativo da organização) que assina a mensagem. Veja Operador.
assign_conversationboolean❌Atribui a conversa ao sender_user_id quando ela está sem operador. Default: true.

△ = exatamente um entre conversation_id, contact_id e phone deve ser informado.

Operador

Com sender_user_id, a mensagem sai assinada: o nome do operador aparece no balão da conversa (campos sender_id/sender_name). Combinado com assign_conversation (default true), uma conversa sem dono é atribuída a ele — mesmo comportamento do envio manual pela interface.

Opt-out (LGPD)

Se o contato da conversa registrou opt-out, o envio é bloqueado com 403 contact_opted_out. Não insista: o opt-out é um gate de consentimento.

Resposta

201 Created:

{
  "data": {
    "message_id": "9b2e1c40-58cc-4372-a567-0e02b2c3d479",
    "conversation_id": "1f0b7a2e-...",
    "contact_id": "2a7c91d4-...",
    "queued": true,
    "assigned_to": "5e3f0b8a-..."
  }
}
CampoTipoDescrição
message_idstring (UUID)Mensagem gravada no CRM (status pending; o worker atualiza o estado).
conversation_idstring (UUID)Conversa usada no envio (existente ou recém-criada).
contact_idstring | nullContato da conversa (quando houver).
queuedtrueSempre true: o envio é assíncrono, via fila do CRM.
assigned_tostring | nullOperador dono da conversa após o envio (null quando sem atribuição).

Exemplos

curl -X POST "https://crm.oficinamartech.com/api/v1/messages/send" \
  -H "Authorization: Bearer $OFM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "instance_id": "1f0b...e3",
    "phone": "+55 11 98765-4321",
    "content": "Olá! Recebemos sua inscrição 🎉",
    "sender_user_id": "5e3f...8a"
  }'

Códigos de erro específicos

StatuscodeCausa
400—JSON inválido, corpo fora do schema ou mais de um destino informado
400—message_type de mídia sem media_url
400contact_without_phonecontact_id sem telefone válido para iniciar conversa
400instance_disconnectedConexão WhatsApp não está conectada
401missing_api_keyHeader Authorization ausente
403missing_scopeChave sem o escopo messages:write
403contact_opted_outContato registrou opt-out (LGPD)
403messaging_guard_blockedLimite de mensagens do plano ou guarda de assinatura do canal
404instance_not_foundinstance_id não existe nesta organização
404conversation_not_foundconversation_id não encontrado na organização ou pertence a outra conexão
404contact_not_foundcontact_id não encontrado na organização
404operator_not_foundsender_user_id não é membro ativo da organização
500enqueue_failedFalha ao enfileirar a mensagem (ela fica marcada como failed)
500—Erro interno

Veja Códigos de erro para o formato completo.

Notas

  • A organização vem da API key — uma chave só envia mensagens pelas conexões da própria organização.
  • A conversa criada por phone usa o canal WhatsApp da instância informada e fica vinculada ao contato resolvido/criado (origem api).
  • O telefone aceita formatos livres (+55 11 98765-4321, 11987654321, etc.) e é normalizado para dígitos com DDI, com variantes do 9º dígito brasileiro.
  • queued: true não garante entrega: falhas de envio aparecem depois no status da mensagem dentro do CRM.

On this page