Virtual Numbers API
Purchase real non-VoIP phone numbers from 120+ countries, receive OTP/SMS codes, and manage orders programmatically with a simple REST API.
All requests require your API key as a Bearer token in the Authorization header.
Your API key is in your dashboard under Profile → API Key. Include it in every request.
Authorization: Bearer your_api_key_here
Follow these steps to get a verification code in minutes.
price from /prices directly to /purchase. Poll /check every 3–5 seconds until status = "Completed".
Check your wallet balance, loyalty tier, and discount progress.
{
"success": true,
"data": {
"balance": 12.5000,
"currency": "USD",
"email": "user@example.com",
"total_spent": 45.2000,
"discount": {
"tier": "Silver",
"percent": 10,
"next_tier": "Gold",
"next_at": 100,
"needed": 54.8000
}
}
}
Get all supported countries. Use the id to fetch services and prices.
{
"success": true,
"data": {
"countries": [
{ "id": 4, "name": "Afghanistan" },
{ "id": 36, "name": "Canada" },
{ "id": 6, "name": "Russia" }
// ...
]
}
}
Get available services for a specific country.
| Parameter | Type | Required | Description |
|---|---|---|---|
| country_id | integer | Required | Country ID from /countries — e.g. 6 for Russia |
curl https://daisysim.com/api/v1/virtual/services/6 \ -H "Authorization: Bearer your_api_key"
{
"success": true,
"data": {
"country_id": 6,
"services": [
{ "code": "go", "name": "Google" },
{ "code": "wa", "name": "WhatsApp" },
{ "code": "tg", "name": "Telegram" }
]
}
}
Get price tiers for a country + service. Pass the price value directly to /purchase.
| Field | Type | Required | Description |
|---|---|---|---|
| country | integer | Required | Country ID (1–999) |
| service | string | Required | Service code from /services — e.g. "wa" |
/purchase. Discount cashback is credited automatically after each code.
{
"success": true,
"data": {
"total_numbers": 12702,
"discount_tier": "Silver",
"discount_pct": 10,
"tiers": [
{
"tier": 1,
"price": 1.1400, // ← pass this to /purchase
"discount_pct": 10,
"available": 483
}
]
}
}
Buy a virtual number. Send the price from /prices exactly — server validates it against live pricing.
| Field | Type | Required | Description |
|---|---|---|---|
| country | integer | Required | Country ID (1–999) |
| service | string | Required | Service code — e.g. "wa" |
| price | float | Required | Exact price from /prices — do not modify |
| service_name | string | Optional | Human-readable label e.g. "WhatsApp" |
price value. Any tampered or stale price returns INVALID_PRICE.
curl -X POST https://daisysim.com/api/v1/virtual/purchase \ -H "Authorization: Bearer your_api_key" \ -H "Content-Type: application/json" \ -d '{ "country": 6, "service": "wa", "service_name": "WhatsApp", "price": 1.1400 }'
{
"success": true,
"data": {
"activation_id": "123456789",
"phone_number": "+79001234567",
"amount_charged": 1.1400,
"balance_after": 11.3600
}
}
Poll every 3–5 seconds until you receive the verification code.
{ "data": { "status": "Waiting", "code": null } }
{ "data": { "status": "Completed", "code": "483921", "phone_number": "+79001234567" } }
Cancel a pending number and receive a full refund to your wallet.
{
"success": true,
"data": {
"activation_id": "123456789",
"refund": 1.1400,
"balance_after": 12.5000
}
}
Receive instant push notifications when an SMS code is received — no polling required.
| Field | Type | Description |
|---|---|---|
| event | string | Always "code.received" |
| activation_id | string | Activation ID of the number |
| phone_number | string | Phone number that received the SMS |
| service | string | e.g. "WhatsApp" |
| code | string | The extracted OTP/verification code |
| received_at | string | ISO 8601 timestamp |
app.post('/webhook', express.json(), (req, res) => {
const { event, code, activation_id, phone_number } = req.body;
if (event === 'code.received') {
console.log(`Code ${code} received for ${phone_number}`);
}
res.json({ ok: true });
});
Retrieve your paginated order history with optional status filtering.
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number |
| per_page | integer | 20 | Items per page (max 100) |
| status | string | — | waiting · completed · cancelled |
All errors return a consistent envelope with a machine-readable code field.
{ "success": false, "error": "Human-readable message", "code": "MACHINE_CODE" }