API v2
| https://your-domain/api/v2 | |
| POST | |
application/x-www-form-urlencoded or application/json | |
| JSON | |
| Auth | Send your API key as the key parameter on every request.
Get it from Dashboard → Account. |
Errors always come back as HTTP 200 with an {"error": "..."} body,
which is what existing SMM clients expect. Check for the error key,
not the status code.
Only services we have listed. rate is your price per 1000.
key=YOUR_API_KEY action=services
[
{
"service": "12",
"name": "Instagram Followers [Real] [30 Days Refill]",
"type": "Default",
"category": "Instagram Followers",
"rate": "1.1700",
"min": "50",
"max": "100000",
"refill": true,
"cancel": true,
"dripfeed": true
}
]
| key | Your API key |
| action | add |
| service | Service ID from the service list |
| link | Link to the post / profile |
| quantity | Amount to order |
| runs | optional — drip-feed: number of batches |
| interval | optional — drip-feed: minutes between batches |
| comments | Custom Comments services: one comment per line |
| usernames | Mentions Custom List services: one username per line |
| username | Mentions User Followers services: the account to pull followers from |
| answer_number | Poll services: which answer to vote for |
key=YOUR_API_KEY action=add service=12 link=https://instagram.com/p/abc123 quantity=1000
{ "order": 23501 }
Drip-feed is billed on the total: quantity × runs.
quantity=100&runs=10 delivers 1000 and charges for 1000.
key=YOUR_API_KEY action=status order=23501
{
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "MYR"
}
Up to 100 orders at once with orders=1,2,3 — the response is then keyed by order ID,
and unknown IDs come back as {"error": "Incorrect order ID"} under their own key
without failing the batch.
charge is what you have actually paid: the original charge minus any refunds.
A Partial order is refunded automatically for the remains portion,
and Canceled is refunded in full — you do not need to ask for it.
| Pending | Accepted, not started yet |
| In progress | Being delivered |
| Processing | Provider is working on it |
| Completed | Delivered in full |
| Partial | Partly delivered; the rest was refunded |
| Canceled | Not delivered; refunded in full |
Only for completed or partial orders on services with refill: true.
key=YOUR_API_KEY action=refill order=23501
{ "refill": "1" }
Check progress with action=refill_status&refill=1,
or up to 100 at once with refills=1,2,3.
Only for services with cancel: true that have not finished yet.
key=YOUR_API_KEY action=cancel orders=23501,23502
[
{ "order": 23501, "cancel": 1 },
{ "order": 23502, "cancel": { "error": "Incorrect order ID" } }
]
Cancelling is a request, not an instant result. The order settles as
Canceled (full refund) or Partial (partial refund)
depending on how much was already delivered.
key=YOUR_API_KEY action=balance
{ "balance": "100.84292", "currency": "MYR" }
Example — PHP
<?php
$ch = curl_init('https://your-domain/api/v2');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => 12,
'link' => 'https://instagram.com/p/abc123',
'quantity' => 1000,
]),
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
if (isset($res['error'])) {
throw new Exception($res['error']); // errors arrive with HTTP 200
}
echo $res['order'];
Example — Node.js
const res = await fetch('https://your-domain/api/v2', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
key: 'YOUR_API_KEY',
action: 'add',
service: 12,
link: 'https://instagram.com/p/abc123',
quantity: 1000,
}),
});
const data = await res.json();
if (data.error) throw new Error(data.error); // never rely on res.ok here
console.log('order', data.order);
