API Nokos Vulvy OTP
Integrasikan layanan sewa nomor virtual (OTP) ke dalam aplikasi kamu. Satu API untuk dua penyedia: Server 1 dan Server 3. Cukup deposit di Bot Telegram, generate API Key, lalu mulai kirim request.
2
Pilihan Server Aktif
Server 1 (Cheapest price) & Server 3 (Cheapest price).
< 1 dtk
Respons Ringan
Format JSON konsisten di semua endpoint.
Bearer
Autentikasi API Key
Header, X-API-Key, atau query parameter.
Pengenalan
API Nokos Vulvy OTP memungkinkan kamu membeli nomor virtual untuk menerima kode OTP secara otomatis. Alur kerjanya sederhana: pilih negara & layanan, buat order, lalu polling status hingga kode OTP diterima.
Server 1
Server utama dengan pengiriman cepat dan stok nomor luas. Cocok untuk kebutuhan harian.
Server 3
Server cadangan dengan dukungan banyak negara. Gunakan bila server utama sedang penuh/gangguan.
Penting: setiap request API dikenakan biaya sesuai harga nomor dan akan memotong saldo akunmu. Pastikan saldo cukup sebelum membuat order.
Deposit & Mendapatkan API Key
API Key dibuat dan saldo diisi melalui Bot Telegram. Ikuti langkah berikut sebelum mulai memakai API.
-
1
Buka Bot Telegram
Mulai bot, lalu buka menu deposit untuk melihat saldo akunmu.
Telegram/start -
2
Deposit Saldo via QRIS
Pilih nominal, scan QRIS, dan saldo otomatis masuk setelah pembayaran terkonfirmasi. Saldo ini yang dipakai untuk membeli nomor lewat API.
-
3
Generate API Key
Ketik perintah berikut di bot. API Key berupa string 64 karakter — simpan dengan aman.
Telegram/API generate aplikasiku /API list /API revoke <api_key> -
4
Mulai Kirim Request
Gunakan API Key pada header
Authorization. Lihat contoh lengkap di bagian Autentikasi.
Base URL & Server
Kedua server memakai Base URL yang sama. Pilih server melalui parameter server di setiap request.
| Server | Param | Base URL | Tipe |
|---|---|---|---|
| Server 1 | server=1 | https://vynapi.vxe.biz.id/v1 | Primary |
| Server 3 | server=3 | https://vynapi.vxe.biz.id/v1 | Backup |
Tips: bila Server 1 mengembalikan error NO_NUMBER atau sedang penuh, ulangi request dengan server=3 sebagai cadangan.
Autentikasi
Setiap request wajib menyertakan API Key. Ada tiga cara yang didukung — pilih salah satu. Cara paling aman adalah lewat header.
Praktis untuk pengujian cepat di browser, namun kurang aman untuk production.
Contoh autentikasi pada endpoint cek saldo:
curl -X GET "https://vynapi.vxe.biz.id/v1/balance" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
const res = await fetch('https://vynapi.vxe.biz.id/v1/balance', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Accept': 'application/json'
}
});
const data = await res.json();
console.log(data);
import requests
url = "https://vynapi.vxe.biz.id/v1/balance"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json"
}
resp = requests.get(url, headers=headers, timeout=15)
print(resp.json())
Jangan pernah membagikan API Key di sisi client (browser/mobile publik) atau menyimpannya di repository. Simpan di environment variable dan komunikasikan lewat backend milikmu.
Daftar Negara
Mengambil daftar negara yang tersedia untuk server aktif.
/v1/countries?server=
JSON
curl -X GET "https://vynapi.vxe.biz.id/v1/countries?server=" \
-H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch(`https://vynapi.vxe.biz.id/v1/countries?server=${server}`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await res.json();
console.log(data);
import requests
r = requests.get(
"https://vynapi.vxe.biz.id/v1/countries?server=1",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=15
)
print(r.json()["data"])
Contoh Response
{
"success": true,
"server": 1,
"data": [
{ "id": 6, "name": "Indonesia", "code": null, "dial_code": "62" },
{ "id": 4, "name": "Philippines", "code": null, "dial_code": "63" },
{ "id": 16, "name": "Malaysia", "code": null, "dial_code": "60" }
]
}
Daftar Layanan
Mengambil daftar layanan/aplikasi yang tersedia untuk sebuah negara. Nilai id di sini dipakai sebagai nilai service saat membuat order. Kamu juga bisa memakai nama (contoh: service=WhatsApp). Harga & stok ada di endpoint products.
/v1/services?server=&country=6
JSON
| Parameter | Wajib | Deskripsi |
|---|---|---|
| server | Opsional | 1 = Server, 3 = Server. Default: 1. |
| country | Wajib | ID negara dari endpoint countries. |
curl -X GET "https://vynapi.vxe.biz.id/v1/services?server=&country=6" \
-H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch(`https://vynapi.vxe.biz.id/v1/services?server=${server}&country=6`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await res.json();
import requests
r = requests.get(
"https://vynapi.vxe.biz.id/v1/services",
params={"server": 1, "country": 6},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=15
)
print(r.json()["data"])
Contoh Response
{
"success": true,
"server": 1,
"data": [
{ "id": "wa", "name": "WhatsApp", "price": null, "stock": null },
{ "id": "tg", "name": "Telegram", "price": null, "stock": null },
{ "id": "go", "name": "Google", "price": null, "stock": null }
]
}
Cek Harga & Stok
Mengambil daftar produk (operator + harga + stok) untuk layanan tertentu. Gunakan operator untuk memilih harga spesifik saat membuat order.
/v1/products?server=&country=6&service=wa
JSON
curl -X GET "https://vynapi.vxe.biz.id/v1/products?server=&country=6&service=wa" \
-H "Authorization: Bearer YOUR_API_KEY"
const url = `https://vynapi.vxe.biz.id/v1/products?server=${server}&country=6&service=wa`;
const res = await fetch(url, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await res.json();
import requests
r = requests.get(
"https://vynapi.vxe.biz.id/v1/products",
params={"server": 1, "country": 6, "service": "wa"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=15
)
print(r.json()["data"])
Contoh Response
{
"success": true,
"server": 1,
"data": {
"country": "Indonesia",
"service": "WhatsApp",
"products": [
{ "id": "any", "operator": "any", "name": "Any Operator (Random)", "price": 1500, "stock": 420 },
{ "id": "451", "operator": "451", "name": "Telkomsel", "price": 1750, "stock": 160 },
{ "id": "452", "operator": "452", "name": "Indosat", "price": 1650, "stock": 95 }
]
}
}
Buat Order (Beli Nomor)
Membuat order baru dan mengembalikan nomor virtual. Saldo akun akan langsung terpotong sebesar harga produk.
/v1/order
JSON
| Body | Wajib | Deskripsi |
|---|---|---|
| server | Opsional | 1 = Server, 3 = Server. Default: 1. |
| country | Wajib | ID negara dari endpoint countries. |
| service | Wajib | Kode layanan, contoh: wa, tg. |
| operator | Opsional | Pilih operator spesifik. Kosong = operator acak termurah. |
| max_price | Opsional | Batasi harga maksimum. Order ditolak bila harga lewat limit. |
curl -X POST "https://vynapi.vxe.biz.id/v1/order" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"server": ,
"country": 6,
"service": "wa"
}'
const res = await fetch('https://vynapi.vxe.biz.id/v1/order', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
server: ,
country: 6,
service: 'wa'
})
});
const data = await res.json();
console.log(data.data.phone_number);
import requests
r = requests.post(
"https://vynapi.vxe.biz.id/v1/order",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"server": 1, "country": 6, "service": "wa"},
timeout=30
)
order = r.json()["data"]
print(order["order_id"], order["phone_number"])
Response Sukses
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"server": 1,
"server_name": "S1",
"country": "Indonesia",
"service": "WhatsApp",
"phone_number": "+628123456789",
"status": "ACTIVE",
"price": 1500,
"balance_after": 48500,
"expires_at": "2026-10-04T10:05:00Z"
}
}
Response Error
{
"success": false,
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Saldo tidak cukup. Silakan deposit terlebih dahulu."
}
}
Ambil OTP / Cek Status
Gunakan endpoint ini untuk polling hingga kode OTP masuk. Disarankan polling setiap 3–5 detik.
/v1/order/{order_id}?server=
JSON
| Status | Arti |
|---|---|
| PENDING | Order dibuat, nomor belum siap. |
| ACTIVE | Nomor aktif, menunggu SMS masuk. |
| OTP_RECEIVED | Kode OTP sudah diterima. |
| COMPLETED | Order selesai. |
| CANCELED | Dibatalkan / kedaluwarsa. |
curl -X GET "https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91?server=" \
-H "Authorization: Bearer YOUR_API_KEY"
async function pollOtp(orderId, interval = 4000) {
while (true) {
const res = await fetch(`https://vynapi.vxe.biz.id/v1/order/${orderId}?server=`, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await res.json();
if (data.status === 'OTP_RECEIVED') return data.otp;
await new Promise(r => setTimeout(r, interval));
}
}
import time, requests
headers = {"Authorization": "Bearer YOUR_API_KEY"}
while True:
r = requests.get(
"https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91",
params={"server": 1}, headers=headers, timeout=15
)
data = r.json()["data"]
if data["status"] == "OTP_RECEIVED":
print("OTP:", data["otp"])
break
time.sleep(4)
Response — OTP Diterima
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"status": "OTP_RECEIVED",
"otp": "482913",
"otp_message": "Your WhatsApp code is 482913",
"phone_number": "+628123456789",
"expires_in": 320
}
}
Response — Masih Menunggu
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"status": "ACTIVE",
"otp": null,
"phone_number": "+628123456789",
"expires_in": 480
}
}
Resend OTP
Meminta sistem mengirim ulang SMS/OTP ke nomor yang sama tanpa membuat order baru.
/v1/order/{order_id}/resend
JSON
curl -X POST "https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/resend" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "server": }'
const res = await fetch('https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/resend', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ server: })
});
const data = await res.json();
import requests
r = requests.post(
"https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/resend",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"server": 1}, timeout=30
)
print(r.json())
Contoh Response
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"status": "ACTIVE",
"message": "Permintaan kirim ulang OTP berhasil."
}
}
Selesaikan Order
Menandai order sebagai selesai setelah OTP diterima. Panggil endpoint ini agar nomor dilepas kembali ke stok.
/v1/order/{order_id}/finish
JSON
curl -X POST "https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/finish" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "server": }'
await fetch('https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/finish', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ server: })
});
import requests
requests.post(
"https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/finish",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"server": 1}, timeout=30
)
Contoh Response
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"status": "COMPLETED"
}
}
Batalkan Order
Membatalkan order yang belum menerima OTP. Saldo akan dikembalikan (refund) bila pembatalan disetujui penyedia.
/v1/order/{order_id}/cancel
JSON
curl -X POST "https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/cancel" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "server": }'
const res = await fetch('https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/cancel', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ server: })
});
const data = await res.json(); // data.refunded: true / false
import requests
r = requests.post(
"https://vynapi.vxe.biz.id/v1/order/ORD-8F3A91/cancel",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"server": 1}, timeout=30
)
print(r.json()["data"])
Contoh Response
{
"success": true,
"data": {
"order_id": "ORD-8F3A91",
"status": "CANCELED",
"refunded": true,
"balance_after": 50000
}
}
Cek Saldo
Mengambil saldo akun yang tersedia untuk membeli nomor. Saldo diisi lewat deposit di Bot Telegram.
/v1/balance
JSON
curl -X GET "https://vynapi.vxe.biz.id/v1/balance" \
-H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch('https://vynapi.vxe.biz.id/v1/balance', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const { data } = await res.json();
console.log('Saldo:', data.balance);
import requests
r = requests.get(
"https://vynapi.vxe.biz.id/v1/balance",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=15
)
print("Saldo:", r.json()["data"]["balance"])
Contoh Response
{
"success": true,
"data": {
"user_id": 123456789,
"balance": 50000,
"currency": "IDR"
}
}
Error & Status Code
Semua error mengembalikan format JSON yang konsisten dengan field success: false.
| HTTP | Code | Deskripsi |
|---|---|---|
| 400 | BAD_REQUEST | Parameter tidak lengkap atau tidak valid. |
| 401 | INVALID_API_KEY | API Key tidak valid atau sudah dicabut. |
| 403 | ACCOUNT_BANNED | Akun diblokir dari penggunaan API. |
| 402 | INSUFFICIENT_BALANCE | Saldo tidak cukup untuk membuat order. |
| 404 | NO_NUMBER | Stok nomor untuk layanan/negara tersebut habis. |
| 404 | ORDER_NOT_FOUND | Order ID tidak ditemukan. |
| 409 | ORDER_NOT_ACTIVE | Order sudah selesai/dibatalkan. |
| 429 | RATE_LIMITED | Terlalu banyak request. Coba lagi beberapa saat. |
| 500 | SERVER_ERROR | Kesalahan internal pada server. |
Contoh Error Response
{
"success": false,
"error": {
"code": "INVALID_API_KEY",
"message": "API Key tidak valid atau sudah dicabut."
}
}
Butuh saldo atau API Key?
Deposit dan generate API Key dilakukan melalui Bot Telegram. Buka menu deposit, lalu jalankan /API generate <label>.