Pular para o conteúdo principal
As chamadas de mensagem ficam em client.messages(). O SDK Java envia instanceId na URL e instanceToken como X-Instance-Token; nenhum dos dois campos entra no corpo JSON.

Texto

client.messages().sendText(SendTextMessageRequest.builder()
    .instanceId(instanceId)
    .instanceToken(instanceToken)
    .phone("5511999999999")
    .message("Hello from Java")
    .build());
Retorno: envelope { code, success, data.message_id } — mensagem aceita/enfileirada.

Payloads dinâmicos

Use GenericInstanceRequest para mídia e mensagens interativas:
client.messages().sendImage(GenericInstanceRequest.builder()
    .instanceId(instanceId)
    .instanceToken(instanceToken)
    .put("phone", "5511999999999")
    .put("image", "https://example.com/image.png")
    .put("caption", "Imagem via Java")
    .build());

Retornos dos demais metodos

MetodoRetorno
sendImage, sendAudio, sendDocument, sendVideo, sendSticker, sendGif, sendLocation, sendContact, sendButtons, sendList, sendLink, sendPollenvelope { code, success, data.message_id }
pollVote, reactenvelope { code, success, data } com confirmacao (details, timestamp, id)
removeReaction, presence, markRead, edit, deleteenvelope { code, success, data.details }
downloadImage, downloadVideo, downloadAudio, downloadDocumentenvelope { code, success, data.mimetype, data.data }
send(instanceId, path, body, token)mesmo contrato HTTP do path proxy
Use GenericInstanceRequest para mídia e mensagens interativas:
client.messages().sendImage(GenericInstanceRequest.builder()
    .instanceId(instanceId)
    .instanceToken(instanceToken)
    .put("phone", "5511999999999")
    .put("image", "https://example.com/image.png")
    .put("caption", "Imagem via Java")
    .build());
Retorno: envelope { code, success, data } com data.mimetype e data.data (base64 ou data URL).

Escape hatch

client.messages().send(instanceId, "send/text", Map.of("phone", phone, "message", "Hi"), instanceToken);