VanuConnect for developers
Build connections.
Bring your own code.
Send messages, follow delivery and check your credits from your own systems. Explore the reference here, without signing in. Create and manage your keys in your account.
SMS & WhatsApp
One messaging endpoint. Channel permissions and provider configuration apply.
Delivery tracking
Look up up to 100 of your message IDs in one request.
Credit balance
Read your credit balance, plan and key permissions before sending.
Explore business APIs
Contacts, bookings, invoices, commerce and Gold Bislama are documented in the versioned business reference. Live translation remains a controlled pilot.
Read the business API reference →Your first API request
Start with a balance request. It does not send a message or spend messaging credits. API access depends on your account and subscription.
- Sign in and create a key under API Keys.
- Store the key in your server’s secret environment as
VANUCONNECT_API_KEY. - Run this command on your server or in a private terminal.
curl --fail-with-body 'https://zqxcrvjsnunjuelmrydm.supabase.co/functions/v1/check-balance-api' \
-H "Authorization: Bearer $VANUCONNECT_API_KEY"Base URL
https://zqxcrvjsnunjuelmrydm.supabase.co/functions/v1The examples below contain illustrative IDs and values. Sending messages is a live, credit-consuming operation; use a consenting test recipient.
Authentication
Include your VanuConnect API key in the Authorization header on every request. Keys begin with vanu_live_. Do not use your login password, Supabase service role key or a provider credential.
Authorization: Bearer vanu_live_your_api_keyKeep keys on your server. Requests use the account that owns the key; SMS and WhatsApp each require the corresponding channel permission. Disable a compromised key in your account and replace it in your integration.
Send SMS or WhatsApp
POST/send-sms-api
Send one message to one recipient. The same endpoint accepts either channel; SMS is the default. WhatsApp also requires an enabled, configured sender and provider-supported messaging.
| Field | Type | Details |
|---|---|---|
phone_number | string · required | International number with country code; +678 for Vanuatu. |
message | string · required | Non-empty text. SMS maximum: 612 GSM units or 268 Unicode units; multipart SMS consumes additional credits. |
channel | string · optional | "sms" (default) or "whatsapp". |
sender_id | string · optional | 1–11 letters, numbers or spaces. SMS sender identity is subject to provider support. |
scheduled_at | string · optional | Future timestamp with an explicit timezone, for example an ISO 8601 UTC timestamp. Scheduling support depends on the provider. |
curl --fail-with-body -X POST 'https://zqxcrvjsnunjuelmrydm.supabase.co/functions/v1/send-sms-api' \
-H "Authorization: Bearer $VANUCONNECT_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"phone_number": "+678YOUR_NUMBER",
"message": "Your appointment reminder from VanuConnect.",
"channel": "sms"
}'For WhatsApp, set channel to "whatsapp". Replace the phone placeholder with a real, consenting recipient before running the example.
Node.js server example
const response = await fetch('https://zqxcrvjsnunjuelmrydm.supabase.co/functions/v1/send-sms-api', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VANUCONNECT_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
phone_number: '+678YOUR_NUMBER',
message: 'Your appointment reminder from VanuConnect.',
channel: 'sms',
}),
});
const result = await response.json();
if (!response.ok) {
// Log the returned code and message_id securely. Do not blindly resend.
throw new Error(result.code ?? 'API_REQUEST_FAILED');
}
console.log(result.message_id);Successful response · 200
{
"success": true,
"message_id": "7fbaa9f8-03cb-4a68-88a2-6f4b879a5918",
"provider_message_id": "provider-message-id",
"phone_number": "+678EXAMPLE",
"channel": "sms",
"credits_used": 1,
"credits_remaining": 99
}A successful response means the provider accepted the message; it does not confirm delivery. Save message_id for status checks. This API does not currently provide a client idempotency-key contract.
Check delivery status
GET/message-status-api?ids=message_id
Pass 1–100 comma-separated message UUIDs in ids. Use VanuConnect’s message_id, rather than the provider’s ID. Unknown IDs and messages owned by another account are omitted.
curl --fail-with-body 'https://zqxcrvjsnunjuelmrydm.supabase.co/functions/v1/message-status-api?ids=7fbaa9f8-03cb-4a68-88a2-6f4b879a5918' \
-H "Authorization: Bearer $VANUCONNECT_API_KEY"{
"messages": [
{
"message_id": "7fbaa9f8-03cb-4a68-88a2-6f4b879a5918",
"status": "delivered",
"delivered_at": "2026-10-17T01:30:00Z",
"read_at": null,
"error": null,
"updated_at": "2026-10-17T01:30:00Z"
}
]
}Returned statuses are sent, delivered, failed and read. Poll from your server every 15–30 seconds, batch IDs and stop on a final status. To track WhatsApp reads, continue after delivery where read receipts are supported. Status requests share the key’s rate limit.
Check your credit balance
GET/check-balance-api
Read credits, subscription information and key permissions. Treat the returned credits as messaging credits, rather than a cash balance.
{
"credits": 100,
"subscription_plan": "example-plan",
"subscription_status": "active",
"account": {
"email": "developer@example.com",
"company_name": "Example business"
},
"api_key": {
"name": "Server integration",
"permissions": {
"sms": true,
"whatsapp": false
},
"rate_limit_per_minute": 60
}
}The quick-start command above calls this endpoint. The response includes account details: keep it private in your integration.
Errors and safe retries
Check the HTTP status and JSON code. Error responses may include a message_id or additional context.
{
"error": "Rate limit exceeded",
"code": "RATE_LIMIT_EXCEEDED",
"retry_after": 30
}| HTTP | Meaning | Next step |
|---|---|---|
| 400 | Invalid fields or message IDs | Fix the request; do not retry unchanged. |
| 401 | Missing or invalid API key | Check the Bearer header and key. |
| 402 | Insufficient credits | Check and top up your messaging credits. |
| 403 | Disabled key, channel denied or recipient opted out | Review permissions and recipient consent. |
| 404 | Account not found | Check your account status with support. |
| 405 | Unsupported HTTP method | Use the method in the endpoint reference. |
| 429 | Shared per-key rate limit reached | Wait for Retry-After before making another request. |
| 500 / 502 / 503 | Server or provider failure | Inspect the error code and message history before deciding to resend. |
Rate limits and integration checklist
Limits are configured per API key; the default is 60 requests per minute. Messaging, status and balance requests share that allowance. Read your key’s actual limit from the balance response. On HTTP 429, respect the Retry-After header and retry_after seconds in JSON.
- Use server-side requests and keep keys out of browser bundles.
- Store message IDs and batch status lookups.
- Get recipient consent and respect opt-outs.
- Monitor credits and handle errors before enabling automated sending.
- API use currently operates against your live account. No separate public sandbox or outgoing developer webhook subscription is documented here.
Need another integration?
Talk to us about your booking, invoicing, commerce or accounting workflow. This public reference covers the supported key-authenticated messaging endpoints; other product integrations need a separate assessment.