Developer API
Integrate SMS verification into any platform via standard REST API. Supports bulk operations, complete documentation, and rich SDKs.
Complete one number workflow first
Step 1 is only for finding a project ID and can be skipped when you already have a pid. Then follow the remaining steps from left to right to choose a channel, get a number, and receive its SMS; use the final step only when the number is no longer needed.
http://api.fastpva.com/pvapublic- 01
Optional: find a project ID
Get a pid from the project list; skip if you already have one.
- 02
Choose a channel
Use pid and country code to get a channelId.
- 03
Get a number
Send your selection and save the returned orderId.
- 04
Poll for SMS
Use the orderId to check for a code.
- 05
Release the number
Release the order when no more SMS is needed.
Open the current step to see only what it needs
Understand the purpose first, then inspect its parameters—there is no need to absorb every endpoint at once.
Optional: get the unified project list to find a project ID (pid)
Step 01| Parameter | Description | Example |
|---|---|---|
| page | Page number. | 1 |
| limit | Number of results per page. | 20 |
| keyword? | Optional search term. | telegram |
Optional: use this endpoint to find the project ID (pid). page=1 is the page number; limit=20 is page size; keyword=telegram is an optional search term.
Code Examples
The examples follow the complete get-number and polling workflow, ready to use as your integration starting point.
import requests
import time
TOKEN = "your_token_here"
BASE_URL = "http://api.fastpva.com/pvapublic"
def buy_number(pid: int, channel_id: int, locale: str):
# pid: pid returned by /v4/projects, for example 102103
# channelId: channelId returned by /v4/project/channels, for example 2
# locale: country code, for example SN / AO
# token: Dashboard API Key
resp = requests.get(
f"{BASE_URL}/v4/getNumber",
params={"pid": pid, "channelId": channel_id, "locale": locale, "token": TOKEN}
)
return resp.json()
def wait_for_sms(order_ids: list[str], timeout: int = 120):
# Request uses one string joined by _, response keys stay as individual order IDs.
orders_id = "_".join(order_ids)
received = {}
for _ in range(timeout // 5):
resp = requests.get(
f"{BASE_URL}/sms/codes",
params={"ordersId": orders_id, "token": TOKEN}
).json()
data = resp.get("data", {})
orders = data.get("orders", {})
for order_id in order_ids:
order = orders.get(order_id)
if order and (order.get("code") or order.get("content")):
received[order_id] = order.get("code") or order.get("content")
if len(received) == len(order_ids):
return received
time.sleep(5)
return receivedResponse Examples
Compare the success results first; use the matching example when you encounter an error or an async state.
{
"code": 1,
"data": {
"orderId": "6a4497df5e1f4a5bf82681b1",
"number": "79161234567"
}
}{
"code": 1,
"data": {
"orders": {
"6a4497df5e1f4a5bf82681b1": {
"number": "79161234567",
"code": "84291",
"content": "Telegram code 84291"
},
"6a4497bf50769b5bcf9e61f9": {
"number": "221771234567",
"code": "518204",
"content": "Your verification code is 518204"
}
},
"balance": 99.50
}
}{
"code": -1,
"data": "Insufficient balance, please recharge."
}{
"code": 2,
"data": "The number is getting..."
}{
"code": -1,
"data": "Not found orderId"
}Get API Key
Register an account to generate an API Key in the dashboard and start integrating immediately.
