Pular para o conteúdo

API Grapnel

Links, leads, analytics e WhatsApp por API e MCP.

Início rápido

  1. Passo 1: Chave
  2. Passo 2: Cabeçalho
    Authorization: Bearer $GRAPNEL_API_KEY
  3. Passo 3: Primeira chamada
    GET /instances
bash
curl "https://grapnel.com.br/api/v1/instances" \
  -H "Authorization: Bearer $GRAPNEL_API_KEY"

Agentes de IA (MCP)

Webhook

Seu agente só entra em ação quando chega mensagem

Com o webhook, a Grapnel avisa o seu agente no momento em que alguém escreve. Ele não precisa ficar olhando o WhatsApp o tempo todo: lê e responde só quando há algo novo.

Como funciona

Chega uma mensagem

Alguém escreve para o seu número no WhatsApp.

A Grapnel avisa o agente

Na hora, envia um aviso (o webhook) para o endereço do seu agente.

O agente lê e responde

Ele lê a mensagem e responde pela API ou pelo MCP.

Como configurar em 3 passos

Passo 1: Cole o endereço do agente

No webhook do número, informe a URL (começa com https://) onde o seu agente recebe avisos. Ferramentas como n8n e Make mostram essa URL quando você cria um gatilho de webhook.

Passo 2: Crie um segredo

Uma senha longa e aleatória, com 32 caracteres ou mais. Ela vai junto com a URL e fica guardada no agente, que a usa para conferir se o aviso veio mesmo da Grapnel. Não use a chave da API.

Passo 3: Teste com uma mensagem

De outro celular, mande um “oi” num grupo em que o número está (ou no privado, se ativou conversas individuais). Em segundos o agente recebe o aviso e responde.

O que chega para o agente

Só gruposPadrão

O agente é avisado das mensagens que chegam nos grupos em que o número participa.

whatsapp.group.message.received

Conversas individuais

Também avisa das mensagens no privado (alguém falando direto com o número); os grupos continuam chegando. Ligue a opção de conversas individuais e use uma chave com a permissão Ler conversas individuais.

whatsapp.message.receivedchats:read

Só mensagens recebidas geram aviso: o que o próprio número envia, inclusive as respostas do agente, não aciona o agente de novo.

Para desenvolvedores: cada aviso é assinado com HMAC SHA-256 (X-Grapnel-Signature, X-Grapnel-Timestamp, X-Grapnel-Event-Id) e reenviado até 8 vezes em 24 h se o seu servidor falhar. Detalhes técnicos

Servidor MCP

https://grapnel.com.br/api/mcp
Streamable HTTPAuthorization: Bearersem estado

O agente vê só as ferramentas que a chave permite. Cada chamada passa pela API: mesmo limite, mesmos logs.

Clientes

Terminal
claude mcp add --transport http grapnel https://grapnel.com.br/api/mcp \
  --header "Authorization: Bearer $GRAPNEL_API_KEY"

Ferramentas

list_instancesget_instance_statuslist_chatsread_chat_messageslist_groupsread_group_messagesget_chat_infosend_textsend_mediasend_presencereact_to_messagemark_chat_readlist_message_webhooksconfigure_message_webhookdisable_message_webhooklist_webhook_deliveries
Qualquer outra operação do WhatsAppwhatsapp_operationswhatsapp_operation_schemawhatsapp_call

Prompt sem MCP

prompt.md
Você vai operar meu WhatsApp pela API da Grapnel.

1. Leia https://grapnel.com.br/llms.txt e https://grapnel.com.br/docs.md.
2. Autentique com o cabeçalho Authorization: Bearer $GRAPNEL_API_KEY.
3. Use a instância $GRAPNEL_INSTANCE_ID.
4. Em cada alteração, envie um Idempotency-Key único por operação.
   Ao repetir a mesma operação, repita a mesma chave.
5. Em HTTP 429, espere o tempo indicado em Retry-After.
6. Antes de escrever para um contato novo, peça a minha confirmação.

Fundamentos

Autenticação

https://grapnel.com.br/api/v1
Authorization: Bearer $GRAPNEL_API_KEY
Só no servidor. Nunca no navegador, no app ou no repositório.
Uma chave por integração, com as permissões que ela usa.
Revogue chaves sem uso e troque-as depois de alterar a senha.

Permissões

links:read
Consultar links, pastas e destinos
links:write
Criar, editar e excluir links, pastas e destinos
analytics:read
Consultar analytics agregados
logs:read
Consultar logs
leads:read
Consultar leads e suas estatísticas
instances:read
Consultar seus números conectados
whatsapp:read
Consultar status, grupos e mensagens de grupos
whatsapp:write
Enviar mensagens e gerenciar a conexão do WhatsApp
chats:read
Ler conversas individuais, contatos e etiquetas
chats:write
Arquivar, marcar, bloquear e editar contatos e etiquetas
groups:write
Criar e gerenciar grupos, comunidades e canais
settings:read
Consultar perfil, privacidade e automações
settings:write
Alterar perfil, privacidade, proxy e automações
campaigns:write
Criar e controlar envios em massa

Idempotência

Toda escrita leva um Idempotency-Key. Repita a mesma chave, com o mesmo método, URL e corpo, para tentar de novo sem duplicar.

Idempotency-Key: pedido-20260914-0001
caracteres: letras, números e . _ : -
8–200
a resposta é reutilizada
24 h
chave usada em outra requisição
409
consultas via POST não exigem
POST

Erros

200 · 201
Sucesso.
202
Aceito para envio; não confirma a entrega.
400 · 422
Revise os campos.
401
Confira a chave.
403
Falta permissão na chave.
404
Recurso indisponível para a conta.
409
Conflito ou idempotência.
429
Limite atingido: espere Retry-After.
5xx
Falha temporária: tente de novo com a mesma chave.
application/problem+json
{
  "type": "about:blank",
  "title": "Bad Request",
  "status": 400,
  "detail": "Confira os campos enviados.",
  "instance": "/api/v1/links",
  "code": "invalid_request",
  "request_id": "01993fa0-1000-7000-8000-000000000001"
}

Limites

requisições por conta, API e MCP
60/min
segundos para tentar de novo
Retry-After
corpo das mensagens
32 KiB
corpo com mídia na API completa
4 MiB

Formatos

UTF-8, também nos erros
JSON
IDs de recursos
UUID
datas ISO 8601 em UTC
2026-09-14T12:00:00Z
telefones: DDI + número
5511999999999

Paginação

Links · Leads
Envie o nextCursor recebido em cursor enquanto hasMore for true.
Mensagens · Conversas
Use pagination.next_offset enquanto pagination.has_more for true; deduplique por messageid.
Logs
page e limit; mais recentes primeiro.

Guias

Instâncias

5 endpoints

Números2

  • GET/instancesListar instâncias WhatsApp
  • GET/instances/{id}Consultar instância

Conexão3

  • GET/instances/{id}/statusConsultar status da conexão
  • POST/instances/{id}/connectConectar WhatsApp
  • POST/instances/{id}/disconnectDesconectar WhatsApp

Mensagens

9 endpoints

Envio4

  • POST/instances/{id}/messages/textEnviar mensagem de texto
  • POST/instances/{id}/messages/contactEnviar cartão de contato
  • POST/instances/{id}/messages/locationEnviar localização
  • POST/instances/{id}/messages/mediaEnviar imagem, vídeo, áudio ou documento

Conversas2

  • GET/instances/{id}/chatsListar conversas
  • GET/instances/{id}/chats/messagesConsultar mensagens de uma conversa individual

Grupos3

  • GET/instances/{id}/groupsListar grupos
  • POST/instances/{id}/groups/infoConsultar grupo pelo JID
  • GET/instances/{id}/groups/messagesConsultar mensagens de um grupo

Webhooks

10 endpoints

Assinatura

X-Grapnel-Event-Id
UUID do evento; deduplique por ele.
X-Grapnel-Timestamp
Unix, em segundos; aceite até 5 min.
X-Grapnel-Signature
sha256= HMAC de timestamp.corpo_bruto.
verify.ts
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: o corpo exatamente como chegou, antes do JSON.parse.
export function isGrapnelEvent(rawBody: string, headers: Headers, secret: string) {
  const timestamp = headers.get("x-grapnel-timestamp") ?? "";
  const signature = headers.get("x-grapnel-signature") ?? "";
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`, "utf8")
    .digest("hex");
  return signature.length === expected.length &&
    timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}

Entregas

confirma o recebimento
2xx
tentativas em 24 h (rede, 408, 429, 5xx)
8×
payload máximo
512 KiB
HTTPS público, sem redirecionamento
443
Sem garantia de ordem nem de entrega única: deduplique pelo id.
Segredo de 32 a 256 caracteres, gerado no seu servidor; nunca a chave da API.
Acompanhe cada entrega em GET /instances/{id}/messages/webhook/deliveries; configure vários números com POST /webhooks/messages.

Evento

whatsapp.message.receivedwhatsapp.group.message.received
POST · sua URL
{
  "id": "01993fa0-1000-7000-8000-000000000001",
  "event": "whatsapp.message.received",
  "instance_id": "01993fa0-1000-7000-8000-000000000002",
  "message": {
    "messageid": "3EB0C767D26A1D1A2B3C",
    "chatid": "5511999999999@s.whatsapp.net",
    "senderName": "Ana Souza",
    "isGroup": false,
    "fromMe": false,
    "messageType": "conversation",
    "messageTimestamp": 1757851200000,
    "text": "Olá! Quero saber o prazo de entrega."
  }
}

Mensagens3

  • GET/instances/{id}/messages/webhookConsultar webhook de mensagens
  • POST/instances/{id}/messages/webhookConfigurar webhook de mensagens
  • DELETE/instances/{id}/messages/webhookDesativar webhook de mensagens

Várias instâncias3

  • GET/webhooks/messagesConsultar webhooks de mensagens de todas as instâncias
  • POST/webhooks/messagesConfigurar webhook de mensagens em várias instâncias
  • POST/webhooks/messages/disableDesativar webhook de mensagens em várias instâncias

Entregas1

  • GET/instances/{id}/messages/webhook/deliveriesConsultar entregas do webhook de mensagens

Só grupos3

  • GET/instances/{id}/groups/webhookConsultar webhook de mensagens dos grupos
  • POST/instances/{id}/groups/webhookConfigurar webhook de mensagens dos grupos
  • DELETE/instances/{id}/groups/webhookDesativar webhook de mensagens dos grupos

Leads

2 endpoints
  • GET/leadsListar contatos da conta
  • GET/leads/statsConsultar estatísticas de contatos

Analytics

3 endpoints
  • GET/instances/{id}/metricsConsultar métricas da instância
  • GET/analyticsConsultar analytics da conta
  • GET/links/{id}/analyticsConsultar analytics de um link

Logs

1 endpoints
  • GET/logsConsultar logs

API completa do WhatsApp

120 endpoints

Cada operação do provedor de conexão, no mesmo caminho em kebab-case. Campos e respostas seguem a operação original; credenciais nunca aparecem.

Mensagens21

  • POST/instances/{id}/whatsapp/send/textEnviar mensagem de texto
  • POST/instances/{id}/whatsapp/send/mediaEnviar mídia (imagem, vídeo, áudio ou documento)
  • POST/instances/{id}/whatsapp/send/contactEnviar cartão de contato (vCard)
  • POST/instances/{id}/whatsapp/send/locationEnviar localização geográfica
  • POST/instances/{id}/whatsapp/message/presenceEnviar atualização de presença
  • POST/instances/{id}/whatsapp/send/statusEnviar Stories (Status)
  • POST/instances/{id}/whatsapp/send/menuEnviar menu interativo (botões, carrosel, lista ou enquete)
  • POST/instances/{id}/whatsapp/send/carouselEnviar carrossel de mídia com botões
  • POST/instances/{id}/whatsapp/send/location-buttonSolicitar localização do usuário
  • POST/instances/{id}/whatsapp/send/request-paymentSolicitar pagamento
  • POST/instances/{id}/whatsapp/send/pix-buttonEnviar botão PIX
  • GET/instances/{id}/whatsapp/message/asyncConsultar fila async de envio direto
  • DELETE/instances/{id}/whatsapp/message/asyncLimpar fila async de envio direto
  • POST/instances/{id}/whatsapp/message/downloadBaixar arquivo de uma mensagem
  • POST/instances/{id}/whatsapp/message/findBuscar mensagens em um chat
  • POST/instances/{id}/whatsapp/message/markreadMarcar mensagens como lidas
  • POST/instances/{id}/whatsapp/message/reactEnviar reação a uma mensagem
  • POST/instances/{id}/whatsapp/message/deleteApagar Mensagem Para Todos
  • POST/instances/{id}/whatsapp/message/editEdita uma mensagem enviada
  • POST/instances/{id}/whatsapp/call/makeIniciar chamada de voz
  • POST/instances/{id}/whatsapp/call/rejectRejeitar chamada recebida

Conversas e contatos17

  • POST/instances/{id}/whatsapp/chat/findBusca chats com filtros
  • POST/instances/{id}/whatsapp/chat/detailsObter Detalhes Completos
  • POST/instances/{id}/whatsapp/chat/checkVerificar Números no WhatsApp
  • POST/instances/{id}/whatsapp/chat/deleteDeleta chat
  • POST/instances/{id}/whatsapp/chat/archiveArquivar/desarquivar chat
  • POST/instances/{id}/whatsapp/chat/readMarcar chat como lido/não lido
  • POST/instances/{id}/whatsapp/chat/muteSilenciar chat
  • POST/instances/{id}/whatsapp/chat/pinFixar/desafixar chat
  • POST/instances/{id}/whatsapp/chat/labelsGerencia labels de um chat
  • POST/instances/{id}/whatsapp/chat/blockBloqueia ou desbloqueia contato do WhatsApp
  • GET/instances/{id}/whatsapp/chat/blocklistLista contatos bloqueados
  • POST/instances/{id}/whatsapp/label/editEditar etiqueta
  • GET/instances/{id}/whatsapp/labelsBuscar todas as etiquetas
  • GET/instances/{id}/whatsapp/contactsRetorna lista de contatos do WhatsApp
  • POST/instances/{id}/whatsapp/contacts/listListar todos os contatos com paginacao
  • POST/instances/{id}/whatsapp/contact/addAdiciona um contato à agenda
  • POST/instances/{id}/whatsapp/contact/removeRemove um contato da agenda

Grupos e canais42

  • POST/instances/{id}/whatsapp/group/createCriar um novo grupo
  • POST/instances/{id}/whatsapp/group/infoObter informações detalhadas de um grupo
  • POST/instances/{id}/whatsapp/group/invite-infoObter informações de um grupo pelo código de convite
  • POST/instances/{id}/whatsapp/group/joinEntrar em um grupo usando código de convite
  • POST/instances/{id}/whatsapp/group/leaveSair de um grupo
  • GET/instances/{id}/whatsapp/group/listListar todos os grupos
  • POST/instances/{id}/whatsapp/group/listListar todos os grupos com filtros e paginacao
  • POST/instances/{id}/whatsapp/group/reset-invite-codeResetar código de convite do grupo
  • POST/instances/{id}/whatsapp/group/update-announceConfigurar permissões de envio de mensagens no grupo
  • POST/instances/{id}/whatsapp/group/update-descriptionAtualizar descrição do grupo
  • POST/instances/{id}/whatsapp/group/update-imageAtualizar imagem do grupo
  • POST/instances/{id}/whatsapp/group/update-lockedConfigurar permissão de edição do grupo
  • POST/instances/{id}/whatsapp/group/update-nameAtualizar nome do grupo
  • POST/instances/{id}/whatsapp/group/update-participantsGerenciar participantes do grupo
  • POST/instances/{id}/whatsapp/community/createCriar uma comunidade
  • POST/instances/{id}/whatsapp/community/editgroupsGerenciar grupos em uma comunidade
  • POST/instances/{id}/whatsapp/newsletter/createCriar canal
  • GET/instances/{id}/whatsapp/newsletter/listListar canais inscritos
  • POST/instances/{id}/whatsapp/newsletter/infoBuscar informações de um canal
  • POST/instances/{id}/whatsapp/newsletter/subscribeAssinar live updates temporários de um canal
  • POST/instances/{id}/whatsapp/newsletter/messagesBuscar mensagens de um canal
  • POST/instances/{id}/whatsapp/newsletter/messages/editEditar mensagem recente de um canal
  • POST/instances/{id}/whatsapp/newsletter/messages/deleteDeletar mensagem recente de um canal
  • POST/instances/{id}/whatsapp/newsletter/updatesBuscar updates de mensagens de um canal
  • POST/instances/{id}/whatsapp/newsletter/viewedMarcar posts do canal como visualizados
  • POST/instances/{id}/whatsapp/newsletter/reactionReagir a um post do canal
  • POST/instances/{id}/whatsapp/newsletter/followSeguir canal
  • POST/instances/{id}/whatsapp/newsletter/unfollowDeixar de seguir canal
  • POST/instances/{id}/whatsapp/newsletter/muteSilenciar canal
  • POST/instances/{id}/whatsapp/newsletter/unmuteRemover mute do canal
  • POST/instances/{id}/whatsapp/newsletter/deleteDeletar canal
  • POST/instances/{id}/whatsapp/newsletter/pictureAtualizar foto do canal
  • POST/instances/{id}/whatsapp/newsletter/nameAtualizar nome do canal
  • POST/instances/{id}/whatsapp/newsletter/descriptionAtualizar descrição do canal
  • POST/instances/{id}/whatsapp/newsletter/settingsAtualizar configurações do canal
  • POST/instances/{id}/whatsapp/newsletter/searchPesquisar canais públicos
  • POST/instances/{id}/whatsapp/newsletter/admin/inviteConvidar admin do canal
  • POST/instances/{id}/whatsapp/newsletter/admin/acceptAceitar convite de admin do canal
  • POST/instances/{id}/whatsapp/newsletter/admin/removeRemover admin do canal
  • POST/instances/{id}/whatsapp/newsletter/admin/revokeRevogar convite de admin do canal
  • POST/instances/{id}/whatsapp/newsletter/owner/transferTransferir dono do canal

Perfil e configurações18

  • POST/instances/{id}/whatsapp/instance/resetReiniciar runtime da instância
  • GET/instances/{id}/whatsapp/instance/privacyBuscar configurações de privacidade
  • POST/instances/{id}/whatsapp/instance/privacyAlterar configurações de privacidade
  • POST/instances/{id}/whatsapp/instance/presenceAtualizar status de presença da instância
  • POST/instances/{id}/whatsapp/instance/update-delay-settingsDelay na fila de mensagens
  • GET/instances/{id}/whatsapp/instance/proxyObter configuração de proxy da instância
  • POST/instances/{id}/whatsapp/instance/proxyConfigurar ou alterar o proxy
  • DELETE/instances/{id}/whatsapp/instance/proxyRemover o proxy configurado
  • POST/instances/{id}/whatsapp/profile/nameAltera o nome do perfil do WhatsApp
  • POST/instances/{id}/whatsapp/profile/imageAltera a imagem do perfil do WhatsApp
  • POST/instances/{id}/whatsapp/business/get/profileObter o perfil comercial
  • GET/instances/{id}/whatsapp/business/get/categoriesObter as categorias de negócios
  • POST/instances/{id}/whatsapp/business/update/profileAtualizar o perfil comercial
  • POST/instances/{id}/whatsapp/business/catalog/listListar os produtos do catálogo
  • POST/instances/{id}/whatsapp/business/catalog/infoObter informações de um produto do catálogo
  • POST/instances/{id}/whatsapp/business/catalog/deleteDeletar um produto do catálogo
  • POST/instances/{id}/whatsapp/business/catalog/showMostrar um produto do catálogo
  • POST/instances/{id}/whatsapp/business/catalog/hideOcultar um produto do catálogo

Automação15

  • POST/instances/{id}/whatsapp/instance/updatechatbotsettingsChatbot Configurações
  • POST/instances/{id}/whatsapp/instance/update-fields-mapAtualizar campos personalizados de leads
  • POST/instances/{id}/whatsapp/agent/editCriar/Editar Agente
  • GET/instances/{id}/whatsapp/agent/listTodos os agentes
  • POST/instances/{id}/whatsapp/trigger/editCriar, atualizar ou excluir um trigger do chatbot
  • GET/instances/{id}/whatsapp/trigger/listListar todos os triggers do chatbot
  • POST/instances/{id}/whatsapp/knowledge/editCriar/Editar Conhecimento do Agente
  • GET/instances/{id}/whatsapp/knowledge/listListar Base de Conhecimento
  • POST/instances/{id}/whatsapp/function/editCriar/Editar função para integração com APIs externas
  • GET/instances/{id}/whatsapp/function/listLista todas as funções de API
  • POST/instances/{id}/whatsapp/quickreply/editCriar, atualizar ou excluir resposta rápida
  • GET/instances/{id}/whatsapp/quickreply/showallListar todas as respostas rápidas
  • GET/instances/{id}/whatsapp/chatwoot/configObter configuração do Chatwoot
  • PUT/instances/{id}/whatsapp/chatwoot/configAtualizar configuração do Chatwoot
  • POST/instances/{id}/whatsapp/chat/edit-leadEdita informações de lead

Campanhas7

  • POST/instances/{id}/whatsapp/sender/simpleCriar nova campanha (Simples)
  • POST/instances/{id}/whatsapp/sender/advancedCriar envio em massa avançado
  • POST/instances/{id}/whatsapp/sender/editControlar campanha de envio em massa
  • POST/instances/{id}/whatsapp/sender/cleardoneLimpar mensagens enviadas
  • DELETE/instances/{id}/whatsapp/sender/clearallLimpar toda fila de mensagens
  • GET/instances/{id}/whatsapp/sender/listfoldersListar campanhas de envio
  • POST/instances/{id}/whatsapp/sender/listmessagesListar mensagens de uma campanha