Real Non-VOIP Numbers for SMS Verification - Instant Delivery

OTP Grove REST API v1 — authenticate, list services, buy numbers, poll SMS, and manage orders. Same engine as the dashboard.

Base URL: https://otpgrove.com/api/v1/. Charges deduct from your OTP Grove wallet. Orders created via API use the same order engine as the dashboard and appear immediately in Order History. Existing API keys keep working — create or regenerate only from Dashboard → API Key.

Provider brand in API responses is always OTP Grove. Internal supplier names are not exposed.

Authentication

Every request requires your API key:

  • Header (recommended): Authorization: Bearer YOUR_API_KEY
  • Query: ?api_key=YOUR_API_KEY
curl -X GET "https://otpgrove.com/api/v1/balance/" \
  -H "Authorization: Bearer YOUR_API_KEY"

Invalid / missing key → HTTP 401:

{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "OTP Grove API Invalid API Key"
  },
  "error_message": "OTP Grove API Invalid API Key"
}

Service types

Used by /services/ and /buy/ as type.

typeDescription
usa1Temp Number USA-1
usa2Temp Number USA-2
usa3Temp Number USA-3
globalGlobal temp numbers — country required
longtermLong Term USA (1 / 3 / 7 / 30 Day) — stable product IDs below
dedicatedDedicated 30-day numbers by country & carrier
dataplaneSIM / data plans

Error responses

All errors use OTP Grove branding. Shape:

{
  "success": false,
  "error": {
    "code": "INSUFFICIENT_BALANCE",
    "message": "OTP Grove API Balance Low"
  },
  "error_message": "OTP Grove API Balance Low"
}
HTTPcodeTypical message
401UNAUTHORIZEDOTP Grove API Invalid API Key
400INSUFFICIENT_BALANCEOTP Grove API Balance Low
400NUMBER_UNAVAILABLEOTP Grove API Service Unavailable
400/404OTP_GROVE_ERROROTP Grove API Error: …
HTTPMeaning
200Success
400Bad request — see error.code / error.message (OTP Grove branded)
401OTP Grove API Invalid API Key
404Service or order not found
429Rate limit exceeded — retry after 60s
500OTP Grove API Error — contact support

GET /api/v1/balance/

Wallet balance (server-authoritative).

curl -X GET "https://otpgrove.com/api/v1/balance/" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "balance": "8.56",
  "currency": "USD"
}

GET /api/v1/services/

List purchasable services (price > 0). Header X-Powered-By: OTPGrove API.

ParamRequiredDescription
typeYesOne of the service types above
countryVariesRequired for global. Optional filter for longterm, dedicated, dataplan
curl -X GET "https://otpgrove.com/api/v1/services/?type=usa1" \
  -H "Authorization: Bearer YOUR_API_KEY"

Temp / global item shape:

[
  {
    "id": 1358186,
    "service_code": "wp",
    "name": "WhatsApp",
    "price": "0.0260",
    "currency": "USD",
    "provider": "OTP Grove",
    "providerName": "OTP Grove"
  }
]

Use id as service_id in POST /buy/.

GET /api/v1/countries/

ParamRequiredDescription
typeNoglobal (default), longterm, or dedicated
curl -X GET "https://otpgrove.com/api/v1/countries/?type=dedicated" \
  -H "Authorization: Bearer YOUR_API_KEY"

Long Term Number USA (API products)

GET /api/v1/services/?type=longterm returns these stable product IDs (same pricing as dashboard):

service_idProduct
900001Long Term Number USA — 1 Day
900003Long Term Number USA — 3 Days
900007Long Term Number USA — 7 Days
900030Long Term Number USA — 30 Days
curl -X POST "https://otpgrove.com/api/v1/buy/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"longterm","service_id":900001}'

If inventory is empty → OTP Grove API Service Unavailable.

Dedicated numbers (30-day)

GET /api/v1/services/?type=dedicated lists in-stock dedicated offers with country, carrier, and duration. Optional country filter. Buy with the returned id.

curl -X GET "https://otpgrove.com/api/v1/services/?type=dedicated&country=United%20States" \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /api/v1/buy/

JSON body. Debits wallet atomically on success.

FieldRequiredDescription
typeYesService type
service_idYesInteger id from /services/
countryVariesRequired for global
area_codeNousa1/usa2/usa3 only — default Random Location
quantityNoLegacy longterm rental / dataplan (default 1)
curl -X POST "https://otpgrove.com/api/v1/buy/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"usa1","service_id":1358186}'
{
  "order_id": "42",
  "number": "+1234567890",
  "status": "pending",
  "provider": "OTP Grove",
  "providerName": "OTP Grove"
}

GET /api/v1/sms/

Poll SMS / OTP for an order you own. Poll every 3–5 seconds while pending.

ParamRequiredDescription
order_idYesFrom buy response
curl -X GET "https://otpgrove.com/api/v1/sms/?order_id=42" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "order_id": "42",
  "sms": "Your code is 123456",
  "status": "received"
}

Status: pending, received, cancelled, timeout.

GET /api/v1/status/

Status only (no full SMS body).

curl -X GET "https://otpgrove.com/api/v1/status/?order_id=42" \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "order_id": "42",
  "status": "pending"
}

POST /api/v1/cancel/

Cancel a pending SMS order when the dashboard cancel rules allow it (no OTP yet; within cancel window; not after renew). Refunds sell price to wallet when eligible.

Not supported for eSIM/dataplan orders and legacy SMSPool rental-request IDs — those return cancel-not-supported.

curl -X POST "https://otpgrove.com/api/v1/cancel/" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"order_id":"42"}'
{
  "status": "cancelled",
  "refund": "0.50"
}

API → Dashboard sync

  • API orders are owned by the authenticated OTP Grove user
  • Same SmsOrder / order lifecycle as the dashboard
  • Visible in Order History and product pages immediately
  • Balance updates on buy / refund
  • SMS status stays in sync when you poll /sms/ or open the dashboard
Rate limits: 60 requests/minute (standard) · 300+/minute (reseller).
Webhook SMS delivery available for reseller/enterprise tiers — contact support.

FAQ

Is OTPGrove API cheaper than SMS-Activate?

Yes. OTPGrove REST API starts from about $0.10 per real non-VoIP OTP with no $30 minimum. SMS-Activate shut down — migrate getNumber/getSMS scripts to /api/v1/ endpoints.

Does the API provide real non-VoIP numbers?

Yes. Every usa1/usa2/global temp number via API is a real non-VoIP carrier number — not VoIP. Ideal for WhatsApp, Google, Telegram OTP automation.

How do I get an API key?

Register free at /register/, fund your wallet, then copy your API key from the dashboard API Key page. Start integrating in minutes.

Can I buy bulk non-VoIP numbers via API?

Yes. High-volume developers and resellers get bulk non-VoIP API access with volume discounts. Contact support for wholesale rates above 10,000 OTP/month.

What are the API rate limits?

Standard accounts: 60 requests/minute per API key. Bulk/reseller tiers: 300+ requests/minute. Contact support to raise limits.

Does OTPGrove support webhooks?

Webhook delivery for incoming SMS is on the roadmap for reseller tiers. Currently poll GET /api/v1/sms/ every 3–5 seconds for OTP.