WAservix Java integration
Connect WAservix to your Java app: send WhatsApp messages from your own WhatsApp number, check delivery and receive replies by webhook. Copy the examples, add your key and run.
Requirements
Java 11+ for java.net.http.HttpClient (the webhook helper uses HexFormat, Java 17+). No extra libraries.
Add your API key
Create a key under WAservix → Devices → API key (it starts with wpk_). Keep it on your server, in an environment variable or secret store. Never put it in a website, a mobile app or a public repository.
export WASERVIX_KEY=wpk_your_key
export WASERVIX_WEBHOOK_SECRET=your_webhook_secret
Set up the client
Base URL https://tekservix.com/waservix/api. Send the key as Authorization: Bearer wpk_….
import java.net.URI;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.time.Duration;
import java.util.HexFormat;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
Send a WhatsApp message
Messages are queued and sent one at a time per number, so the answer comes back at once with "status": "in_progress" and a msgId.
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://tekservix.com/waservix/api/send-message"))
.header("Authorization", "Bearer " + System.getenv("WASERVIX_KEY"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(30))
.method("POST", HttpRequest.BodyPublishers.ofString("{\"to\": \"+250788123456\", \"text\": \"Hello Aline, your order is ready\"}"))
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
if (res.statusCode() >= 400) throw new RuntimeException(res.body());
System.out.println(res.body());
Send a document or image
Use imageUrl, videoUrl, audioUrl or documentUrl with a public https link. Groups work too: put the group JID (…@g.us) in to.
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://tekservix.com/waservix/api/send-message"))
.header("Authorization", "Bearer " + System.getenv("WASERVIX_KEY"))
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(30))
.method("POST", HttpRequest.BodyPublishers.ofString("{\"to\": \"+250788123456\", \"text\": \"Your invoice\", \"documentUrl\": \"https://example.com/inv-1042.pdf\", \"fileName\": \"Invoice-1042.pdf\"}"))
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
if (res.statusCode() >= 400) throw new RuntimeException(res.body());
System.out.println(res.body());
Check message status
status is queued, sent, delivered, read, played or failed. Webhooks tell you without polling.
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://tekservix.com/waservix/api/messages/58213/info"))
.header("Authorization", "Bearer " + System.getenv("WASERVIX_KEY"))
.timeout(Duration.ofSeconds(30))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
if (res.statusCode() >= 400) throw new RuntimeException(res.body());
System.out.println(res.body());
Receive WhatsApp messages by webhook
Set a webhook URL and events for the number under WAservix → Devices. Each request carries X-Webhook-Signature, which equals that device’s webhook secret. Compare it in constant time, answer 2xx quickly and process the message after answering (we retry 3 times).
// The X-Webhook-Signature header carries your device's webhook secret.
static boolean verify(String header) {
String secret = System.getenv("WASERVIX_WEBHOOK_SECRET");
return header != null && MessageDigest.isEqual(secret.getBytes(StandardCharsets.UTF_8), header.getBytes(StandardCharsets.UTF_8));
}
Errors, limits and retries
Every answer has success; errors add a readable message. 401 means a wrong key, 402 no active plan for this number or phone, 409 the number or phone isn’t connected, 429 too many requests (300 a minute per key): wait for the Retry-After seconds and try again. Retry 5xx and network errors with a back-off, but don’t blindly retry a send that may have worked: check its status first, or you could send twice.
Full list of endpoints and fields: WAservix API reference.
Questions
Is this the official WhatsApp Business API?
No. WAservix links your own number as a companion device, like WhatsApp Web, so there is no Meta approval. Only message people who expect to hear from you: WhatsApp can ban numbers that spam.
Can I call the API from a mobile app or browser?
Don’t. Anyone could read the key from the app or page. Call the API from your server and let your app talk to your server.