Rate Limits & Quotas — WhatsApp Profile API
How request quotas, burst rate limits, and overage billing work across every pricing tier.
Monthly quota per tier
| Tier | Monthly quota | Overage | Hard limit |
|---|---|---|---|
| BASIC | 50 requests | — | Yes — blocks at 50 |
| PRO | 10,000 requests | $0.010 / request | No |
| ULTRA | 50,000 requests | $0.008 / request | No |
| MEGA | 500,000 requests | $0.005 / request | No |
| Pay-As-You-Go | Credit-based | — | Yes — blocks at 0 credits |
Burst / per-second limits
A per-tier burst limit prevents abuse from a single key:
| Tier | Default burst (req/sec) |
|---|---|
| BASIC | 2 |
| PRO | 2 |
| ULTRA | 2 |
| MEGA | 4 |
MEGA customers needing sustained higher burst can request a custom limit through the dedicated account manager.
Rate-limit headers
Every response includes lowercase headers (RapidAPI convention) for monthly quota tracking:
x-ratelimit-requests-limit: 60000 x-ratelimit-requests-remaining: 59999 x-ratelimit-requests-reset: 2591983 # seconds until reset
429 Too Many Requests
Burst-limit violation (requests too close together) returns HTTP 429 with a short error body:
HTTP/1.1 429 Too Many Requests
{
"error": "Requests must be at least 0.5 seconds apart"
}The 0.5 seconds apart wording reflects the default minIntervalSeconds on most plans (= 2 req/sec). Inspect /api-key-stats → roleInfo.minIntervalSeconds for your plan's exact value.
Check your own quota
The proxy exposes GET /api-key-stats — call it any time to read the live counter:
{
"key": "08dc53d3-...",
"role": "pro_60",
"status": "active",
"requestLimit": 60000,
"requestRemaining": 59999,
"requestReset": 2591982,
"resetAt": "2026-05-27T02:24:56.708Z",
"expiresAt": "2026-05-27T02:24:56.708Z",
"lastUsedAt": "2026-04-27T02:25:12.955Z",
"requestCountMonth": 1,
"maxMonthlyUsage": 60000,
"roleInfo": {
"name": "pro_60",
"maxMonthlyUsage": 60000,
"minIntervalSeconds": 0.5
}
}Caching policy
Profile data is cached server-side. Repeat lookups for the same number within the cache window are served from cache. To force a fresh lookup, append ?forceBypassCache=1 to /number/{number} — the fresh request still counts against quota.
Related
What Our Users Say
Real reviews from our satisfied customers