PVADeals API
Build powerful SMS verification solutions with our non-VoIP phone number API. Get access to real carrier phone numbers for account verification across hundreds of services.
Introduction
The PVADeals API provides programmatic access to our SMS verification service. Use it to purchase phone numbers, receive SMS codes, and manage your verification workflow.
Non-VoIP Numbers
Real carrier phone numbers that work with services that block VoIP.
Instant Delivery
SMS codes typically arrive within seconds of being sent.
Authentication
All API requests require authentication using your API key. Include it in the Authorization header with the Bearer prefix.
Authorization: Bearer API-xxxxx...
Getting Your API Key
Sign up at https://app.pvadeals.com/ to get your API key. Once registered, navigate to Settings โ API Keys to generate or view your API key.
Example Request with Authentication
curl -X GET "https://prod-v3.pvadeals.com/v3/api/balance" \
-H "Authorization: Bearer API-Y72DLKL33gGR2mDCOeZgNGriyL2yT56d..."
Quick Start
Follow this typical integration flow to purchase a number and receive an SMS verification code.
Step 1: Get Available Services
curl -X GET "https://prod-v3.pvadeals.com/v3/api/services/all" \
-H "Authorization: Bearer API-xxxxx..."
Step 2: Purchase a Number
curl -X POST "https://prod-v3.pvadeals.com/v3/api/purchase" \
-H "Authorization: Bearer API-xxxxx..." \
-H "Content-Type: application/json" \
-d '{
"services": [
{"serviceId": "697139f7fe5460ddc2f27214"}
]
}'
Step 3: Receive SMS via Webhook
Configure your webhook URL in the dashboard. When an SMS arrives, you'll receive a POST request with the verification code.
Rate Limits
To ensure fair usage and system stability, the API enforces the following rate limits:
| Limit Type | Limit | Window | Notes |
|---|---|---|---|
| API Requests | 100 requests | 60 seconds (rolling) | Per API key |
Rate Limit Response
When you exceed the rate limit, you'll receive a 429 Too Many Requests response:
{
"message": "API Rate limit exceeded. Maximum 100 requests per minute.",
"status": 429,
"retryAfter": 60
}
Retry After
The retryAfter field indicates how many seconds to wait before making another request.
Error Handling
The API uses standard HTTP status codes to indicate success or failure of requests.
| Status Code | Meaning | Common Causes |
|---|---|---|
| 200 OK | Success | Request completed successfully |
| 400 Bad Request | Invalid Request | Missing required fields, invalid JSON |
| 401 Unauthorized | Authentication Failed | Missing or invalid API key |
| 404 Not Found | Resource Not Found | Request ID or Service ID doesn't exist |
| 422 Unprocessable | Business Rule Violation | Flag/Reuse not allowed for this request |
| 429 Too Many Requests | Rate Limit Exceeded | Too many requests, wait and retry |
Error Response Format
{
"success": false,
"message": "Unauthorized Access! Invalid API key",
"status": 401
}
Get Balance
Retrieve your current account balance and credit information.
Example Request
curl -X GET "https://prod-v3.pvadeals.com/v3/api/balance" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": {
"credits": 100.00
},
"message": "Balance retrieved successfully"
}
Response Fields
Get All Services
Retrieve a list of all available services for SMS verification.
Example Request
curl -X GET "https://prod-v3.pvadeals.com/v3/api/services/all" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": {
"services": [
{
"_id": "697139f4fe5460ddc2f271e9",
"name": "3Fun",
"country": "USA",
"price": 0.1
},
{
"_id": "697139f7fe5460ddc2f27214",
"name": "Airbnb",
"country": "USA",
"price": 0.2
}
]
}
}
Response Fields
Purchase Number
Purchase one or more phone numbers for SMS verification. Numbers are available for 20 minutes.
Request Body
Example Request
curl -X POST "https://prod-v3.pvadeals.com/v3/api/purchase" \
-H "Authorization: Bearer API-xxxxx..." \
-H "Content-Type: application/json" \
-d '{
"services": [
{"serviceId": "697139f7fe5460ddc2f27214"}
]
}'
Response
{
"success": true,
"data": {
"requests": [
{
"_id": "697a90d25ef1873ef44f48bc",
"serviceName": "Airbnb",
"serviceId": "697139f7fe5460ddc2f27214",
"number": "+13130001234",
"status": "RESERVED",
"country": "US",
"amount": 0.2,
"numberType": "STR",
"allowFlag": true,
"allowReuse": false,
"reuseCounter": 0,
"endTime": "2026-01-28T23:02:26.292Z",
"createdAt": "2026-01-28T22:42:26.452Z"
}
]
},
"message": "Numbers purchased successfully"
}
Webhook Notification
A number_purchased webhook event will be sent to your configured webhook URL after a successful purchase.
Flag Number
Flag a number to cancel it and receive a refund (if eligible). Only available when allowFlag: true.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id* | string | The service request ID to flag |
Example Request
curl -X POST "https://prod-v3.pvadeals.com/v3/api/flag/697a90d25ef1873ef44f48bc" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": true,
"message": "Number flagged successfully"
}
Flag Availability
Check the allowFlag field before attempting to flag. If allowFlag: false, the request will return a 422 error.
Reuse Number
Reuse a previously purchased number to receive additional SMS codes. Only available when allowReuse: true.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id* | string | The service request ID to reuse |
Example Request
curl -X POST "https://prod-v3.pvadeals.com/v3/api/reuse/697a8d4f8130528198e0c0eb" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": {
"_id": "697a8d4f8130528198e0c0eb",
"serviceName": "Airbnb",
"serviceId": "697a8d4f8130528198e0c0f4",
"number": "+13130001234",
"status": "RESERVED",
"country": "USA",
"amount": 0,
"numberType": "STR",
"allowFlag": false,
"allowReuse": true,
"reuseCounter": 2,
"endTime": "2026-01-28T23:07:17.000Z"
},
"message": "Number reused successfully"
}
Reuse
Reuse is time-limited and not guaranteed for all numbers. In some cases, additional charges may apply.
List Service Requests
Get a paginated list of your service requests (purchased numbers) using cursor-based pagination.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| first | number | 20 | Number of items to fetch |
| after | string | - | Cursor for forward pagination |
| before | string | - | Cursor for backward pagination |
| orderField | string | _id | Field to sort by |
| orderBy | string | desc | Sort order: asc or desc |
Example Request
curl -X GET "https://prod-v3.pvadeals.com/v3/api/requests?first=20&orderBy=desc" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": {
"data": {
"edges": [
{
"cursor": "Njk3YTkwZDI1ZWYxODczZWY0NGY0OGJj",
"node": {
"_id": "697a90d25ef1873ef44f48bc",
"serviceName": "Airbnb",
"serviceId": "697139f7fe5460ddc2f27214",
"number": "+13130001234",
"status": "COMPLETED",
"country": "US",
"amount": 0.2,
"numberType": "STR",
"allowFlag": false,
"allowReuse": true,
"reuseCounter": 0,
"endTime": "2026-01-28T23:02:26.292Z",
"createdAt": "2026-01-28T22:42:26.452Z"
}
}
]
}
}
}
Get Service Request
Get detailed information about a specific service request by its ID.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id* | string | The service request ID |
Example Request
curl -X GET "https://prod-v3.pvadeals.com/v3/api/request/697a90d25ef1873ef44f48bc" \
-H "Authorization: Bearer API-xxxxx..."
Response
{
"success": true,
"data": {
"_id": "697a90d25ef1873ef44f48bc",
"serviceName": "Airbnb",
"serviceId": "697139f7fe5460ddc2f27214",
"number": "+13130001234",
"status": "COMPLETED",
"country": "US",
"amount": 0.2,
"numberType": "STR",
"allowFlag": false,
"allowReuse": true,
"reuseCounter": 0,
"messageCounter": 15,
"endTime": "2026-01-28T23:02:26.292Z",
"createdAt": "2026-01-28T22:42:26.452Z",
"updatedAt": "2026-01-28T22:57:35.016Z"
},
"message": "Service request retrieved successfully"
}
Status Values
| Status | Description |
|---|---|
| RESERVED | Number purchased, waiting for SMS |
| COMPLETED | SMS received successfully |
| FLAGGED | Number was flagged/cancelled |
| TIMEOUT | Number expired without receiving SMS |
Webhooks
Configure a webhook URL in your dashboard to receive real-time notifications about events.
Webhook Retry Policy
Webhooks are retried up to 5 times with a 5-second delay between each attempt if delivery fails.
sms_received
Triggered when an SMS is received on a purchased number.
{
"event": "sms_received",
"timestamp": "2026-01-28T22:57:35.001Z",
"requestId": "697a90d25ef1873ef44f48bc",
"serviceId": "697139f7fe5460ddc2f27214",
"number": "+13130001234",
"message": "Your Airbnb verification code is 2200."
}
number_purchased
Triggered when a number is successfully purchased.
{
"event": "number_purchased",
"timestamp": "2026-01-28T22:42:26.452Z",
"requestId": "697a90d25ef1873ef44f48bc",
"serviceId": "697139f7fe5460ddc2f27214",
"number": "+13130001234",
"message": ""
}
number_flagged
Triggered when a number is flagged/cancelled.
{
"event": "number_flagged",
"timestamp": "2026-01-28T22:42:25.673Z",
"requestId": "697a8d4f8130528198e0c0eb",
"serviceId": "697a8d4f8130528198e0c0f4",
"number": "+13130001234",
"message": ""
}
number_reused
Triggered when a number is reused.
{
"event": "number_reused",
"timestamp": "2026-01-28T21:50:36.765Z",
"requestId": "697a82bf27787d2db20a29a0",
"serviceId": "697a82c127787d2db20a29a6",
"number": "+13130001234",
"message": ""
}