SOFTG API WhatsApp

SOFTG API WhatsApp

API própria da SOFTG para os clientes do SOFTG ERP e PDV enviarem mensagens pelo WhatsApp da própria empresa: notas fiscais (DANFE), boletos, XML, avisos, imagens, áudio e localização.

Uma conexão por clienteCada empresa conecta o próprio número e recebe um token exclusivo.
Somente envioMensagens recebidas não são lidas nem armazenadas.
PrivacidadeO texto e os arquivos enviados não são gravados — só destino, tipo e status.
URL basehttps://api.whats.softgempresarialsistemas.com.br/v1
FormatoJSON em UTF-8, REST
AutenticaçãoCabeçalho apikey: SEU_TOKEN (ou Authorization: Bearer SEU_TOKEN)
Rotas/v1/grupo/acao/{instancia}

Não é a API oficial da Meta (WhatsApp Business Cloud). A conexão funciona como o WhatsApp Web: o celular do cliente precisa ter internet de tempos em tempos para a sessão continuar ativa.

Seus dados nos exemplos

Preencha para que todos os exemplos desta página usem sua instância e seu token. Os valores ficam só nesta aba do navegador.

Integrar um cliente (equipe SoftG)

  1. Criar a conexão no painel /administrador → Dispositivos → Criar dispositivo (nome do cliente, CNPJ e limite de envios por minuto).
  2. Conectar o número: Conectar WhatsApp no card do dispositivo, por QR Code ou código de pareamento — ou pelo próprio ERP, com a rota instance/connect.
  3. Entregar as credenciais: na aba APIs, copie a URL base, a instância e o token. Use Testar credenciais para conferir.
  4. Configurar o ERP do cliente com esses três valores (seção Usar no SOFTG ERP).
  5. Acompanhar no Painel: status do número, mensagens enviadas, bloqueio e troca de token.

Autenticação

Toda requisição leva o token da conexão no cabeçalho apikey. O token só opera a própria instância.

CredencialExemploOnde usar
URL basehttps://api.whats.softgempresarialsistemas.com.br/v1Início de todas as rotas
Instânciacli_borges_distribuidora_7f3aFinal das rotas
Tokensgw_9f2c… (52 caracteres)Cabeçalho apikey

Teste rápido — GET /v1

200 OK
{ "ok": true, "instancia": "cli_borges_distribuidora_7f3a", "cliente": "Borges Distribuidora", "estado": "open" }

Conectar o WhatsApp

Uma vez por número. Estados possíveis: open (conectado), connecting (aguardando leitura do QR ou reconectando) e close (desconectado).

Estado da conexão — GET /v1/instance/connectionState/{instancia}

200 OK
{ "instancia": "cli_borges_distribuidora_7f3a", "estado": "open", "telefone": "5563984045945" }

QR Code ou código de pareamento — GET /v1/instance/connect/{instancia}

Devolve o QR Code em base64 (PNG pronto para <img src>), que vence em cerca de 30 s. Chame de novo a cada 20 s até estado virar open. Com ?number=5563999999999, devolve um código de 8 letras para digitar no celular, em Aparelhos conectados → Conectar com número de telefone.

200 OK
{ "estado": "connecting", "base64": "data:image/png;base64,iVBORw0KGgo...", "code": "2@...", "expiraEm": "2026-10-31T15:04:30.000Z" }

// com ?number=5563999999999
{ "estado": "connecting", "pairingCode": "ABCD-1234" }

// já conectado
{ "estado": "open" }

Fluxo típico no sistema: mostrar o QR → repetir a chamada a cada 20 s → quando vier {"estado": "open"}, fechar a tela.

Reiniciar — POST /v1/instance/restart/{instancia}

Reabre a conexão sem apagar a sessão (útil se o status ficou parado).

Desconectar — DELETE /v1/instance/logout/{instancia}

Encerra a sessão no WhatsApp. Para voltar é preciso ler um novo QR Code.

Enviar mensagens

Todas as rotas de envio são POST com corpo JSON. O campo number é DDI + DDD + número; máscaras como +55 (63) 98404-5945 são aceitas. O servidor descobre se o número existe com ou sem o 9º dígito e envia para a forma certa. A resposta 201 sai quando o WhatsApp aceita a mensagem; guarde o id para consultar entrega e leitura.

Texto — POST /v1/message/sendText/{instancia}

CampoTipoDescrição
numberstringDestino (obrigatório)
textstring1 a 4096 caracteres. Formatação: *negrito*, _itálico_, ~tachado~, ```mono```, \n quebra linha
201 Created
{ "id": "0f8c3a52-6c1e-4b8e-9a51-2a1d3f7c9e10", "whatsappId": "3EB0A1B2C3D4E5F6", "status": "ENVIADA", "destino": "5563999999999", "criadoEm": "2026-10-31T15:04:12.000Z" }

PDF, imagem, vídeo e documentos — POST /v1/message/sendMedia/{instancia}

CampoTipoDescrição
numberstringDestino
mediatypestringimage, video ou document
mimetypestringEx.: application/pdf, application/xml, image/jpeg, video/mp4
mediastringURL https pública ou o arquivo em base64
fileNamestringNome exibido ao destinatário (opcional)
captionstringLegenda, até 1024 caracteres (opcional)

Aceitos: PDF, XML, TXT, CSV, DOCX, XLSX, ZIP, JPEG, PNG, GIF, WEBP, MP4 e MOV, até 25 MB. O servidor confere a assinatura do arquivo: o mimetype precisa corresponder ao conteúdo.

Áudio (nota de voz) — POST /v1/message/sendWhatsAppAudio/{instancia}

audio: URL https ou base64 de OGG/Opus, MP3, M4A ou WAV. Chega como mensagem de voz.

Localização — POST /v1/message/sendLocation/{instancia}

Verificar números — POST /v1/chat/whatsappNumbers/{instancia}

Confere até 50 números por chamada antes de enviar. jid mostra a forma que existe no WhatsApp (com ou sem o 9º dígito).

200 OK
[ { "numero": "5563984045945", "existe": true, "jid": "556384045945@s.whatsapp.net" },
  { "numero": "5511999999999", "existe": false, "jid": null } ]

Status da mensagem — GET /v1/message/status/{instancia}/{id}

ENVIADA (aceita pelo WhatsApp) → ENTREGUE (chegou no celular) → LIDA. FALHOU quando o WhatsApp recusou. O status só avança; se o celular do destinatário estiver sem internet, fica em ENVIADA até ele conectar.

200 OK
{ "id": "0f8c3a52-...", "status": "LIDA", "criadoEm": "2026-10-31T15:04:12.000Z", "entregueEm": "2026-10-31T15:04:13.000Z", "lidaEm": "2026-10-31T15:06:40.000Z", "erro": null }

Idempotência — envio seguro de repetir

Se a rede cair no meio do envio, o ERP não sabe se a mensagem saiu. Envie o cabeçalho Idempotency-Key com um valor estável por operação (ex.: danfe-000123, de 8 a 150 caracteres A-Z a-z 0-9 . _ : -) e repita a chamada com a mesma chave:

Erros e limites

Formato: {"erro": "mensagem em português", "codigo": "CODIGO"}; em validação vem também campos com o problema de cada campo.

HTTPcodigoQuandoO que fazer
400REQUISICAO_INVALIDAJSON malformadoCorrigir o corpo
401TOKEN_INVALIDOToken ausente, errado, trocado ou conexão excluídaConferir o cabeçalho apikey; pedir o token atual à SoftG
403CONEXAO_BLOQUEADAConexão bloqueada pela SoftGContatar a SoftG
403INSTANCIA_NAO_PERTENCE_AO_TOKENToken de outra instânciaConferir a instância
404ROTA_NAO_ENCONTRADARota ou método erradoUsar as rotas desta documentação
404MENSAGEM_NAO_ENCONTRADAid inexistente ou de outra conexãoConferir o id
409WHATSAPP_DESCONECTADONúmero desconectado — nada foi enviadoReconectar pelo QR Code
409IDEMPOTENCIA_CONFLITOChave em uso ou com outro conteúdoAguardar e repetir com a mesma chave e o mesmo corpo
413ARQUIVO_MUITO_GRANDEArquivo acima de 25 MBReduzir o arquivo
422DADOS_INVALIDOSCampo inválido (veja campos)Corrigir o campo
422NUMERO_SEM_WHATSAPPO destino não tem WhatsAppConferir o número
422MIDIA_INVALIDATipo não suportado, conteúdo diferente do mimetype, URL inválida ou internaCorrigir a mídia
429LIMITE_EXCEDIDOLimite de envios por minuto atingidoAguardar os segundos de Retry-After
500FALHA_INTERNAErro inesperadoRepetir com espera crescente
503INDISPONIVELWhatsApp ou servidor indisponível no momentoRepetir com espera crescente (seguro com Idempotency-Key)

Limites

Usar no SOFTG ERP (VB.NET)

A classe SoftGWhatsAppClient funciona no .NET Framework 4.8, sem pacotes NuGet (usa System.Net.Http, System.Web.Extensions e System.Drawing).

⬇ Baixar SoftGWhatsAppClient.vb

Configuração

SoftGWhatsApp.UrlBase=https://api.whats.softgempresarialsistemas.com.br/v1
SoftGWhatsApp.Instancia=cli_borges_distribuidora_7f3a
SoftGWhatsApp.Token=sgw_...

Enviar a DANFE ao faturar

Imports SoftG.WhatsApp

Private ReadOnly _whats As New SoftGWhatsAppClient(Config.UrlBase, Config.Instancia, Config.Token)

Private Async Sub btnEnviarDanfe_Click(sender As Object, e As EventArgs) Handles btnEnviarDanfe.Click
    btnEnviarDanfe.Enabled = False
    Try
        ' Chave estável por nota: repetir após falha de rede não envia duas vezes.
        Dim envio = Await _whats.EnviarArquivoAsync(txtCelular.Text, caminhoPdf, "Segue sua nota fiscal " & numeroNota & ".", "danfe-" & numeroNota)
        MessageBox.Show("DANFE enviada. Id: " & envio.Id)
    Catch ex As SoftGWhatsAppException When ex.Codigo = "WHATSAPP_DESCONECTADO"
        MessageBox.Show("O WhatsApp da empresa está desconectado. Conecte em Configurações → WhatsApp.")
    Catch ex As SoftGWhatsAppException When ex.Codigo = "NUMERO_SEM_WHATSAPP"
        MessageBox.Show("Este cliente não tem WhatsApp neste número.")
    Catch ex As SoftGWhatsAppException
        MessageBox.Show("Envio recusado: " & ex.Message)
    Finally
        btnEnviarDanfe.Enabled = True
    End Try
End Sub

Tela de conexão por QR Code

' Timer de 20 s: atualiza o QR até conectar.
Private Async Sub tmrQr_Tick(sender As Object, e As EventArgs) Handles tmrQr.Tick
    Dim conexao = Await _whats.ConectarQrAsync()
    If conexao.Estado = "open" Then
        tmrQr.Stop()
        lblStatus.Text = "WhatsApp conectado!"
    ElseIf conexao.QrCodeImagem IsNot Nothing Then
        picQrCode.Image = conexao.QrCodeImagem
    End If
End Sub

Use Async Sub só em manipuladores de evento; nunca chame .Result ou .Wait() na thread da interface.

Boas práticas

Solução de problemas

409 WHATSAPP_DESCONECTADO
O número saiu da conexão (desconectado pelo celular, sem internet por muito tempo ou bloqueado). Gere um novo QR Code e leia pelo WhatsApp do cliente. Nada foi enviado.
A mensagem não chega e o número não tem o 9º dígito
Envie normalmente com o 9: o servidor confere as duas formas e usa a que existe. Para conferir antes, use Verificar números.
401 TOKEN_INVALIDO depois de funcionar
O token foi trocado no painel ou a conexão foi excluída. Peça à SoftG o token atual e atualize a configuração do ERP.
403 CONEXAO_BLOQUEADA
A conexão foi bloqueada pela SoftG. Entre em contato com o suporte.
Status parado em ENVIADA
O celular do destinatário está sem internet ou desligado; o status muda para ENTREGUE quando ele conectar.
422 MIDIA_INVALIDA com PDF
Confira se o mimetype é application/pdf e se o base64 é do arquivo inteiro, sem o prefixo de outro tipo.

SOFTG Empresarial Sistemas · Suporte: tecnologia@softgempresarial.com.br