cURL (Windows)
curl "https://api.bulkneo.com/v1/instances/YOUR_INSTANCE_ID/qr" -H "apikey: YOUR_API_KEY"const options = {method: 'GET', headers: {apikey: '<api-key>'}};
fetch('https://api.bulkneo.com/v1/instances/{id}/qr', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/instances/{id}/qr"
headers = {"apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"status": "connecting",
"connected": false,
"already_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": "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": "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": "qr_unavailable",
"message": "A QR code is not available yet. Wait a moment and retry."
},
"request_id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}Instances
Get a QR code
GET /v1/instances/{id}/qr — a fresh pairing QR for a number.
GET
/
v1
/
instances
/
{id}
/
qr
cURL (Windows)
curl "https://api.bulkneo.com/v1/instances/YOUR_INSTANCE_ID/qr" -H "apikey: YOUR_API_KEY"const options = {method: 'GET', headers: {apikey: '<api-key>'}};
fetch('https://api.bulkneo.com/v1/instances/{id}/qr', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bulkneo.com/v1/instances/{id}/qr"
headers = {"apikey": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"success": true,
"data": {
"instance_id": "3f9c1a2b-7d4e-4c81-9f0a-2b6d5e8c1a34",
"status": "connecting",
"connected": false,
"already_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": "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": "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": "qr_unavailable",
"message": "A QR code is not available yet. Wait a moment and retry."
},
"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
- If the number is already connected, no QR is issued: you get
already_connected: true,connected: trueandqrcode: null. That is a success, not an error. qrcode.base64is a ready-to-renderdata:image/png;base64,...string — put it straight into an<img src="...">.qrcode.codeis the raw QR payload if you would rather draw the code yourself.- If no QR is ready yet you get
503 qr_unavailablewith aRetry-After: 3header. Wait and try again. - After showing the QR, poll
GET /v1/instances/{id}/qr-status— it returns the refreshed QR and tells you when the scan has succeeded.
Example
curl https://api.bulkneo.com/v1/instances/YOUR_INSTANCE_ID/qr \
-H "apikey: YOUR_API_KEY"
curl "https://api.bulkneo.com/v1/instances/YOUR_INSTANCE_ID/qr" -H "apikey: YOUR_API_KEY"
Rendering it
<img src="{{ data.qrcode.base64 }}" alt="Scan with WhatsApp" width="280" height="280" />
A pairing QR links a real WhatsApp account to your instance. Show it only to the person who owns the number, and never post one in a shared channel or a screenshot.
Authorizations
Your API key, sent in an apikey request header. Never in the URL, never as a Bearer token.
Path Parameters
The instance_id of one of your numbers.

