Orders
Place an order
Places an order and takes the money in one step. The reply comes straight away: the order is Pending and can be canceled for free during its first 15 seconds. Send your own request_id so a retry never creates a second order.
https://notpanel.com/api/v3action=add- API key required
- Rate limited
- Body:
application/x-www-form-urlencoded
Parameters
Always sent
keystringRequired- Your API key.
actionstringRequiredaddMust be the literal string "add".
Order
serviceintegerRequired- Service id from the services list.
linkstringRequired- The link to deliver to. What counts as valid depends on the service.
quantityintegerDepends on service type- Total quantity. With
runsandintervalit is the quantity per run. Lists and exact reactions count their own quantity, and packages have a fixed one.
Retries
request_idstringOptional- Your own id for this order, up to 128 characters. Repeating it with the same parameters returns the original order. Using it with different parameters returns
REQUEST_ID_CONFLICT. idempotency_keystringOptional- Alias of
request_id. When both are sent,request_idwins.
Drip-feed
runsintegerOptional- Classic drip-feed: the number of runs, from 2 to 100.
runs=1is a normal order. intervalintegerOptional- Classic drip-feed: minutes between runs, from 1 to 1440.
drip_feed_total_minutesintegerOptional- Simple drip-feed: finish the whole
quantitywithin this many minutes, from 1 to 2880. Do not combine it withrunsandinterval.
Fields from the service
reactionsstringOptional- Telegram reactions, for example
👍,❤️,🔥or👍:60,❤️:40. comments, usernames, answer_number, …Depends on service type- Other extra fields by their wire name, such as
comments,usernamesoranswer_number. The service'sfieldslist says which ones it takes.
curl -X POST https://notpanel.com/api/v3 \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "key=YOUR_API_KEY&action=add&service=7&link=https://instagram.com/example&quantity=1000&request_id=550e8400-e29b-41d4-a716-446655440000"const res = await fetch("https://notpanel.com/api/v3", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
action: "add",
service: "7",
link: "https://instagram.com/example",
quantity: "1000",
request_id: "550e8400-e29b-41d4-a716-446655440000",
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://notpanel.com/api/v3",
data={
"key": "YOUR_API_KEY",
"action": "add",
"service": "7",
"link": "https://instagram.com/example",
"quantity": "1000",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
},
)
print(res.json())<?php
$body = http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => '7',
'link' => 'https://instagram.com/example',
'quantity' => '1000',
'request_id' => '550e8400-e29b-41d4-a716-446655440000',
]);
$response = file_get_contents('https://notpanel.com/api/v3', false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
'content' => $body,
'ignore_errors' => true,
],
]));
print_r(json_decode($response, true));
Replace YOUR_API_KEY with the key from your API page.
{
"order": 1234567,
"status": "Pending",
"status_key": "pending",
"charge": "1.20",
"currency": "USD",
"instant_cancel_until": "2026-10-03T10:00:15Z",
"cancel_available": true,
"cancel_window_seconds": 15,
"cancel_before": "2026-10-03T10:00:15Z"
}Errors
- 400
{"error":"Minimum quantity is 100","error_code":"MINIMUM_QUANTITY","retryable":false,"details":{"n":100}}The quantity is below the service minimum. The same shape covers the maximum, the step and the other checks.
- 402
{"error":"Insufficient balance","error_code":"INSUFFICIENT_BALANCE","retryable":false}The wallet cannot cover the charge. Nothing was charged and no order exists. Add funds in
/dashboard/wallet. - 409
{"error":"request_id was already used with different parameters","error_code":"REQUEST_ID_CONFLICT","retryable":false}That
request_idalready placed an order with different parameters. Use a newrequest_idfor a different order.
Response
Every successful add returns the new order right away. Internal delivery details never appear; later changes show in status and in webhooks.
Response fields
orderinteger- The order number. It is the same number in the dashboard, in support and in every other action.
statusstringPendingfor a new order. A repeatedrequest_idreturns the order's current status.status_keystringpendingfor a new order, otherwise the key of the current status.chargestring- What you were charged, in USD, as a string.
currencystring- Always
USD. instant_cancel_untilstring (UTC time)- End of the free-cancel window: 15 seconds after placement.
cancel_availablebooleantruewhile the order can still be canceled for a full refund. Kept for earlier scripts.cancel_window_secondsinteger- Length of the free-cancel window in seconds: 15. Kept for earlier scripts.
cancel_beforestring (UTC time)- The same time as
instant_cancel_until. Kept for earlier scripts. replayedboolean- Present and true only when this is the original order of a repeated
request_id.
Retries and request_id
request_id (or its alias idempotency_key, up to 128 characters) is looked up before anything else. The same request returns the original order and nothing is charged twice. A different request with the same id returns REQUEST_ID_CONFLICT. If two copies arrive at once, one wins and the other gets the same order back.
key=YOUR_API_KEY&action=add&service=7&link=https://instagram.com/example&quantity=1000&request_id=550e8400-e29b-41d4-a716-446655440000{
"order": 1234567,
"status": "In progress",
"status_key": "in_progress",
"charge": "1.20",
"currency": "USD",
"instant_cancel_until": "2026-10-03T10:00:15Z",
"cancel_available": false,
"cancel_window_seconds": 15,
"cancel_before": "2026-10-03T10:00:15Z",
"replayed": true
}key=YOUR_API_KEY&action=add&service=7&link=https://instagram.com/example&quantity=2000&request_id=550e8400-e29b-41d4-a716-446655440000{
"error": "request_id was already used with different parameters",
"error_code": "REQUEST_ID_CONFLICT",
"retryable": false
}After you place an order
The order is Pending and you can cancel it for a full refund during its first 15 seconds. Problems found after that, such as a wrong link or a busy link, arrive as a Canceled order with a reason_code and an automatic refund. They are never errors of add.
What is checked, in order
The first problem found is returned and nothing is charged.
- The service exists and can take orders:
SERVICE_NOT_FOUND,SERVICE_DISCONTINUED,SERVICE_PAUSED. - The quantity is within the minimum and maximum:
MINIMUM_QUANTITY,MAXIMUM_QUANTITY. - The quantity fits the step:
QUANTITY_STEP. - Lists and exact reactions: the quantity matches the number of items,
QUANTITY_MISMATCH. - The extra fields are offered and valid:
OPTION_NOT_SUPPORTED,MISSING_PARAMETER,INVALID_OPTION. - Drip-feed values fit:
DRIP_FEED_NOT_AVAILABLE,DRIP_FEED_CONFLICT,DRIP_FEED_INVALID. - The link fits the service:
INVALID_LINK,LINK_BLOCKED. - One active order per link, where the service has that rule:
LINK_BUSY. - The balance covers the charge:
INSUFFICIENT_BALANCE.
Errors of add
All of these use the common error shape. Branch on error_code; the message text is for people.
- 400
MISSING_PARAMETER
Missing required parameter: {param}A required parameter is missing. details.param names it. Fix the request first.
- 400
INVALID_PARAMETER
Invalid {param}: {rule}A parameter has an invalid value. details.param and details.rule say which one and why. Fix the request first.
- 404
SERVICE_NOT_FOUND
Service not foundNo service has this id, or it is not available to you. Fix the request first.
- 410
SERVICE_DISCONTINUED
Service has been discontinuedThe service has been discontinued. Fix the request first.
- 409
SERVICE_PAUSED
Service is temporarily unavailableThe service is paused for now. Try again later. Retrying can help.
- 503
ORDER_PLACEMENT_PAUSED
Ordering is temporarily pausedOrdering is paused for everyone for a short time. Retry-After says when to try again. Retrying can help.
- 400
MINIMUM_QUANTITY
Minimum quantity is {n}The quantity is below the service minimum. Fix the request first.
- 400
MAXIMUM_QUANTITY
Maximum quantity is {n}The quantity is above the service maximum. Fix the request first.
- 400
QUANTITY_STEP
Quantity must be a multiple of {step}The quantity is not a multiple of the service step. Fix the request first.
- 400
QUANTITY_MISMATCH
quantity must equal the number of items in {param} ({count})The quantity does not match the number of items in a list or reactions field. Fix the request first.
- 400
MINIMUM_ORDER_AMOUNT
Minimum order amount is ${amount}The order is worth less than the minimum order amount. Fix the request first.
- 400
OPTION_NOT_SUPPORTED
This service does not accept {param}The service does not take a field you sent. Fix the request first.
- 400
INVALID_OPTION
Invalid {param}: {rule}An extra field has an invalid value. details.param and details.rule say which one and why. Fix the request first.
- 400
DRIP_FEED_NOT_AVAILABLE
Drip-feed is not available for this serviceThe service has no drip-feed, or none for this quantity. Fix the request first.
- 400
DRIP_FEED_CONFLICT
Send runs and interval, or drip_feed_total_minutes, not bothBoth drip-feed forms were sent in one request. Fix the request first.
- 400
DRIP_FEED_INVALID
{rule}The drip-feed values do not fit the limits. The message says which limit. Fix the request first.
- 400
INVALID_LINK
Link is invalid for this serviceThe link does not fit this service. Fix the request first.
- 400
LINK_BLOCKED
This link is blocked. Contact support if this is a mistake.The link is blocked. Contact support if you think that is a mistake. Fix the request first.
- 409
LINK_BUSY
An order for this link is still running. Wait until it finishes.An earlier order for this link is still running. Wait until it finishes. Retrying can help.
- 402
INSUFFICIENT_BALANCE
Insufficient balanceThe wallet balance is lower than the charge. Fix the request first.
- 429
ORDER_LIMIT_REACHED
Too many orders. Try again later.Too many orders were placed or are open at once. Try again later. Retrying can help.
- 409
SERVICE_CHANGED
Service settings changed while placing the order. Retry.The service settings changed while the order was placed. Send the request again. Retrying can help.
- 409
REQUEST_ID_CONFLICT
request_id was already used with different parametersThis request_id already placed an order with different parameters. Fix the request first.
- 500
INTERNAL_ERROR
Internal server errorSomething failed on our side. Repeating an add with the same request_id is safe. Retrying can help.