Pilih Server

Kamu sedang membaca dokumentasi Server 1. Server 3 punya dokumentasi terpisah.

Navigasi
REST API v1 · Dokumentasi Resmi

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.

Base URL
GET https://vynapi.vxe.biz.id/v1 JSON

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. 1

    Buka Bot Telegram

    Mulai bot, lalu buka menu deposit untuk melihat saldo akunmu.

    Telegram
    /start
  2. 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. 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. 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.

DISARANKAN Header Authorization (Bearer)
Authorization: Bearer <API_KEY>
Header X-API-Key
X-API-Key: <API_KEY>
Query Parameter

Praktis untuk pengujian cepat di browser, namun kurang aman untuk production.

GET /v1/balance?api_key=<API_KEY>

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.

GET /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.

GET /v1/services?server=&country=6 JSON
ParameterWajibDeskripsi
serverOpsional1 = Server, 3 = Server. Default: 1.
countryWajibID 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.

GET /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.

POST /v1/order JSON
BodyWajibDeskripsi
serverOpsional1 = Server, 3 = Server. Default: 1.
countryWajibID negara dari endpoint countries.
serviceWajibKode layanan, contoh: wa, tg.
operatorOpsionalPilih operator spesifik. Kosong = operator acak termurah.
max_priceOpsionalBatasi 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.

GET /v1/order/{order_id}?server= JSON
StatusArti
PENDINGOrder dibuat, nomor belum siap.
ACTIVENomor aktif, menunggu SMS masuk.
OTP_RECEIVEDKode OTP sudah diterima.
COMPLETEDOrder selesai.
CANCELEDDibatalkan / 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.

POST /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.

POST /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.

POST /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.

GET /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.

HTTPCodeDeskripsi
400BAD_REQUESTParameter tidak lengkap atau tidak valid.
401INVALID_API_KEYAPI Key tidak valid atau sudah dicabut.
403ACCOUNT_BANNEDAkun diblokir dari penggunaan API.
402INSUFFICIENT_BALANCESaldo tidak cukup untuk membuat order.
404NO_NUMBERStok nomor untuk layanan/negara tersebut habis.
404ORDER_NOT_FOUNDOrder ID tidak ditemukan.
409ORDER_NOT_ACTIVEOrder sudah selesai/dibatalkan.
429RATE_LIMITEDTerlalu banyak request. Coba lagi beberapa saat.
500SERVER_ERRORKesalahan 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>.

Lihat cara deposit