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.
Endpoint URLGET http://api.fastpva.com/pvapublic/v4/projects - 02
Choose a channel
Use pid and country code to get a channelId.
Endpoint URLGET http://api.fastpva.com/pvapublic/v4/project/channels - 03
Get a number
Send your selection and save the returned orderId.
Endpoint URLGET http://api.fastpva.com/pvapublic/v4/getNumber - 04
Poll for SMS
Use the orderId to check for a code.
Endpoint URLGET http://api.fastpva.com/pvapublic/sms/codes - 05
Release the number
Release the order when no more SMS is needed.
Endpoint URLGET http://api.fastpva.com/pvapublic/sms/releaseNumber
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.
curl "http://api.fastpva.com/pvapublic/v4/projects?page=1&limit=20&keyword=telegram"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={"orderId": 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.
