MiraFunnel API v1
API pública para automação de WhatsApp, CRM e campanhas de prospecção.
https://api.mirafunnel.com.br/api/v1HTTPS (TLS 1.2+)JSONAutenticação
Todas as requisições devem incluir o header X-API-Key com sua chave de API.
X-API-Key: mira_sk_your_api_key_here Content-Type: application/json
Gere suas chaves em Dashboard → Configurações → API Keys ou via endpoint POST /api/v1/api-keys.
Paginação
Endpoints que retornam listas suportam paginação via query params:
?page=1&limit=25&sort=createdAt&order=desc
A resposta inclui o objeto pagination:
{
"data": [...],
"pagination": {
"page": 1,
"limit": 25,
"total": 142,
"pages": 6
}
}Rate Limits
100 requisições por minuto por API key. Headers de resposta:
| Header | Descrição |
|---|---|
X-RateLimit-Limit | Limite total |
X-RateLimit-Remaining | Requisições restantes |
X-RateLimit-Reset | Timestamp de reset |
X-Request-Id | ID único da requisição |
Messages
/messages/sendEnviar mensagem (text, image, video, audio, document).
{
"instanceId": "uuid-da-instancia",
"to": "5511999999999",
"type": "text",
"content": {
"text": "Olá! Como posso ajudar?"
}
}curl -X POST https://api.mirafunnel.com.br/api/v1/messages/send \
-H "X-API-Key: mira_sk_xxx" \
-H "Content-Type: application/json" \
-d '{"instanceId":"uuid","to":"5511999999999","type":"text","content":{"text":"Olá!"}}'Tipos suportados:
| type | content |
|---|---|
text | { "text": "mensagem" } |
image | { "media": "url", "caption": "legenda" } |
video | { "media": "url", "caption": "legenda" } |
audio | { "media": "url" } |
document | { "media": "url", "fileName": "doc.pdf" } |
/messages/send-buttonsEnviar mensagem com botões interativos (máx. 3).
{ "instanceId": "uuid", "to": "55...", "title": "Escolha", "buttons": [{"buttonText": "Opção 1"}, {"buttonText": "Opção 2"}] }/messages/send-listEnviar lista de opções (menu dropdown).
/messages/send-pollCriar enquete/votação.
/messages/send-reactionEnviar reação emoji a uma mensagem.
{ "instanceId": "uuid", "to": "55...", "messageId": "msg-id", "emoji": "👍" }/messages/send-locationEnviar localização.
{ "instanceId": "uuid", "to": "55...", "latitude": -23.55, "longitude": -46.63, "name": "São Paulo" }/messages/mark-readMarcar mensagens como lidas.
/messages/check-numberVerificar se números possuem WhatsApp.
{ "instanceId": "uuid", "numbers": ["5511999999999", "5521888888888"] }/messages/typingEnviar indicador de digitação.
Instances
/instancesListar todas as instâncias WhatsApp.
/instancesCriar nova instância. Body: { "name": "Minha Instância" }
/instances/:id/statusStatus de conexão da instância.
/instances/:id/qrcodeObter QR Code para conexão.
/instances/:id/connectConectar/reconectar instância.
/instances/:id/disconnectDesconectar (logout).
/instances/:idRenomear instância. Body: { "name": "Novo Nome" }
/instances/:idEliminar instância permanentemente.
Contacts
/contacts?page=1&limit=25Listar contatos (paginado).
/contacts/search?q=JoãoBusca full-text por nome, telefone ou email.
/contacts/:idDetalhes do contato + conversas recentes.
/contactsCriar ou atualizar contato (upsert por telefone).
{ "phone": "5511999999999", "name": "João Silva", "email": "joao@email.com", "tags": ["lead", "vip"] }/contacts/:idAtualizar contato.
/contacts/:idEliminar contato.
Conversations
/conversations?status=open&instanceId=uuidListar conversas (filtros: status, instanceId).
/conversations/:idDetalhes da conversa.
/conversations/:id/messages?page=1&limit=50Histórico de mensagens.
/conversations/:id/assign?agentId=uuidAtribuir conversa a um agente.
/conversations/:id/resolveResolver/encerrar conversa.
Campaigns
/campaignsListar campanhas.
/campaigns/:idDetalhes + métricas.
/campaignsCriar campanha de disparo.
{
"name": "Campanha Black Friday",
"messageTemplate": "Olá {{name}}! Aproveite nossa promoção.",
"instanceId": "uuid",
"messageType": "text",
"scheduledFor": "2026-11-29T10:00:00Z",
"recurrence": "daily",
"dailyLimit": 100
}/campaigns/:id/recipientsAdicionar destinatários (batch até 1000).
{ "recipients": [{ "phone": "5511999999999", "name": "João" }, { "phone": "5521888888888", "name": "Maria" }] }/campaigns/:id/startIniciar campanha.
/campaigns/:id/pausePausar campanha.
Funnels
/funnelsListar funis ativos.
/funnels/:id/statsEstatísticas por estágio do funil.
/funnels/:id/add-leadInjetar lead no funil (entra no primeiro estágio).
{ "phone": "5511999999999", "name": "João Silva", "email": "joao@email.com" }Groups
/groupsListar grupos WhatsApp.
/groups/:idDetalhes do grupo.
/groups/:id/messagesEnviar mensagem ao grupo.
/groups/:id/participantsAdicionar participantes.
/groups/:id/participantsRemover participantes.
Labels
/labelsListar etiquetas sincronizadas.
/labels/syncSincronizar etiquetas do WhatsApp Business.
/labels/:id/triggersCriar trigger: quando etiqueta for aplicada, adicionar contato a campanha.
Analytics
/analytics/overviewMétricas gerais da empresa.
{ "contacts": 1542, "conversations": 389, "instances": 3, "campaigns": 12, "messages": 8721 }/analytics/messages?days=7Volume de mensagens enviadas/recebidas.
/analytics/campaignsPerformance de campanhas com delivery stats.
Webhooks
Receba notificações em tempo real quando eventos ocorrem na sua conta.
Gerenciamento
/webhooksListar webhooks configurados.
/webhooks/eventsListar eventos disponíveis.
/webhooksCriar webhook.
{ "url": "https://seusite.com/webhook", "events": ["message.received", "campaign.completed"] }/webhooks/:idAtualizar webhook.
/webhooks/:idEliminar webhook.
Segurança — Verificação de Assinatura
Cada delivery inclui uma assinatura HMAC-SHA256 no header X-Mira-Signature:
const crypto = require('crypto');
function verifySignature(body, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(JSON.stringify(body))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}Eventos Disponíveis — 15 Eventos
| Evento | Descrição |
|---|---|
message.received | Nova mensagem recebida |
message.sent | Mensagem enviada via API |
message.delivered | Mensagem entregue |
message.read | Mensagem lida |
message.failed | Falha no envio |
contact.created | Novo contato criado |
contact.updated | Contato atualizado |
conversation.assigned | Conversa atribuída a agente |
conversation.resolved | Conversa resolvida |
conversation.reopened | Conversa reaberta |
instance.connected | Instância conectada |
instance.disconnected | Instância desconectada |
campaign.started | Campanha iniciada |
campaign.completed | Campanha concluída |
label.associated | Etiqueta aplicada a contato |
Payload de Exemplo
{
"event": "message.received",
"timestamp": "2026-04-29T23:55:00.000Z",
"data": {
"messageId": "msg-uuid",
"conversationId": "conv-uuid",
"from": "5511999999999",
"type": "text",
"content": "Olá, quero saber mais!",
"instanceId": "inst-uuid"
}
}Headers do delivery:
| Header | Descrição |
|---|---|
X-Mira-Event | Nome do evento |
X-Mira-Signature | HMAC-SHA256 do body |
X-Mira-Delivery | UUID único do delivery |
User-Agent | MiraFunnel-Webhook/1.0 |
API Keys
/api-keysListar chaves (mascaradas).
/api-keysGerar nova chave. Body: { "name": "Produção", "scopes": ["messages", "contacts"] }
/api-keys/:idRevogar chave.
Códigos de Erro
| Código | Significado |
|---|---|
400 | Bad Request — Parâmetros inválidos ou ausentes |
401 | Unauthorized — API key ausente, inválida ou expirada |
403 | Forbidden — Sem permissão para este recurso |
404 | Not Found — Recurso não encontrado |
409 | Conflict — Recurso já existe |
429 | Too Many Requests — Rate limit excedido |
500 | Internal Server Error — Erro interno |
{
"statusCode": 400,
"message": "instanceId e to são obrigatórios",
"error": "Bad Request"
}