Dashboard

API v2

https://your-domain/api/v2
POST
application/x-www-form-urlencoded or application/json
JSON
AuthSend 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
  }
]

keyYour API key
actionadd
serviceService ID from the service list
linkLink to the post / profile
quantityAmount to order
runsoptional — drip-feed: number of batches
intervaloptional — drip-feed: minutes between batches
commentsCustom Comments services: one comment per line
usernamesMentions Custom List services: one username per line
usernameMentions User Followers services: the account to pull followers from
answer_numberPoll 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.

PendingAccepted, not started yet
In progressBeing delivered
ProcessingProvider is working on it
CompletedDelivered in full
PartialPartly delivered; the rest was refunded
CanceledNot 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);