Convite de Assinatura pelo WhatsApp via API: Como Usar o deliverVia

Boa parte dos signatários no Brasil abre o WhatsApp muitas vezes por dia e o e-mail bem menos. Para integrações diretas, a API da SignDocs Brasil pode mandar o convite de assinatura pelo WhatsApp, pelo e-mail ou pelo Telegram, com a escolha feita por signatário no campo deliverVia. Este guia mostra como pedir cada canal, o que a resposta da API informa, como os envelopes sequenciais e o reenvio tratam a escolha, e quais erros tratar no seu código.

O assunto aqui é o convite, a mensagem que leva o link de assinatura até a pessoa. O código de uso único (OTP), que alguns perfis pedem depois que o signatário abre o link, tem canal próprio e independente; ele está explicado em OTP por e-mail, SMS, WhatsApp e escolha do canal.

E-mail, WhatsApp ou Telegram: o que muda para o signatário

Nos três canais o signatário recebe o mesmo link da página de assinatura hospedada, abre no navegador e assina sem criar conta. O que muda é por onde o link chega e o que cada canal exige do seu cadastro:

Canal Exige no signer Como chega Observação
email email E-mail de convite com o link Canal padrão quando deliverVia é omitido; segue a regra do owner (abaixo)
whatsapp phone em E.164 (ex.: +5511999998888) Mensagem de modelo enviada por um número da SignDocs, com botão para o link Habilitado por tenant, sob demanda, com o time comercial
telegram cpf Mensagem do bot da SignDocs Só alcança quem já registrou o CPF no bot; também habilitado sob demanda

Um detalhe importante para quem recebe: a mensagem do WhatsApp identifica o remetente pelo nome verificado do seu tenant, cadastrado na SignDocs, e não por um texto enviado na requisição. Isso evita que uma chamada da API se apresente em nome de outra empresa, e dá ao signatário uma referência que ele reconhece.

deliverVia na prática

deliverVia é um array no nível de cima do corpo da requisição, ao lado de signer e policy. Ele é aceito em POST /v1/signing-sessions, em POST /v1/envelopes/{id}/sessions e em POST /v1/signing-sessions/{id}/resend-invite. Os valores válidos são email, whatsapp e telegram, em qualquer combinação.

# Sessão avulsa com convite por WhatsApp e e-mail curl -X POST https://api.signdocs.com.br/v1/signing-sessions \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -H "X-Idempotency-Key: contrato-4821-assinatura" \ -d '{ "purpose": "DOCUMENT_SIGNATURE", "policy": { "profile": "CLICK_PLUS_OTP" }, "signer": { "name": "Maria Souza", "email": "maria@exemplo.com.br", "cpf": "12345678909", "phone": "+5511999998888" }, "owner": { "name": "Comercial ACME", "email": "comercial@acme.com.br" }, "deliverVia": ["whatsapp", "email"], "document": { "content": "JVBERi0xLjcK...", "filename": "contrato-4821.pdf" } }'

Quatro regras definem o comportamento:

  • Omitido é e-mail. Sem deliverVia, a API mantém o contrato anterior: só o convite por e-mail. Nenhum envio pelo WhatsApp acontece sem pedido explícito.
  • Só os canais pedidos. ["whatsapp"] manda o convite apenas pelo WhatsApp. Se você quer os dois, peça os dois: ["whatsapp", "email"].
  • O e-mail continua com a regra do owner. Na sessão avulsa, o e-mail de convite sai quando há owner.email e ele é diferente do signer.email; isso impede que o remetente mande o convite para si mesmo. O WhatsApp não tem essa condição, porque vai para o número do signatário.
  • Telefone em E.164. signer.phone precisa começar com + e o código do país, só com dígitos. Formatos como (11) 99999-8888 são recusados com 400.

Os canais são validados antes de qualquer gravação. Um pedido inválido não cria sessão, não consome cota e não manda nada; você corrige e repete com a mesma chave de idempotência.

O que a resposta diz, e o que ela não diz

A resposta da criação traz os campos de sempre (sessionId, transactionId, url, clientSecret, expiresAt) e, conforme os canais, indicadores do convite:

{ "sessionId": "ss_01...", "transactionId": "tx_01...", "status": "ACTIVE", "url": "https://...", "clientSecret": "ss_secret_...", "expiresAt": "2026-10-21T14:00:00.000Z", "inviteSent": true, "whatsappInviteSent": true }
Campo Significado
inviteSent: true O e-mail de convite foi enviado ao signer.email
whatsappInviteSent: true A mensagem foi aceita pela Meta para envio ao número informado
campo ausente Aquele canal não foi pedido, ou o envio não foi aceito (por exemplo, o número pediu para não receber mais mensagens)
telegramInviteSent Presente sempre que o Telegram foi pedido; false quando o CPF não está registrado no bot

"Aceita pela Meta" não é o mesmo que "lida pelo signatário". A API não expõe, por endpoint nem por webhook, o status do WhatsApp depois do aceite. Por isso o seu sistema deve acompanhar o que importa, a assinatura, pelos eventos de sempre: SIGNING_SESSION.COMPLETED, TRANSACTION.COMPLETED, TRANSACTION.EXPIRED. O desenho do consumidor está em webhooks e eventos da API.

Número sem WhatsApp: um número que não tem conta no WhatsApp ainda é aceito no momento do envio; a falha só aparece minutos depois, quando a Meta informa que a mensagem não chegou ao destino. Nesse caso, se a sessão continua ativa e o signatário tem email no cadastro, a SignDocs manda o convite por e-mail automaticamente, uma única vez. Por isso vale sempre informar o e-mail do signatário, mesmo quando o canal principal é o WhatsApp.

Envelopes sequenciais e reenvio

Em envelopes, cada signatário entra com o seu próprio deliverVia em POST /v1/envelopes/{id}/sessions, então um envelope pode ter um signatário convidado pelo WhatsApp e outro pelo e-mail. A escolha fica gravada na transação daquele signatário.

  • Envelope PARALLEL: todos são convidados quando a sessão é criada, cada um nos seus canais.
  • Envelope SEQUENTIAL: a partir do segundo signatário, o convite não sai na criação. A resposta traz inviteDeferred: true e invitedAfterSigner; quando chega a vez dele, a SignDocs o convida nos canais que foram gravados. Se nenhum dos canais pedidos conseguir enviar naquele momento e houver e-mail no cadastro, o convite sai por e-mail.

O reenvio segue a mesma lógica. POST /v1/signing-sessions/{id}/resend-invite sem corpo reenvia pelos canais gravados na criação. Com corpo, você escolhe outro canal para aquele reenvio:

# Reenvio trocando para e-mail, depois de o WhatsApp não ter resolvido curl -X POST https://api.signdocs.com.br/v1/signing-sessions/$SESSION_ID/resend-invite \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "deliverVia": ["email"] }'

O reenvio só vale para sessões ACTIVE e respeita um intervalo de 60 segundos por sessão; antes disso, a resposta é 409. Pedir email num reenvio de sessão sem e-mail do signatário também devolve 409. Se a sessão já expirou, o caminho é outro, descrito em sessão expirada: reenviar ou recriar.

Erros que o seu código precisa tratar

Status Mensagem (campo detail) O que fazer
400 signer.phone is required when deliverVia includes whatsapp Pedir o celular no seu cadastro ou cair para ["email"]
400 signer.phone must be in E.164 format Normalizar para +55 + DDD + número, só dígitos
400 Invalid deliverVia channel: ... / deliverVia must be a non-empty array when provided Erro de programação: corrigir o payload
403 WhatsApp delivery is not enabled for this tenant O canal não está habilitado na sua conta; não adianta repetir. Fale com o time comercial
429 Cota diária ou mensal de mensagens do WhatsApp esgotada Respeitar Retry-After ou seguir pelo e-mail; nada foi enviado nem gravado

Cada convite pelo WhatsApp consome a cota de mensagens do tenant, separada da cota de documentos. A checagem acontece antes de criar a sessão, então um 429 não deixa sessão órfã. Os cabeçalhos RateLimit-* e Retry-After seguem o mesmo padrão descrito em rate limits, paginação e idempotência, e o tratamento geral de códigos está em códigos de erro da API.

Boas práticas

  • Valide o telefone na entrada. Converta para E.164 no momento do cadastro, não na hora do envio, e confirme com o cliente que o número é de celular com WhatsApp.
  • Sempre informe o e-mail também. Ele é o que permite o reenvio por outro canal e o convite automático por e-mail quando o número não tem WhatsApp.
  • Escolha o canal com o signatário. Pergunte na sua própria interface por onde a pessoa prefere receber, e guarde essa preferência junto do cadastro.
  • Respeite quem pediu para parar. Se o signatário responde à mensagem com "parar", "sair" ou "stop", a SignDocs deixa de mandar WhatsApp para aquele número; nesse caso whatsappInviteSent não aparece. Reenvie por e-mail.
  • Não espalhe o link. A URL com ?cs= dá acesso à assinatura. Não grave o clientSecret em logs de aplicação nem o repasse por canais que você não controla.
  • Use idempotência na criação. Um retry de rede sem X-Idempotency-Key pode gerar uma segunda sessão e um segundo convite no celular do signatário.

Testando no sandbox

No ambiente de homologação você valida o que é do seu código: o payload com deliverVia, o tratamento de 400, 403 e 429, a gravação do canal escolhido e o fluxo completo por e-mail até o webhook de conclusão. Uma conta de sandbox sem WhatsApp habilitado responde 403 a pedidos com whatsapp, o que já permite testar o caminho de erro. Para validar o envio real pelo WhatsApp antes da produção, combine a habilitação com o time comercial. Mensagens do WhatsApp são mensagens de modelo reais, por isso o volume de teste é limitado.

Com o convite resolvido, os próximos passos naturais são a ordem de assinatura com vários signatários e a escolha do nível de autenticação de cada documento. A visão geral da plataforma está na página da API de assinatura digital.

Perguntas Frequentes

A API da SignDocs manda o convite de assinatura pelo WhatsApp?

Sim. Em integrações diretas, inclua whatsapp no array deliverVia ao criar a sessão (POST /v1/signing-sessions) ou ao adicionar um signatário a um envelope, e informe signer.phone em formato E.164. A mensagem sai de um número da SignDocs, identifica o remetente pelo nome verificado do seu tenant e leva um botão para a página de assinatura. O canal é habilitado por tenant, sob demanda, com o time comercial.

Se eu pedir WhatsApp, o e-mail também é enviado?

Só se você pedir. O deliverVia manda o convite apenas pelos canais listados: ["whatsapp"] usa só o WhatsApp e ["whatsapp", "email"] usa os dois. Quando deliverVia é omitido, vale o comportamento anterior, só e-mail. A exceção é a recuperação automática: se a Meta informar que a mensagem não chegou ao número e o signatário tiver e-mail cadastrado, a SignDocs envia o convite por e-mail uma vez.

O que significa whatsappInviteSent na resposta?

Que a mensagem foi aceita pela Meta para envio ao número informado. Não significa que o signatário leu, e a API não informa o status da mensagem depois do aceite. Para saber se o documento foi assinado, acompanhe os webhooks SIGNING_SESSION.COMPLETED e TRANSACTION.COMPLETED. Quando o campo não aparece, o canal não foi pedido ou o envio não foi aceito, por exemplo porque o número pediu para não receber mais mensagens.

Como funciona o WhatsApp em envelopes sequenciais?

Cada signatário tem o próprio deliverVia, gravado na transação dele. Em envelopes SEQUENTIAL, a partir do segundo signatário o convite não sai na criação: a resposta traz inviteDeferred e invitedAfterSigner, e a SignDocs convida a pessoa pelos canais gravados quando chega a vez dela. Se nenhum desses canais conseguir enviar naquele momento e houver e-mail no cadastro, o convite sai por e-mail.

Posso reenviar o convite por outro canal?

Sim. POST /v1/signing-sessions/{id}/resend-invite sem corpo reenvia pelos canais escolhidos na criação; com {"deliverVia": ["email"]} no corpo, o reenvio vai pelo canal indicado. Vale só para sessões ACTIVE, com intervalo mínimo de 60 segundos por sessão. Para sessões que já expiraram, veja sessão expirada: reenviar ou recriar.

Quais erros devo tratar ao usar deliverVia?

Três grupos. 400 quando falta signer.phone, quando o telefone não está em E.164 ou quando o array tem um canal inválido. 403 quando o WhatsApp não está habilitado no seu tenant, caso em que repetir não adianta. 429 quando a cota de mensagens do WhatsApp do período acabou, com Retry-After na resposta. Em todos esses casos nada é gravado nem enviado, então basta corrigir e repetir com a mesma chave de idempotência.

Teste o deliverVia no sandbox

Crie credenciais de homologação, monte as sessões com deliverVia e valide o tratamento de erros e o fluxo até o webhook de conclusão. Para habilitar o WhatsApp no seu tenant e dimensionar o volume de mensagens, fale com o time comercial.

Criar credenciais de homologação Fale com o time comercial