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.
Every request requires your API key:
Authorization: Bearer YOUR_API_KEY?api_key=YOUR_API_KEYcurl -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"
}
Used by /services/ and /buy/ as type.
| type | Description |
|---|---|
usa1 | Temp Number USA-1 |
usa2 | Temp Number USA-2 |
usa3 | Temp Number USA-3 |
global | Global temp numbers — country required |
longterm | Long Term USA (1 / 3 / 7 / 30 Day) — stable product IDs below |
dedicated | Dedicated 30-day numbers by country & carrier |
dataplan | eSIM / data plans |
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"
}
| HTTP | code | Typical message |
|---|---|---|
| 401 | UNAUTHORIZED | OTP Grove API Invalid API Key |
| 400 | INSUFFICIENT_BALANCE | OTP Grove API Balance Low |
| 400 | NUMBER_UNAVAILABLE | OTP Grove API Service Unavailable |
| 400/404 | OTP_GROVE_ERROR | OTP Grove API Error: … |
| HTTP | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad request — see error.code / error.message (OTP Grove branded) |
| 401 | OTP Grove API Invalid API Key |
| 404 | Service or order not found |
| 429 | Rate limit exceeded — retry after 60s |
| 500 | OTP Grove API Error — contact support |
Wallet balance (server-authoritative).
curl -X GET "https://otpgrove.com/api/v1/balance/" \ -H "Authorization: Bearer YOUR_API_KEY"
{
"balance": "8.56",
"currency": "USD"
}
List purchasable services (price > 0). Header X-Powered-By: OTPGrove API.
| Param | Required | Description |
|---|---|---|
type | Yes | One of the service types above |
country | Varies | Required 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/.
| Param | Required | Description |
|---|---|---|
type | No | global (default), longterm, or dedicated |
curl -X GET "https://otpgrove.com/api/v1/countries/?type=dedicated" \ -H "Authorization: Bearer YOUR_API_KEY"
GET /api/v1/services/?type=longterm returns these stable product IDs (same pricing as dashboard):
| service_id | Product |
|---|---|
900001 | Long Term Number USA — 1 Day |
900003 | Long Term Number USA — 3 Days |
900007 | Long Term Number USA — 7 Days |
900030 | Long 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.
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"
JSON body. Debits wallet atomically on success.
| Field | Required | Description |
|---|---|---|
type | Yes | Service type |
service_id | Yes | Integer id from /services/ |
country | Varies | Required for global |
area_code | No | usa1/usa2/usa3 only — default Random Location |
quantity | No | Legacy 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"
}
Poll SMS / OTP for an order you own. Poll every 3–5 seconds while pending.
| Param | Required | Description |
|---|---|---|
order_id | Yes | From 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.
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"
}
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"
}
SmsOrder / order lifecycle as the dashboard/sms/ or open the dashboardYes. 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.
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.
Register free at /register/, fund your wallet, then copy your API key from the dashboard API Key page. Start integrating in minutes.
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.
Standard accounts: 60 requests/minute per API key. Bulk/reseller tiers: 300+ requests/minute. Contact support to raise limits.
Webhook delivery for incoming SMS is on the roadmap for reseller tiers. Currently poll GET /api/v1/sms/ every 3–5 seconds for OTP.