The v3 API keeps the familiar form-encoded key + action request and JSON response contract. Existing reseller clients can switch their base URL directly; v3 discovery, reconciliation, retry-safety, and webhook fields are optional additions.
Free signup via /register — email or Google OAuth. No credit card required to generate an API key, only to fund the wallet for placing live orders.
Once logged in, head to /dashboard/api. Click "Generate key" and copy the raw value — it is shown once, never again. If you lose it, revoke it and generate a new one. Each user can hold up to 5 active keys.
All of your keys share the account's effective requests-per-minute limit. Lifetime successful spend earns the automatic tier; IP and action limits can also apply — see Rate limits.
Listing services is the simplest read-only call. action=services returns the cached compatibility array of active services with account-priced rate, min, max, and capability flags. Use action=catalog when you need pagination, search, availability, platform/category metadata, or freshness fields. Replace YOUR_API_KEY with the key from step 2.
# 1. List active catalog services
curl -X POST https://notpanel.com/api/v3 \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "key=YOUR_API_KEY&action=services"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: "services",
}),
});
const services = await res.json();
console.log(`Found ${services.length} services`);import requests
res = requests.post(
"https://notpanel.com/api/v3",
data={"key": "YOUR_API_KEY", "action": "services"},
)
services = res.json()
print(f"Found {len(services)} services")<?php
$body = http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'services',
]);
$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,
],
]));
$services = json_decode($response, true);
echo "Found " . count($services) . " services\n";
Need names your regional users understand? Add language=hi (or en, es, pt, ru, tr, ar, id, fr, zh) to services or catalog. Localized names use curated market terminology, brands stay recognizable, and the response reports the actual language used. Admins can review or refine individual names. Leave it out for the unchanged legacy English shape.
Pick a service ID from step 3, fund the wallet via /dashboard/wallet, and call action=add with the fields required by that service type. Existing clients may send the familiar request unchanged. For exact caller-controlled retries, optionally add a unique opaque request_id of at most 128 characters. See Place order for the complete parameter list.
Poll status for individual orders or batches up to 100 IDs. For event-driven integrations, register a webhook for the six supported events: order.completed, order.partial, order.processing, order.in_progress, order.refunded, and order.refill_completed. Delivery is best-effort with retries; reconcile important state with action=status.
Change the base URL and keep the familiar key + action calls. Standard services, add, status, balance, refill, refill_status, and cancel requests work directly. Adopt optional v3 fields and actions when you want stronger retry control, richer discovery, refund quotes, bulk operations, or signed webhooks.