Place order
Submits a new order against a service in the catalog. The call is idempotent on request_id — retries with the same value return the original response, never a duplicate order.
POST
https://notpanel.com/api/v2action=addAPI key requiredRate limited (per-key + per-tier + per-IP)Body:
application/x-www-form-urlencodedrequest_id is required. Generate a UUID at order-placement time and pass it on every retry of the same logical order. Without it, the API rejects the call with 400 — there is no fallback to server-generated keys.
Parameters
| Name | Type | Description |
|---|---|---|
| keyRequired | string | Your API key. |
| actionRequired | string | Must be the literal string "add". |
| serviceRequired | integer | Service ID from the services list. Service must be active at submission time. |
| request_idRequired | string | Caller-supplied idempotency key. Up to 128 characters. Same value + same body = same response. Two different orders MUST use two different values. |
| linkRequired | string (URL) | Target URL — profile, post, video, channel, etc. Required for most service types; some types (Subscriptions) accept a username instead. Up to 1000 characters; must be http(s). |
| quantityRequired | integer | Number of units to deliver. Must satisfy the service's min and max bounds. For Package and Subscriptions services this parameter is ignored — billing uses service.min. |
| runs | integer | Drip-feed: how many times to repeat the order. Only meaningful for services where dripfeed is true. |
| interval | integer | Drip-feed: minutes between runs. Only meaningful when runs > 1. |
| coupon | string | Coupon code to apply. Subject to the coupon's per-user, global, and service constraints. |
Example request
Replace YOUR_API_KEYwith the key generated under your dashboard’s API page.
curl -X POST https://notpanel.com/api/v2 \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "key=YOUR_API_KEY&action=add&service=1&request_id=550e8400-e29b-41d4-a716-446655440000&link=https://instagram.com/example&quantity=1000"const res = await fetch("https://notpanel.com/api/v2", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
action: "add",
service: "1",
request_id: "550e8400-e29b-41d4-a716-446655440000",
link: "https://instagram.com/example",
quantity: "1000",
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://notpanel.com/api/v2",
data={
"key": "YOUR_API_KEY",
"action": "add",
"service": "1",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"link": "https://instagram.com/example",
"quantity": "1000",
},
)
print(res.json())<?php
$body = http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => '1',
'request_id' => '550e8400-e29b-41d4-a716-446655440000',
'link' => 'https://instagram.com/example',
'quantity' => '1000',
]);
$response = file_get_contents('https://notpanel.com/api/v2', 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));
Example response
{
"order": "ord_01HG9X7KJP4N..."
}Common errors
| Status | Body | Cause |
|---|---|---|
| 400 | {"error":"Missing required parameter: request_id"} | request_id was not included. Always pass a UUID. |
| 400 | {"error":"Service not found"} | Service ID doesn't exist or was deactivated. Re-fetch the services list. |
| 400 | {"error":"Insufficient balance"} | Account balance is below the order's total charge. Top up via the dashboard. |
| 400 | {"error":"Quantity must be a positive integer"} | Quantity was zero, negative, or non-integer. Validate before submission. |