cURL (Windows)
curl -X POST "https://api.bulkneo.com/v1/instances" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"label\":\"Sales\"}"const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: 'Sales'})
};
fetch('https://api.bulkneo.com/v1/instances', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/instances"
payload = { "label": "Sales" }
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",
"label": "Sales",
"status": "connecting",
"connected": false,
"qrcode": {
"base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
"code": "2@Xj4kR...",
"pairingCode": 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": "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": "provisioning_failed",
"message": "Could not create the instance right now. Please retry shortly."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}Instances
Create a number slot
POST /v1/instances — create an instance to connect a new WhatsApp number to.
POST
/
v1
/
instances
cURL (Windows)
curl -X POST "https://api.bulkneo.com/v1/instances" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"label\":\"Sales\"}"const options = {
method: 'POST',
headers: {apikey: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: 'Sales'})
};
fetch('https://api.bulkneo.com/v1/instances', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/instances"
payload = { "label": "Sales" }
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",
"label": "Sales",
"status": "connecting",
"connected": false,
"qrcode": {
"base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
"code": "2@Xj4kR...",
"pairingCode": 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": "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": "provisioning_failed",
"message": "Could not create the instance right now. 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.instance_id. Nothing is connected yet — someone still has to scan a QR with the phone.
Most people never call this. Adding a number in the portal is easier, and it shows the QR for you. This endpoint exists for software that provisions numbers on its own.
Notes
labelis optional, up to 60 characters. It is for your own reference only; nothing about sending depends on it.- The response may include a
qrcodestraight away. Ifqrcodeisnull, fetch one fromGET /v1/instances/{id}/qr. - Creating an instance counts against your account’s number allowance. Over it, you get
403 instance_limit_reachedwithdetails.instance_limit. See Plans and limits. - This is the only instance endpoint that requires an active plan. Listing, checking, re-scanning, renaming and deleting all keep working when a plan has lapsed.
Connecting the number afterwards
1
Get a QR
Use the
qrcode from this response, or call GET /v1/instances/{id}/qr.2
Show it to the person holding the phone
qrcode.base64 is a data:image/png;base64,... string you can put straight into an <img src="...">.3
They scan it
WhatsApp → Settings → Linked devices → Link a device.
4
Poll until it connects
Call
GET /v1/instances/{id}/qr-status about every 2.5 seconds until connected is true.Example
curl -X POST https://api.bulkneo.com/v1/instances \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "label": "Sales" }'
curl -X POST "https://api.bulkneo.com/v1/instances" -H "apikey: YOUR_API_KEY" -H "Content-Type: application/json" -d "{\"label\":\"Sales\"}"
Save the
instance_id somewhere durable. It is how you name this number in every send from now on, and it never changes for the life of the instance.Authorizations
Your API key, sent in an apikey request header. Never in the URL, never as a Bearer token.
Body
application/json
Your own name for this number, for example "Sales". Up to 60 characters.
Maximum string length:
60Example:
"Sales"

