| HTTP Method | POST (GET is accepted as well) |
| API URL | https://smmpwr.com/api/v2 |
| Response format | JSON |
| Authentication | key parameter (api_key is accepted too).
An invalid key returns HTTP 401 with
{"error":"Invalid API key"} |
| Errors | HTTP 200 with {"error":"..."} in the body |
| Parameters | Description |
|---|---|
| key | Your API key |
| action | services |
| response: description | Our own service description - sent in both `description` and `desc` |
Example response
[
{
"service": "2",
"name": "Instagram Followers | Max 10M | 365 Days Refill | Mix Users",
"type": "Default",
"category": "Instagram Followers",
"rate": "0.7400",
"min": "10",
"max": "10000000",
"refill": true,
"cancel": true,
"dripfeed": false,
"description": "ā” Instagram Followers\n\nš¦ Min order: 10\nā»ļø Refill: 365 Days"
}
]
| Parameters | Description |
|---|---|
| key | Your API key |
| action | add |
| service | Service ID from the service list |
| link | Link to page (maximum 500 characters) |
| quantity | Needed quantity - between the service min and max |
| runs | (optional) Runs to deliver |
| interval | (optional) Interval in minutes |
Example response
{
"order": 23501
}
| Parameters | Description |
|---|---|
| key | Your API key |
| action | status |
| order | Order ID |
| response: status | One of: Pending, In progress, Processing, Completed, Partial, Canceled |
Example response
{
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
}
| Parameters | Description |
|---|---|
| key | Your API key |
| action | status |
| orders | Order IDs separated by a comma (up to 100 IDs) |
Example response
{
"1": {
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
},
"10": {
"error": "Incorrect order ID"
}
}
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill |
| order | Order ID |
Example response
{
"refill": "1"
}
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill |
| orders | Order IDs separated by a comma (up to 100 IDs) |
Example response
[
{
"order": 1,
"refill": 1
},
{
"order": 2,
"refill": {
"error": "Incorrect order ID"
}
}
]
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill_status |
| refill | Refill ID |
Example response
{
"status": "Completed"
}
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill_status |
| refills | Refill IDs separated by a comma (up to 100 IDs) |
Example response
[
{
"refill": 1,
"status": "Completed"
},
{
"refill": 2,
"status": {
"error": "Refill not found"
}
}
]
| Parameters | Description |
|---|---|
| key | Your API key |
| action | cancel |
| orders | Order IDs separated by a comma (up to 100 IDs) |
Example response
[
{
"order": 1,
"cancel": 1
},
{
"order": 2,
"cancel": {
"error": "Incorrect order ID"
}
}
]
| Parameters | Description |
|---|---|
| key | Your API key |
| action | balance |
Example response
{
"balance": "100.84292",
"currency": "USD"
}
Example of PHP code
The API follows the standard SMM panel API v2 specification. If your panel already talks to other providers, it will talk to us without code changes: point it at the endpoint above, drop in your key and import the service list.
Requests go over HTTPS with your key as a POST parameter. The key lives on your account page and you can regenerate it whenever you want.
Every service in the services response carries its own
description — order limits, refill term and support status. We write
them ourselves per service rather than copying a supplier’s marketing text, so what
you show your customers is the same thing we show ours.
If your panel runs the standard SMM panel software, tick Copy descriptions when you import our catalogue and each service arrives with its description filled in instead of an empty field.
Services you imported before that option existed do not fill in by themselves. Import them again with the box ticked and the descriptions come across. If you would rather not re-import, paste this small helper into your own admin console — it reads the same public list and fills the descriptions in place. Either way your service IDs, prices and API calls stay exactly as they are.
A child panel gives you a branded front end on your own domain for $25 per month: your prices, your logo, our catalogue and delivery behind it. You supply the domain and point its nameservers to ours. A child panel sources only from SMM PWR, which is fine if we are your main supplier and limiting if you want several. Order it from your account.
If you do not want to run a panel at all, the affiliate program pays 10% of every top-up your referrals make, with a $10 minimum payout.
One practical warning: refresh the service list on a schedule and diff it. Supplier catalogues change, and a cached list quietly turns into wrong prices and failed orders. There is more on that in our reseller API guide.
Browse the current price list before you integrate.
Every call is a POST to the same endpoint carrying your key and an
action. The three below place an order and read the reply the
safe way; swap the action and parameters for anything in the tables above.
curl -s https://smmpwr.com/api/v2 \
-d key=YOUR_API_KEY \
-d action=add \
-d service=101 \
-d link=https://instagram.com/p/EXAMPLE \
-d quantity=1000
<?php
$ch = curl_init('https://smmpwr.com/api/v2');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_POSTFIELDS => http_build_query([
'key' => 'YOUR_API_KEY',
'action' => 'add',
'service' => 101,
'link' => 'https://instagram.com/p/EXAMPLE',
'quantity' => 1000,
]),
]);
$body = curl_exec($ch);
curl_close($ch);
$res = json_decode($body, true);
if (isset($res['error'])) { // arrives with HTTP 200 - see below
throw new RuntimeException($res['error']);
}
echo $res['order']; // e.g. 23501
import requests
r = requests.post("https://smmpwr.com/api/v2", timeout=30, data={
"key": "YOUR_API_KEY",
"action": "add",
"service": 101,
"link": "https://instagram.com/p/EXAMPLE",
"quantity": 1000,
})
res = r.json()
if "error" in res: # arrives with HTTP 200 - see below
raise RuntimeError(res["error"])
print(res["order"]) # e.g. 23501
The HTTP status code is not a reliable success signal. A bad
key is rejected with 401, but every other failure — unknown
service, malformed link, a quantity outside the service limits, an order ID
that is not yours — comes back as 200 OK with an
error key in the body. Check for that key on every call instead
of branching on the status code. This is the single most common reason an
integration looks fine and silently drops orders.
| Message | HTTP | What it means |
|---|---|---|
Invalid API key | 401 | Key missing, mistyped or regenerated |
Account is blocked | 401 | The account behind the key cannot place orders |
Incorrect request | 200 | Unknown action, or a required parameter is missing |
Incorrect service ID | 200 | The service is not in your list, or is no longer sold |
Incorrect link | 200 | Link empty, over 500 characters, or wrong shape for the service |
Incorrect quantity | 200 | Below the service minimum or above its maximum |
Incorrect order ID | 200 | No such order on this account |
Refill not found | 200 | The refill ID does not exist or has expired |
A successful add returns nothing but the new order number:
{"order": 23501}. A successful status returns
charge, start_count, status,
remains and currency.
Two habits keep an integration cheap and fast:
status accepts an
orders parameter — a comma-separated list of up to 100
IDs in one call. Checking a hundred orders one at a time does the same
work a hundred times.services returns the
whole catalogue in one response; pull it on a schedule rather than before
every order. Prices and limits change when suppliers change them, not
between two of your requests.SMM PWR speaks the standard SMM panel API v2 specification. The endpoint is https://smmpwr.com/api/v2, requests are POST (GET is accepted as well) and every response is JSON. A panel that already talks to other providers works with us without code changes.
Open a free account and the key appears on your account page. You can regenerate it at any time. Send it as the key parameter (api_key is accepted too); an invalid key returns HTTP 401 with {"error":"Invalid API key"}.
services returns the full catalogue with prices and order limits, add places an order, status reads one order or up to 100 at once, refill and cancel work on services that allow them, and balance returns your remaining balance and currency.
The services action returns the whole live catalogue - 1,466 services at the moment - with the price, minimum, maximum and our own description for each one. It is the same list customers see on the price list, not a reduced feed.
No. Registration is free, there is no subscription and no minimum monthly spend. You top up a balance and spend it; the rate you see on the price list is the rate the API charges.
Yes. Every service in the services response carries its own description field with order limits, refill term and support status. We write those ourselves per service rather than copying a supplier's marketing text.
Yes. A child panel gives you a branded front end on your own domain for $25 per month: your prices, your logo, our catalogue and delivery behind it. You supply the domain and point its nameservers to ours. Order it from your account.
This site sets five cookies: three keep you signed in, and two last a year (an internal visitor id and one that credits the affiliate who sent you). No advertising or cross-site trackers. Read the privacy policy.