Single WhatsApp Number Lookup API
Check whether one phone number is registered on WhatsApp with a single, synchronous GET request. The answer comes back in the response body — no request_id, no polling, no CSV. Ideal for one-off lookups, interactive flows, and AI agents.
GET https://api.bulknumberchecker.com/api/v1/lookup?number=%2B6281234567890When to use this endpoint
The single lookup complements the existing bulk async flow — it does not replace it. Pick the one that matches your job.
/lookup- One GET request, answer in the body.
- No
request_id, no polling loop. - Best for interactive lookups and AI agents.
/check- Submit up to 10 numbers per request.
- Poll for status, then download a CSV.
- Best for lists. See the bulk docs.
Endpoint reference
Request
The number query parameter is required. It accepts E.164 format (+6281234567890) or a local format (081234567890), which is interpreted with a default country of Indonesia (ID). URL-encode the leading + as %2B.
GET https://api.bulknumberchecker.com/api/v1/lookup?number=%2B6281234567890Response — 200
{
"number": "+6281234567890",
"valid": true,
"on_whatsapp": true,
"country_code": "ID",
"country_name": "Indonesia",
"cached": true,
"checked_at": "2026-06-04T07:00:00.000Z",
"rate_limit": {
"limit": 5,
"remaining": 4,
"reset_at": "2026-06-05T00:00:00.000Z"
}
}Response fields
| Field | Description |
|---|---|
number | Normalized E.164 number when valid; the trimmed raw input when not. |
valid | Whether the input is a parseable phone number (boolean). |
on_whatsapp | true (registered), false (not registered), or null when invalid or undetermined. |
country_code | ISO 3166-1 alpha-2 code (e.g. ID). null when invalid. |
country_name | Human-readable country name. null when invalid. |
cached | true if served from cache; false if a live WhatsApp query ran. |
checked_at | ISO 8601 timestamp the status was determined; null when invalid. |
rate_limit | Object with limit, remaining, and reset_at for the daily IP quota. |
Code examples
# curl — look up a single number (URL-encode the leading + as %2B)
curl "https://api.bulknumberchecker.com/api/v1/lookup?number=%2B6281234567890"
# Example 200 response:
# {
# "number": "+6281234567890",
# "valid": true,
# "on_whatsapp": true,
# "country_code": "ID",
# "country_name": "Indonesia",
# "cached": true,
# "checked_at": "2026-06-04T07:00:00.000Z",
# "rate_limit": { "limit": 5, "remaining": 4, "reset_at": "2026-06-05T00:00:00.000Z" }
# }Errors
| Status | Body | When |
|---|---|---|
400 | {"error":"number required"} | The number query parameter is missing or empty. |
200 | { valid:false, on_whatsapp:null, ... } | The number could not be parsed. No WhatsApp query runs, but it still counts as 1 request. |
503 | {"error":"whatsapp_unavailable"} | Cache miss but no WhatsApp session is connected. Retry later; cache hits still work. |
504 | {"error":"lookup_timeout"} | Cache miss and the live WhatsApp query exceeded the lookup timeout (~6s). |
429 | {"error":"rate_limit_exceeded","limit":5,"remaining":0,"reset_at":"..."} | The daily IP quota is exhausted. |
A 503 whatsapp_unavailable means no live WhatsApp session is currently connected, so a cache-miss lookup cannot run. Cached results still return normally. Retry later, or fall back to the bulk flow.
Rate limits
- 5 requests per IP per day — quota resets at UTC midnight.
- The single lookup shares the same bucket as
POST /api/v1/check. Each lookup counts as 1 request. - Every response carries a
rate_limitobject so you can track remaining quota.
Need higher limits? Contact us.
Resources
Checking a list instead?
Use the bulk async flow to validate up to 10 numbers per request, poll, and export a CSV.
View Bulk API Docs