Pular para o conteúdo principal

zapsterapi message send

Envia uma mensagem para um destinatário no WhatsApp. Suporta texto, mídia, templates WABA, botões interativos, mentions, agendamento, reply, view-once e mais.
zapsterapi message send \
  --recipient <numero> \
  [--text <texto>] \
  [--instance-id <id>] \
  [--send-at <iso8601>] \
  [--media-url <url> | --media-base64 <b64>] \
  [--media-caption <texto>] [--media-filename <nome>] \
  [--ptt | --ptv | --sticker] \
  [--template-name <nome> --template-language <code> [--template-components <json>]] \
  [--button '<json>' ...]  [--buttons-mode <auto|interactive>] \
  [--mention <pn> ... | --mention-everyone] \
  [--reply-to <message-id>] \
  [--view-once] [--no-link-preview] [--auto-mention] \
  [--profile <nome>] [--json]

Flags principais

FlagObrigatórioDescrição
--recipient <numero>SimTelefone E.164 sem + (ex: 5511999999999) ou ID de grupo (group:<id>).
--text <texto>CondicionalConteúdo da mensagem. Pelo menos um de --text, --media-* ou --template-* é necessário.
--instance-id <id>NãoInstância específica de envio. Se omitido e você só tiver uma instância conectada, a CLI usa ela; com mais de uma, a flag é obrigatória.
--send-at <iso8601>NãoAgenda a mensagem (ISO 8601, ex: 2026-05-15T10:00:00Z). Mínimo 1 minuto no futuro.

Mídia (--media-*)

Use --media-url sempre que possível — --media-base64 carrega o arquivo no payload e fica reservado pra quando a URL não estiver acessível.
FlagDescrição
--media-url <url>URL pública/assinada do arquivo. Preferida.
--media-base64 <b64>Conteúdo em base64. Use só quando URL não for viável.
--media-caption <texto>Legenda (imagem/vídeo) ou texto sob o documento.
--media-filename <nome>Nome de arquivo (ex: relatorio.pdf).
--pttMarca o áudio como push-to-talk (mensagem de voz).
--ptvMarca o vídeo como push-to-view (efêmero).
--stickerEnvia a mídia como figurinha.
Exatamente um de --media-url ou --media-base64 é necessário quando enviar mídia.

Templates WABA (--template-*)

Templates são exclusivos de instâncias WABA (Meta oficial). Mutuamente exclusivos com --text e --media-*.
FlagDescrição
--template-name <nome>Nome do template aprovado na Meta.
--template-language <code>Código de idioma (ex: en_US, pt_BR).
--template-components <json>Array JSON de components com header/body/buttons e parâmetros.

Botões interativos (--button, --buttons-mode)

Repita --button até 3 vezes. Cada valor é JSON com type + campos do tipo. Veja o guia de botões pra detalhes de cada tipo.
--button '{"type":"reply","label":"Sim"}' \
--button '{"type":"call","label":"Ligar","phone_number":"+5511999999999"}' \
--button '{"type":"url","label":"Abrir","url":"https://exemplo.com"}'
TipoCampos obrigatórios
replylabel
calllabel, phone_number (E.164 com +)
urllabel, url
copyablelabel, copy_code
--buttons-mode <auto\|interactive> é opcional (default auto). Use interactive pra forçar visual rico mesmo só com reply.

Mentions (--mention, --mention-everyone)

FlagDescrição
--mention <pn>Telefone/JID a ser mencionado. Pode repetir.
--mention-everyoneMenciona @todos no grupo.
--mention e --mention-everyone são mutuamente exclusivos.

Outros

FlagDescrição
--reply-to <message-id>Responde a uma mensagem existente (limite de 7 dias).
--view-onceMarca como mensagem efêmera (some após visualizar).
--no-link-previewDesativa o preview de URLs (default: ativo).
--auto-mentionHabilita auto-mention.

Saída — envio imediato (não-oficial / Baileys)

{
  "ok": true,
  "data": {
    "kind": "immediate",
    "message_id": "3EB0C68ECE69F2DF660423",
    "message_trace_id": "x7jCGxw83jXOjaXR60qJQ24Zkrs4MacA"
  }
}

Saída — envio imediato (oficial / WABA)

{
  "ok": true,
  "data": {
    "kind": "immediate",
    "message_id": "wamid.HBgMNTU4NzgxMTcwMjYxFQIAERgSNDQyQzhBOTY1OEI5Mzk2MzI3AA=="
  }
}

Saída — agendamento (--send-at definido)

{
  "ok": true,
  "data": {
    "kind": "scheduled",
    "message_id": "msg_4rajud08wyl9pmi6bhnwr",
    "send_at": "2026-05-15T10:00:00.000Z",
    "status": "scheduled"
  }
}

Exemplos

Texto simples:
zapsterapi message send --recipient 5511999999999 --text "olá"
Texto + mídia + caption:
zapsterapi message send --recipient 5511999999999 \
  --text "veja o relatório anexo" \
  --media-url https://exemplo.com/relatorio.pdf \
  --media-filename relatorio.pdf
Botões interativos:
zapsterapi message send --recipient 5511999999999 \
  --text "Como podemos te ajudar?" \
  --button '{"type":"reply","label":"Suporte"}' \
  --button '{"type":"reply","label":"Vendas"}' \
  --buttons-mode interactive
Template WABA:
zapsterapi message send --recipient 5511999999999 \
  --template-name welcome --template-language pt_BR
Mensagem em grupo com mention everyone:
zapsterapi message send --recipient group:120363021234567890 \
  --text "Reunião em 10min @everyone" --mention-everyone
Reply + view-once:
zapsterapi message send --recipient 5511999999999 \
  --text "Aqui está a senha temporária" \
  --reply-to msg_4rajud08wyl9pmi6bhnwr \
  --view-once
Agendamento:
zapsterapi message send --recipient 5511999999999 \
  --text "Bom dia!" --send-at 2026-05-16T08:00:00-03:00

zapsterapi message cancel <message-id>

Cancela uma mensagem agendada (scheduled) ou pendente (pending). Mensagens já enviadas não podem ser canceladas.
zapsterapi message cancel msg_4rajud08wyl9pmi6bhnwr [--profile <nome>] [--json]

Saída

{
  "ok": true,
  "data": {
    "id": "msg_4rajud08wyl9pmi6bhnwr",
    "status": "canceled"
  }
}

Códigos de erro específicos

error.codeCausa
message_not_foundID não existe ou não pertence à conta.
message_cannot_cancelMensagem já saiu do estado scheduled/pending.

zapsterapi message list

Lista mensagens dentro de uma janela de tempo. Útil pra auditoria, dashboards e agentes que precisam reconciliar status.
zapsterapi message list \
  --from <iso8601> \
  --to <iso8601> \
  [--status <pending|scheduled|sent|failed|canceled>] \
  [--instance-id <id>] \
  [--recipient <numero>] \
  [--message-id <id>] \
  [--connection-type <waba|unofficial>] \
  [--limit <n>] \
  [--after <cursor>] \
  [--profile <nome>] \
  [--json]
FlagObrigatórioDescrição
--from <iso8601>SimInício da janela. ISO 8601.
--to <iso8601>SimFim da janela. ISO 8601. Janela máxima de 90 dias.
--status <status>NãoFiltra por status.
--instance-id <id>NãoFiltra por instância.
--recipient <pn>NãoFiltra por destinatário.
--message-id <id>NãoFiltra por ID de mensagem (wamid ou msg_...).
--connection-type <type>Nãowaba ou unofficial.
--limit <n>Não1–100, default 20.
--after <cursor>NãoCursor de paginação (meta.next_cursor da página anterior).

Saída

{
  "ok": true,
  "data": {
    "data": [
      {
        "id": "msg_01HABC...",
        "message_id": "wamid.HBg...",
        "recipient": "5511999999999",
        "status": "sent",
        "connection_type": "waba",
        "instance_id": "i_xyz1234abc",
        "send_at": null,
        "sent_at": "2026-05-08T10:00:00Z",
        "canceled_at": null,
        "errors": null
      }
    ],
    "meta": {
      "next_cursor": null,
      "has_more": false,
      "limit": 20
    }
  }
}

Códigos de erro específicos

error.codeCausa
from_after_to--from igual ou maior que --to.
window_too_largeJanela excede 90 dias.
invalid_argument--from ou --to não é ISO 8601 válido.

Códigos de erro comuns

error.codeCausa
missing_recipientFlag --recipient ausente ou vazia.
missing_textNenhum de --text, --media-* ou --template-* foi informado.
incompatible_content--template-* combinado com --text ou --media-* (são mutuamente exclusivos).
invalid_media--media-url e --media-base64 ambos presentes, ou nenhum dos dois.
invalid_buttonJSON inválido em --button, mais de 3 botões, ou campo obrigatório do tipo ausente.
invalid_template--template-name ou --template-language ausente.
invalid_mentions--mention e --mention-everyone foram passados juntos.
invalid_send_at--send-at não é ISO 8601 válido.
invalid_tokenToken inválido ou expirado.
invalid_recipientNúmero não é WhatsApp válido.
instance_not_found--instance-id não pertence à conta.
no_connected_instance--instance-id omitido e nenhuma instância está conectada.
instance_id_required--instance-id omitido e há múltiplas instâncias conectadas.
Para a referência completa do payload (todos os campos, validações cross-field, edge cases), veja a REST API e o guia de botões.