- Home
- Developers
Reseller API
Connect your own panel, website or Telegram bot to ClickPop and sell our services under your own brand. The request format is the one SMM panel scripts already use, so connecting usually takes a few minutes.
https://clickpop.ir/api/reseller/v1
- HTTPS only
- Form data or JSON in, JSON out
- Prices in Toman, per 1,000
- 240 requests per minute per key
Quick start
- Get a keyIn your panel open “API” and create a key. You can limit it to your server IPs.
- Add us as a providerIn your panel script set the API URL to the endpoint above and paste the key.
- Import servicesCall “services”, pick what you want to sell and set your own prices.
Request format
Every call is a POST to the same address. Send the parameters as form data (application/x-www-form-urlencoded) or as a JSON body; the answer is always JSON in UTF-8.
| Parameter | Required | Description |
|---|---|---|
key | Yes | Your API key |
action | Yes | services · add · status · refill · refill_status · cancel · balance |
Service list
action=servicesAll active services with your price. Cache the list for a few minutes instead of calling it before every order.
curl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=services[
{
"service": 1204,
"name": "Instagram followers — Iranian, high quality, 30-day refill",
"type": "Default",
"category": "Instagram — Followers",
"rate": "48000",
"min": "100",
"max": "50000",
"refill": true,
"cancel": false,
"dripfeed": false
}
]| Field | Description |
|---|---|
service | Service ID — use it in “add” |
rate | Your price in Toman for 1,000 (your account discount is already applied) |
min / max | Allowed quantity per order |
refill | Drop refill can be requested for this service |
cancel | The order can be cancelled before delivery starts |
New order
action=add| Parameter | Required | Description |
|---|---|---|
service | Yes | Service ID |
link | Yes | Page, post or channel link (https://…) |
quantity | Yes | Between min and max of the service |
curl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=add \
-d service=1204 \
-d link=https://instagram.com/yourpage \
-d quantity=1000{"order": 10482}The price is taken from your wallet when the order is placed. Undelivered parts are refunded automatically.
Order status
action=statuscurl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=status \
-d order=10482{
"charge": "48000",
"start_count": "1520",
"status": "In progress",
"remains": "380",
"currency": "IRT"
}Several orders at once
action=statusUp to 100 order IDs, separated by commas.
curl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=status \
-d orders=10482,10483{
"10482": {"charge": "48000", "start_count": "1520", "status": "Completed", "remains": "0", "currency": "IRT"},
"10483": {"error": "Incorrect order ID"}
}Refill
action=refillFor services with refill: true, once every 24 hours per order. Send “orders” with commas for several orders.
curl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=refill \
-d order=10482{"refill": 50017}Refill status
action=refill_statuscurl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=refill_status \
-d refill=50017{"status": "Completed"}Cancel
action=cancelOnly for services with cancel: true and before delivery starts. The undelivered part is refunded automatically.
curl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=cancel \
-d orders=10482,10483[
{"order": 10482, "cancel": 1},
{"order": 10483, "cancel": {"error": "Cancel is not available for this order"}}
]Balance
action=balancecurl -X POST https://clickpop.ir/api/reseller/v1 \
-d key=YOUR_KEY \
-d action=balance{"balance": "2500000", "currency": "IRT"}Order statuses
| Status | Meaning |
|---|---|
Pending | Received, waiting to start |
In progress | Being delivered; “remains” shows what is left |
Completed | Fully delivered |
Partial | Partly delivered; the rest is already back in your wallet |
Canceled | Not delivered; the full amount is back in your wallet |
Errors
Errors come back as {"error": "…"}. The text is stable, so your code can check it.
| Error | What to do |
|---|---|
Invalid API key | Check the key, or create a new one in your panel |
IP not allowed | Add your server IP to the key, or remove the IP limit |
Not enough funds on balance | Top up your wallet |
Incorrect service ID | The service was removed or paused; reload the service list |
Quantity out of range | Use a quantity between min and max |
Incorrect link | Send a full, public link of the right platform |
Incorrect order ID | The order does not exist on this account |
Orders are paused, try again later | Short maintenance; retry in a few minutes |
Incorrect request | A required parameter is missing or the action is unknown |
HTTP 429 means too many requests: wait a minute and slow down.
Sample code
<?php
function api(array $params): array
{
$ch = curl_init('https://clickpop.ir/api/reseller/v1');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['key' => 'YOUR_KEY'] + $params),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$json = json_decode((string) curl_exec($ch), true);
curl_close($ch);
return is_array($json) ? $json : ['error' => 'No response'];
}
$order = api(['action' => 'add', 'service' => 1204, 'link' => 'https://instagram.com/yourpage', 'quantity' => 1000]);
print_r($order);import requests
def api(**params):
r = requests.post("https://clickpop.ir/api/reseller/v1", data={"key": "YOUR_KEY", **params}, timeout=30)
return r.json()
print(api(action="balance"))
print(api(action="add", service=1204, link="https://instagram.com/yourpage", quantity=1000))const api = async (params) => {
const res = await fetch("https://clickpop.ir/api/reseller/v1", {
method: "POST",
body: new URLSearchParams({ key: "YOUR_KEY", ...params }),
});
return res.json();
};
console.log(await api({ action: "balance" }));
console.log(await api({ action: "status", orders: "10482,10483" }));Limits and security
- Up to 240 requests per minute per key.
- You can restrict each key to your server IPs.
- Keys are shown once and stored only as a hash; revoke and recreate them any time.
- Keep the key on your server only — never put it in a website’s JavaScript or a mobile app.
Free for every account. No monthly fee, no minimum.