You have a single endpoint to send OTP emails. Here's the entire integration.
Open the sign-up page, create an account, and the dashboard shows your first API key — a one-time reveal.
Hit POST /v1/send with a Bearer key and a JSON body.
curl -X POST https://api.vipvap.xyz/v1/send \ -H "Authorization: Bearer vp_live_a4f2…" \ -H "Content-Type: application/json" \ -d '{ "recipient": "alice@acme.com", "code": "418917" }'
// 200 OK { "id": "snd_3f2a9b", "status": "delivered", "to": "alice@acme.com", "from": "vipvap <notify@vipvap.xyz>", "subject": "vipvap: your verification code", "expires_in_minutes": 10, "quota_remaining": 1949 }
/v1/send/v1/usage| Field | Type | Required | Description |
|---|---|---|---|
| recipient | string | required | Recipient email address. |
| code | string | required | The OTP. 4–12 chars; whatever your flow expects. |
| country | string | optional | ISO 3166-1 alpha-2 country for the recipient (e.g. "US"). Powers the Countries analytics and the country filter in Send logs. Omit it and vipvap falls back to the request's geolocation header, then to unknown. |
| Field | Type | Description |
|---|---|---|
| id | string | Send ID, used by the dashboard logs. |
| status | string | delivered, queued, bounced, failed. |
| to | string | Recipient address. |
| from | string | Rendered From line. Always vipvap <notify@vipvap.xyz>. |
| subject | string | Rendered subject line. Always vipvap: your verification code. |
| expires_in_minutes | integer | Default expiry applied to the message body. |
| quota_remaining | integer | Hard cap minus used, after this send. |
| Status | code | What it means |
|---|---|---|
| 401 | invalid_api_key | Missing or wrong Bearer token. |
| 400 | invalid_recipient | Address is malformed. |
| 400 | invalid_code | Code is missing or wrong shape. |
| 429 | quota_exceeded | Hard cap reached. No overages — upgrade in the dashboard to lift it. |
Every send is tagged with the recipient's country so you can see where your OTPs go. vipvap resolves it in this order and never guesses:
country you pass in the request (or an X-Country header), if it is a valid ISO alpha-2 code.CF-IPCountry, X-Vercel-IP-Country, X-AppEngine-Country, X-Country-Code or X-Geo-Country.unknown. A send with no location signal is labelled unknown, never a wrong country.The dashboard's Countries view maps each country that received OTPs, darker and larger where more codes went, with per-country volume and delivery rate over Today / 7 days / 30 days / all time. Send logs show the country per row and can be filtered to one country.
Set a webhook URL in the dashboard's Settings page and we'll POST delivery status callbacks as a single vipvap-delivery event.
{
"event": "vipvap.delivery",
"data": {
"id": "snd_3f2a9b",
"status": "delivered",
"recipient": "alice@acme.com"
}
}Need a higher quota, a separate sending segment, or a custom agreement? Email hi@vipvap.xyz.
vipvap Inc. Terms of Service and Privacy Policy apply. vipvap transmits only OTP emails. Sending other content types (marketing, transactional, anything non-OTP) is a violation of the terms and grounds for account suspension.