Fast integration
From API key → number → OTP with copy/paste requests and expandable reference below.
✅ Trusted by 360,195+ users · ⭐ 4.1/5 on Trustpilot · 200+ countries✅ 360,195+ users · Trustpilot
Read FAQs →
Integrate faster: request numbers, receive OTP SMS, handle errors cleanly, and scale with polling best practices.
Base URL: https://api.pvapins.com/user/api/
Responsible use: Follow local laws and each platform’s terms. PVAPins is not affiliated with third-party apps.
Minimal steps to your first OTP via API.

Predictable responses, clear flows, and practical guidance for production.
From API key → number → OTP with copy/paste requests and expandable reference below.
Separate temporary and rent logic so your code stays easier to debug.
Rate-limit-friendly polling, error mapping, and retry tips.
Replace YOUR_API_KEY, COUNTRY_ID, APP_ID, and NUMBER with your values.
curl -s 'https://api.pvapins.com/user/api/load_countries.php'curl -s 'https://api.pvapins.com/user/api/load_apps.php?country_id=COUNTRY_ID'curl -s 'https://api.pvapins.com/user/api/get_number.php?customer=YOUR_API_KEY&app=APP_NAME&country=COUNTRY_NAME'# Poll every 3–6s with backoff
curl -s 'https://api.pvapins.com/user/api/get_sms.php?customer=YOUR_API_KEY&number=NUMBER&country=COUNTRY_NAME&app=APP_NAME'Combine / operator (optional): For services that use a group name plus an operator suffix on the site, add &operator=OPERATOR_SUFFIX and set app to the group name (not the full internal name). Use the same pairing on get_number, get_sms, and reject endpoints. If you omit operator, app must stay the full app name, unchanged from before.
# get_number / get_sms / reject — use the same app + operator pair everywhere
curl -s 'https://api.pvapins.com/user/api/get_number.php?customer=YOUR_API_KEY&app=GROUP_NAME&country=COUNTRY_NAME&operator=OPERATOR_SUFFIX'Integration tip: Use exponential backoff (e.g. 3s → 5s → 8s) and stop after a timeout.
Most action endpoints require your API key as the customer query parameter. Never expose it in client-side code.
Register, open your dashboard, and copy the key. Use it only on your server.
Store keys in environment variables, rotate if leaked, and log requests in production.
One-time verification sessions. See full reference for payloads and errors.
country_idcustomer, country (and app per docs)customer, app, countryoperator — when set, app is the group/combine name and operator is the suffix (see full reference)customer, number, country, appoperator — same pairing rules as Get numberFor repeated OTPs or longer access — keep rent calls separate in your codebase.
Repeat logins, re-verification, or when you may need another code on the same line.
Use rent-specific parameters (e.g. is_rent=1) as in the reference below.
curl -s 'https://api.pvapins.com/user/api/get_number.php?customer=YOUR_API_KEY&app=APP_NAME&country=COUNTRY_NAME&is_rent=1'Combine / operator: Optional &operator=… works with rent requests too — same rules as the temporary flow (app = group name when operator is set).
Treat limits as normal — throttle, backoff, and map errors to clear actions.
Start around 3–6s, then backoff; stop after a max wait; log failures.
Throttle concurrent polls; queue requests under load.
One internal table: message → meaning → action (retry / new number / balance / key).
Pick the right model before you wire up automation.
Quick answers for integrators.
Register, log in, and copy your key from the dashboard. Use it server-side only.
Listing countries/apps is typically public; requesting numbers and fetching SMS requires your key.
Request a number, then poll get_sms with backoff until the code appears or you time out.
Temporary is for a short session; rent keeps the same line for repeated codes over a rental period.
Check the customer parameter matches your API key exactly.
Wait, poll with backoff, then try another route; avoid hammering the API.
operator parameter? +Optional. For combine-style services, pass the operator suffix and set app to the group name shown on the site. Omit operator if you use the full app name as app (default behavior).
Yes — design throttling and exponential backoff into your integration.
Use monitoring, error mapping, and compliance controls; follow platform terms.
Expand each block for parameters, examples, and error messages. Switch tabs for temporary vs rent endpoints.
id: Unique country identifierfull_name: Full country name
country_id: Country ID to get apps for (required)
id: Unique app identifierfull_name: Full app nametimestamp: Last update timestamptrending: Trending status (1 = trending, 0 = not trending)deduct: Cost deduction amount
customer: Your API key (required)country: Country name to check rates for
operator is present, app must be the group/combine name (as on the website), and operator is the suffix for that service. Omit operator to keep classic behavior: app = full application name.
customer: Your API key (required)app: Full application name, or group name when using operatorcountry: Country name (e.g., malaysia, indonesia, philippines)operator: Optional — operator suffix for combine-style servicesnumber: Phone number to reuse (optional, for reuse feature only)&number=PHONE_NUMBER parameter to reuse a previously used number?customer=apikey&app=google&country=malaysia&number=112869xxxcustomer: Your API key (required)number: Phone number to check SMS forcountry: Country nameapp: Full application name, or group name when using operatoroperator: Optional — same pairing as Get number
customer: Your API key (required)number: Phone number to rejectcountry: Country nameapp: Full application name, or group name when using operatoroperator: Optional — same pairing as Get number / Get SMSget_reject.php (alternate URL using n_id) supports the same optional operator parameter.customer: Your API key (required)
customer: Your API key (required)
API endpoints for renting phone numbers for extended periods. These endpoints include the is_rent=1 parameter to distinguish from temporary numbers.
is_rent: Set to 1 to get countries available for rent (required)id: Unique country identifierfull_name: Full country name
country_id: Country ID to get apps for (required)is_rent: Set to 1 to get apps available for rent (required)id: Unique app identifierfull_name: Full app nametimestamp: Last update timestamptrending: Trending status (1 = trending, 0 = not trending)deduct: Cost deduction amount for rental
customer: Your API key (required)app: Application name (e.g., google, whatsapp, telegram)country: Country name (e.g., malaysia, indonesia, philippines)data: Phone number (success) or error message (failure)code: Response code (100 = success, 200 = error)
customer: Your API key (required)
id: Unique rental IDuser_id: User identifierkey_id: Key identifierapp_id: Application IDnumber: Rented phone numberdeduct: Cost deduction amountduration: Rental duration in dayscountry_id: Country identifieris_released: Release status (0 = active, 1 = released)auto_renew: Auto-renewal status (0 = disabled, 1 = enabled)received_message: Message count receivedapi: API identifiertimestamp: Rental start timestampapp_name: Application namecountry_name: Country nametimestamp_readable: Human-readable timestampdays: Days remaining in rentalexpiry: Rental expiry date and time
days field shows remaining rental daysis_released to see if a number is still activecustomer: Your API key (required)country: Country name (e.g., USA, UK, malaysia)app: Application name (e.g., Rent GPay GPlay GVoice)number: Rented phone number to check SMS for (required)
from: Sender of the SMS messagemessage: Content of the SMS messagetimestamp: Date and time when the SMS was received
customer: Your API key (required)app: Application name (e.g., google, whatsapp, telegram)country: Country name (e.g., malaysia, indonesia, philippines)number: Phone number to reject (required)
data: Response message (success or error)code: Response code (100 = success, 200 = error)
customer: Your API key (required)app: Application name (e.g., google, whatsapp, telegram)country: Country name (e.g., malaysia, indonesia, philippines)number: Phone number to renew (required)
data: Response message (success or error)code: Response code (100 = success, 200 = error)