cURL (Windows)
curl -X POST "https://api.bulkneo.com/v1/numbers/check" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"instance_id\":\"3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34\",\"numbers\":[\"919000000000\",\"919000000001\"]}"const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
instance_id: '3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34',
numbers: ['919000000000', '919000000001']
})
};
fetch('https://api.bulkneo.com/v1/numbers/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/numbers/check"
payload = {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"numbers": ["919000000000", "919000000001"]
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"submitted": 2,
"checked": 2,
"results": [
{
"number": "919000000000",
"exists": true,
"whatsapp_number": "919000000000"
},
{
"number": "919000000001",
"exists": false,
"whatsapp_number": null
}
]
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "invalid_request",
"message": "Field \"text\" is required and must be a non-empty string."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "invalid_api_key",
"message": "Invalid or revoked API key."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "subscription_expired",
"message": "Your subscription has expired. Renew it to continue sending messages."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "trial_quota_exceeded",
"message": "Trial message quota reached (500 messages). Upgrade to a paid plan to keep sending.",
"details": {
"trial_message_limit": 500
}
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "instance_not_found",
"message": "Instance not found. Check the instance_id and that it belongs to your account."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "instance_not_connected",
"message": "This WhatsApp instance is not connected. Connect it before sending messages."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded, retry in 12s.",
"details": {
"retry_after_seconds": 12,
"limit_per_minute": 20,
"scope": "messages"
}
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "upstream_unavailable",
"message": "The messaging service is temporarily unavailable. Please retry shortly."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}Numbers
Check numbers
POST /v1/numbers/check — which of these numbers are on WhatsApp?
POST
/
v1
/
numbers
/
check
cURL (Windows)
curl -X POST "https://api.bulkneo.com/v1/numbers/check" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"instance_id\":\"3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34\",\"numbers\":[\"919000000000\",\"919000000001\"]}"const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
instance_id: '3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34',
numbers: ['919000000000', '919000000001']
})
};
fetch('https://api.bulkneo.com/v1/numbers/check', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/numbers/check"
payload = {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"numbers": ["919000000000", "919000000001"]
}
headers = {
"apikey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"submitted": 2,
"checked": 2,
"results": [
{
"number": "919000000000",
"exists": true,
"whatsapp_number": "919000000000"
},
{
"number": "919000000001",
"exists": false,
"whatsapp_number": null
}
]
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "invalid_request",
"message": "Field \"text\" is required and must be a non-empty string."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "invalid_api_key",
"message": "Invalid or revoked API key."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "subscription_expired",
"message": "Your subscription has expired. Renew it to continue sending messages."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "trial_quota_exceeded",
"message": "Trial message quota reached (500 messages). Upgrade to a paid plan to keep sending.",
"details": {
"trial_message_limit": 500
}
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "instance_not_found",
"message": "Instance not found. Check the instance_id and that it belongs to your account."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "instance_not_connected",
"message": "This WhatsApp instance is not connected. Connect it before sending messages."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded, retry in 12s.",
"details": {
"retry_after_seconds": 12,
"limit_per_minute": 20,
"scope": "messages"
}
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "internal_error",
"message": "An unexpected error occurred."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}{
"success": false,
"error": {
"code": "upstream_unavailable",
"message": "The messaging service is temporarily unavailable. Please retry shortly."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}The playground on this page is live. There is no test mode and no sandbox: pressing Send authenticates with the key you paste and really calls
https://api.bulkneo.com — a send delivers a real WhatsApp message to the number you type, and an instance call really changes your account. Use your own number while you are exploring, and paste a key only from a machine you trust.Your browser remembers what you type into the playground, so a key you paste here is still in the Authorization box on your next visit. Nobody else sees it — it never leaves your machine and it is not part of this site — but on a shared or borrowed computer, clear the site data when you are done.Notes
- 1 to 50 numbers per request. More returns
400 invalid_requestwithdetails.max_numbers. - Duplicates are removed before the lookup.
submittedis what you sent,checkedis how many distinct numbers were actually looked up. - Results come back in the order you submitted them.
- This uses one of your connected numbers to do the lookup, so
instance_idis required and that number must be connected — otherwise you get409 instance_not_connected. - A check is not a message. It does not appear in your usage figures and does not consume a trial allowance. It does count against your per-minute rate limit.
Reading the results
boolean | null
true — on WhatsApp. false — not on WhatsApp. null — the check could not be completed for that number.null does not mean “not on WhatsApp”. Treat it as “unknown” and retry later, or send anyway. Collapsing null into false will make you skip real customers.string | null
The number WhatsApp actually answers on. In some countries this differs from the number you dialled — Brazil’s extra 9th digit is the classic case. When it differs, send to this number, not the one you looked up.
Example
curl -X POST https://api.bulkneo.com/v1/numbers/check \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "YOUR_INSTANCE_ID",
"numbers": ["919000000000", "919000000001"]
}'
curl -X POST "https://api.bulkneo.com/v1/numbers/check" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"instance_id\":\"YOUR_INSTANCE_ID\",\"numbers\":[\"919000000000\",\"919000000001\"]}"
const res = await fetch("https://api.bulkneo.com/v1/numbers/check", {
method: "POST",
headers: {
apikey: process.env.BULKNEO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
instance_id: process.env.BULKNEO_INSTANCE_ID,
numbers: batch, // at most 50
}),
});
const { data } = await res.json();
const sendable = data.results
.filter((r) => r.exists === true)
.map((r) => r.whatsapp_number ?? r.number);
import os
import requests
res = requests.post(
"https://api.bulkneo.com/v1/numbers/check",
headers={"apikey": os.environ["BULKNEO_API_KEY"]},
json={
"instance_id": os.environ["BULKNEO_INSTANCE_ID"],
"numbers": batch, # at most 50
},
timeout=30,
)
res.raise_for_status()
results = res.json()["data"]["results"]
sendable = [r["whatsapp_number"] or r["number"] for r in results if r["exists"] is True]
unknown = [r["number"] for r in results if r["exists"] is None]
Working through a large list quickly still puts your number at risk, whatever the batch size. Read Checking numbers before you send for how to pace it.
Authorizations
Your API key, sent in an apikey request header. Never in the URL, never as a Bearer token.
Body
application/json
Which of your connected numbers to send FROM. Copy it from your numbers screen in the portal, or from GET /v1/instances. It must belong to your account.
Example:
"3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34"
1 to 50 numbers per request, each with its country code. Duplicates are removed before the lookup.
Required array length:
1 - 50 elementsExample:
["919000000000", "919000000001"]

