Every service carries a familiar type label plus an additive normalized type_key. The type decides which parameters action=add uses: most take a link and quantity, while list-based types can derive quantity and several types accept extra fields.
key, action, and the optional request_id/idempotency_key retry fields are left out here. The first column shows the familiar type label returned by action=services and its additive normalized type_key; action=catalog also exposes the normalized type. All values come from the same runtime definition.
| type | link | quantity | Extra parameters |
|---|---|---|---|
| Defaulttype_key: default | Yes | Yes | — |
| Custom Commentstype_key: custom_comments | Yes | Optional; derived from list | comments* |
| Custom Comments Packagetype_key: custom_comments_package | Yes | No | comments* |
| Packagetype_key: package | Yes | No | — |
| Subscriptionstype_key: subscriptions | No | No | username*min*max*posts*delayexpiry |
| Invites from Groupstype_key: invites_from_groups | Yes | Yes | groups* |
| Mentionstype_key: mentions | Yes | Yes | usernames* |
| Mentions Hashtagtype_key: mentions_hashtag | Yes | Yes | hashtag*usernames |
| Mentions User Followerstype_key: mentions_user_followers | Yes | Yes | username* |
| Mentions Media Likerstype_key: mentions_media_likers | Yes | Yes | media* |
| Mentions Custom Listtype_key: mentions_custom_list | Yes | Optional; derived from list | usernames* |
| Polltype_key: poll | Yes | Yes | answer_number* |
| Comment Likestype_key: comment_likes | Yes | Yes | — |
| Comment Repliestype_key: comment_replies | Yes | Optional; derived from list | usernamecomments* |
| SEOtype_key: seo | Yes | Yes | keywords* |
| Web Traffictype_key: web_traffic | Yes | Yes | keywordsreferercountrydevicetype_of_trafficgoogle_keyword |
* marks a required parameter. Anything unmarked is optional. string (list) means one raw form value with one item per line, not a JSON array.
(custom_comments)| commentsRequired | string (list) | Comments |
(custom_comments_package)| commentsRequired | string (list) | Comments |
(subscriptions)| usernameRequired | string | Username |
| minRequired | integer | Minimum per post min: 1 |
| maxRequired | integer | Maximum per post min: 1 |
| postsRequired | integer | Posts to track min: 1 · max: 1000 |
| delay | integer | Delay between posts (minutes) min: 0 |
| expiry | string | Expiry date (YYYY-MM-DD) |
(invites_from_groups)| groupsRequired | string (list) | Group links |
(mentions)| usernamesRequired | string (list) | Usernames |
(mentions_hashtag)| hashtagRequired | string | Hashtag |
| usernames | string (list) | Source usernames (optional) |
(mentions_user_followers)| usernameRequired | string | Source username |
(mentions_media_likers)| mediaRequired | string | Source media URL |
(mentions_custom_list)| usernamesRequired | string (list) | Usernames |
(poll)| answer_numberRequired | integer | Answer number min: 1 |
(comment_replies)| username | string | Comment username (optional) |
| commentsRequired | string (list) | Reply text |
(seo)| keywordsRequired | string (list) | Keywords |
(web_traffic)| keywords | string (list) | Keywords (optional) |
| referer | string | Referrer URL (optional) |
| country | string | Country code (optional) |
| device | string | Device (optional) |
| type_of_traffic | string | Traffic type (optional) |
| google_keyword | string | Google keyword (optional) |
A subscription does not target a link. It watches an account and delivers to each new post as it appears, so it takes a username of at most 100 characters plus the min and max delivery quantity per post. posts is required and must be between 1 and 1000. delay optionally delays delivery in minutes, and expiry can end the subscription on a date.
Creating a subscription immediately reserves the worst-case deposit from your balance: max × posts × effective rate ÷ 1000. After a confirmed cancellation or settlement, any verified unused portion is refunded. If the provider outcome is uncertain, the reserved amount is held for review instead of being refunded automatically.
A subscription action=add response returns the same numeric public order-ID shape as an ordinary order. Use it directly with status, refund_quote, or eligible cancel calls. Older sub_ references remain accepted.
An eligible upstream-managed subscription can be cancelled with action=cancel. It may return status=Processing and status_key=cancelling until terminal confirmation; then its stable total refund is returned.
The values below are illustrative. Replace service 1024 with a live service whose type is subscriptions, and choose min and max inside that service's published limits.
curl -X POST https://notpanel.com/api/v3 \
-d "key=YOUR_API_KEY&action=add&service=1024&request_id=9f1c0c2e-5c1a-4f7e-9a1d-2b6f0f4d8e13&username=yourhandle&min=50&max=200&posts=10"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: "1024",
request_id: "9f1c0c2e-5c1a-4f7e-9a1d-2b6f0f4d8e13",
username: "yourhandle",
min: "50",
max: "200",
posts: "10",
}),
});
const { order } = await res.json(); // numeric public order IDimport requests
res = requests.post("https://notpanel.com/api/v3", data={
"key": "YOUR_API_KEY",
"action": "add",
"service": "1024",
"request_id": "9f1c0c2e-5c1a-4f7e-9a1d-2b6f0f4d8e13",
"username": "yourhandle",
"min": "50",
"max": "200",
"posts": "10",
})
order = res.json()["order"] # numeric public order ID<?php
$ch = curl_init('https://notpanel.com/api/v3');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => '1024',
'request_id' => '9f1c0c2e-5c1a-4f7e-9a1d-2b6f0f4d8e13',
'username' => 'yourhandle',
'min' => '50',
'max' => '200',
'posts' => '10',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$order = json_decode(curl_exec($ch), true)['order']; // numeric public order ID{
"order": 7002
}