Advanced service catalog
Returns a paginated snapshot of active services with account-priced rates and structured discovery metadata. Use the legacy services action when an existing reseller SDK requires the original cached array shape.
https://notpanel.com/api/v3action=catalogapplication/x-www-form-urlencodedaction=catalog is a discovery snapshot. catalog_updated_at describes the newest catalog metadata in the filtered result, not a guaranteed price timestamp or quote. The charge returned by the committed action=add response is authoritative.Parameters
| Name | Type | Description |
|---|---|---|
| keyRequired | string | Your API key. |
| actionRequired | string | Must be the literal string "catalog". |
| page | integer | Page number from 1 to 100000. Defaults to 1. |
| limit | integer | Rows per page from 1 to 200. Defaults to 100. |
| language | language code | Optional service-name language: en, es, pt, ru, tr, ar, hi, id, fr, or zh. pt is Brazilian Portuguese and zh is Simplified Chinese. Curated market terminology preserves recognizable brands and product identifiers. Omit it for the legacy English response shape. Admins can review or refine individual names. |
| search | string | Case-insensitive service-name search, or an exact numeric service ID. Maximum 100 characters. |
| platform | integer | slug | Platform numeric ID or slug. |
| category | integer | slug | Category numeric ID or slug. A slug requires platform; a numeric category ID can be used without platform. |
| type | string | Exact supported service type, such as default, custom_comments, subscriptions, or web_traffic. |
| sort | string | One of popular, price_asc, price_desc, time_asc, time_desc, name_asc, or newest. Defaults to popular. |
| refill | boolean | Filter by refill capability. Accepts 1, 0, true, or false. |
| dripfeed | boolean | Filter by drip-feed capability. Accepts 1, 0, true, or false. |
| available | boolean | Filter by current order availability. Accepts 1, 0, true, or false; action=add still re-checks availability when committing an order. |
| min_rate | USD decimal | Minimum non-negative account-priced USD rate per 1,000 units. Use a canonical decimal from 0 to 999999999999.99999999, with at most 12 whole-number and 8 fractional digits; signs and exponents are rejected. |
| max_rate | USD decimal | Maximum non-negative account-priced USD rate per 1,000 units. It cannot be lower than min_rate. Use a canonical decimal from 0 to 999999999999.99999999, with at most 12 whole-number and 8 fractional digits; signs and exponents are rejected. |
Example request
Replace YOUR_API_KEY with the key generated under your dashboard’s API page.
curl -X POST https://notpanel.com/api/v3 \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "key=YOUR_API_KEY&action=catalog&platform=instagram&available=true&sort=price_asc&limit=2&language=hi"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: "catalog",
platform: "instagram",
available: "true",
sort: "price_asc",
limit: "2",
language: "hi",
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://notpanel.com/api/v3",
data={
"key": "YOUR_API_KEY",
"action": "catalog",
"platform": "instagram",
"available": "true",
"sort": "price_asc",
"limit": "2",
"language": "hi",
},
)
print(res.json())<?php
$body = http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'catalog',
'platform' => 'instagram',
'available' => 'true',
'sort' => 'price_asc',
'limit' => '2',
'language' => 'hi',
]);
$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));
Example response
{
"as_of": "2026-08-25T10:30:00.000Z",
"requested_language": "hi",
"catalog_updated_at": "2026-08-25T09:45:12.000Z",
"total": 1,
"page": 1,
"per_page": 2,
"total_pages": 1,
"lowest_rate_per_1000": "0.50",
"currency": "USD",
"items": [
{
"service": "42547",
"name": "Instagram कस्टम कमेंट्स",
"canonical_name": "Instagram Custom Comments",
"name_language": "hi",
"description": "Custom comments for a public post",
"type": "custom_comments",
"rate": "0.50",
"min": "10",
"max": "5000",
"platform": {
"id": 1,
"slug": "instagram",
"name": "Instagram"
},
"category": {
"id": 12,
"slug": "comments",
"name": "Comments"
},
"refill": true,
"dripfeed": false,
"available": true,
"cancel": true,
"cancel_mode": "grace_window",
"cancel_window_seconds": 15,
"average_time": "0-30 minutes",
"average_time_minutes": 18,
"average_time_sample_size": 24,
"average_time_basis": "measured",
"input_fields": [
{
"key": "comments",
"label": "Comments",
"type": "textarea",
"required": true,
"placeholder": "One comment per line. Each line is a separate comment."
}
],
"updated_at": "2026-08-25T09:45:12.000Z"
}
]
}Common errors
| Status | Body | Cause |
|---|---|---|
| 400 | {"error":"A platform is required when category is a slug"} | A category slug is ambiguous without a platform slug or ID. Supply platform, or use the category's numeric ID. |
| 400 | {"error":"Invalid catalog sort"} | The sort value is not one of the documented catalog sort modes. |
| 400 | {"error":"language must be one of en, es, pt, ru, tr, ar, hi, id, fr, zh","error_code":"INVALID_LANGUAGE"} | The language value is not supported. Use one of the ten documented service-name language codes. |