E aí! Precisa de ajuda?

API de disparo de mensagem via WhatsApp

Este documento descreve a API de disparo de mensagens, suas propriedades, tipos suportados e exemplos de uso.

Daniel TeixeiraAlterado em: 25/11/2024

Campos

NomeTipoObrigatórioPadrão
accountIdnumberSim-
contactContactSim-
messageMessageSim-
channelIdnumberSim-
messageTimeoutnumberNão-
isPrivatebooleanNãofalse
tagIdnumberNão-
queueIdnumberNão-
sessionSessionNão-
statusstring (automatic|pending|solved)Nãoautomatic
ticketIdnumberNão-
userIdnumberNão-
summarystringNão-
fromstringNão-
queuedbooleanNãotrue
messageTimeoutBehaviorstring (solve|flow)Nãosolve
messageTimeoutFlowIdnumberNão-
responseFlowIdnumberNão-
contextContextNão

Tipos

Contact

type Contact = {
  name: string;
  phone: string;
};

Representa o contato que receberá a mensagem.

Message

type Message =
  | {
      type: "text";
      body: string;
    }
  | {
      type: "contact";
      name: string;
      phone: string;
      businessDescription: string;
    }
  | {
      type: "template";
      variables?: string[];
      headerVariables?: string[];
      buttonVariables?: string[];
      name: string;
    }
  | {
      type: "image";
      url: string;
      caption?: string;
    }
  | {
      type: "pdf";
      url: string;
      fileName: string;
      caption?: string;
    }
  | {
      type: "document";
      url: string;
      filename: string;
      caption: string;
    };

Define o tipo de mensagem enviado e suas propriedades específicas.

Session

type SendMessageFromApiSession = {
  context: Record;
};

Permite passar variáveis de contexto que serão armazenadas na sessão do chatbot e acessíveis no fluxo a partir do objeto session. Exemplo: Na API envie session.context.nota_fiscal = 10020. No chatbot poderá acessar essa variável utilizando {{session.nota_fiscal}} que retornará o valor "10020".

Context

type Context = {
    header: string;
    body: string;
    buttons?: ButtonContext[];
};

type ButtonContext = {
    type: 'link' | 'telephone' | 'copy';
	title: string;
	content: string;
};

Permite adicionar contexto no envio da mensagem

Descrição dos campos

  • accountId: ID único da sua conta do Sacflow.
  • channelId: ID único do seu canal do Sacflow.
  • message: payload da mensagem...consulte o objeto Message acima.
  • messageTimeout: Tempo máximo (em segundos) para que o cliente responda antes de rodar o messageTimeoutBehavior
  • isPrivate: Define se a mensagem será privada (não visível pelo cliente no Sacflow).
  • tagId: ID de uma tag a ser vinculada ao atendimento.
  • queueId: ID do departamento para o qual o atendimento será vinculado.
  • session: Permite adicionar variáveis de sessão específicas.
  • status: Status do atendimento inicial (open ou closed).
  • ticketId: ID do atendimento associado à mensagem.
  • userId: ID do usuário responsável pelo atendimento.
  • summary: Resumo breve do atendimento (máx. 300 caracteres).
  • from: Nome do remetente da mensagem.
  • queued: Define se a mensagem será enviada via fila (aplicável apenas para mensagens do tipo text e template).
  • messageTimeoutBehavior: Define o comportamento executado quando o messageTimeout acabar. Pode ser "solve" ou "flow". O "flow" requer que seja enviado o parâmetro messageTimeoutFlowId
  • messageTimeoutFlowId: Caso o messageTimeoutBehavior seja "flow" esse campo é obrigatório e define qual fluxo será chamado assim que o messageTimeout acabar.
  • responseFlowId: Utilizado para sobrescrever o fluxo definido no canal. Útil para personalizar a experiência em determinados contextos de disparos.
  • Context: As mensagens enviada têm informações adicionais que indicam o estado ou o propósito da interação. Por exemplo uma mensagem pode ser sinalizada com um "Cotacação frete não finalizada", deixando claro para o atendente que o processo ainda não foi concluído

Message

Exemplos de Uso

Envio de Template sem Variáveis

curl --request POST \
  --url https://api.sacflow.io/api/send-message \
  --header 'Authorization: Bearer API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
	"accountId": ACCOUNT_ID,
	"channelId": CHANNEL_ID,
	"contact": {
		"name": "CONTACT_NAME",
		"phone": "CONTACT_PHONE"
	},
	"message": {
		"type": "template",
		"name": "TEMPLATE_NAME"
	},
	"queued": false
}'

Envio de Template com Variáveis

curl --request POST \
  --url https://api.sacflow.io/api/send-message \
  --header 'Authorization: Bearer API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
	"accountId": ACCOUNT_ID,
	"channelId": CHANNEL_ID,
	"contact": {
		"name": "CONTACT_NAME",
		"phone": "CONTACT_PHONE"
	},
	"message": {
		"type": "template",
		"name": "TEMPLATE_NAME",
		"variables": ["VAR1", "VAR2"]
	}
}'

Envio de Template com Arquivo PDF/Image/Video no Header

Para enviar um template com midia no header, existem 2 formas de fornecer o arquivo:

Opcao 1: Via URL publica (JSON)

curl --request POST \
  --url https://api.sacflow.io/api/send-message \
  --header 'Authorization: Bearer API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "accountId": ACCOUNT_ID,
  "channelId": CHANNEL_ID,
  "contact": {
    "name": "CONTACT_NAME",
    "phone": "CONTACT_PHONE"
  },
  "message": {
    "type": "template",
    "name": "TEMPLATE_NAME",
    "variables": ["VAR1", "VAR2"],
    "headerVariables": ["https://exemplo.com/arquivo.pdf"]
  }
}'

Opcao 2: Upload direto do arquivo (Multipart)
Envie o arquivo diretamente na requisicao usando multipart/form-data. O sistema faz o upload automaticamente e injeta a URL no template:

curl --request POST \
  --url 'https://api.sacflow.io/api/send-message?accountId=ACCOUNT_ID' \
  --header 'Authorization: Bearer API_TOKEN' \
  -F 'payload={"accountId":ACCOUNT_ID,"channelId":CHANNEL_ID,"contact":{"name":"CONTACT_NAME","phone":"CONTACT_PHONE"},"message":{"type":"template","name":"TEMPLATE_NAME","variables":["VAR1","VAR2"]}}' \
  -F 'headerMedia=@/caminho/para/arquivo.pdf'
Importante sobre o envio multipart:
CampoTipoDescrição
payloadtexto (JSON)O body completo da requisicao, identico ao que seria enviado como JSON
headerMediaarquivoO arquivo de midia para o header do template (imagem, video ou documento)

O accountId deve ser informado via query string (?accountId=ACCOUNT_ID) ou no header accountId, além de estar presente dentro do JSON do campo payload.

  • Quando headerMedia é fornecido, o campo message.headerVariables é preenchido automaticamente e pode ser omitido do payload.
  • Tipos de arquivo aceitos: JPEG, PNG, WebP, MP4, 3GPP, PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT.
  • Tamanho maximo: 100MB.

Atenção:

  • Certifique-se de utilizar valores válidos para os campos obrigatórios (accountId, contact, channelId, message).

Para mais informações, entre em contato com o suporte da API via WhatsApp.