SMM Panel API for Resellers
Last updated
| 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 |
Service list
| 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"
}
]
Add order
| 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
}
Order status
| 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"
}
Multiple orders status
| 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"
}
}
Create refill
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill |
| order | Order ID |
Example response
{
"refill": "1"
}
Create multiple refill
| 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"
}
}
]
Get refill status
| Parameters | Description |
|---|---|
| key | Your API key |
| action | refill_status |
| refill | Refill ID |
Example response
{
"status": "Completed"
}
Get multiple refill status
| 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"
}
}
]
Create cancel
| 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"
}
}
]
User balance
| Parameters | Description |
|---|---|
| key | Your API key |
| action | balance |
Example response
{
"balance": "100.84292",
"currency": "USD"
}
Example of PHP code
Using SMM PWR as your provider
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.
What the API covers
- services returns the full catalogue with prices and order limits
- add places an order from a service ID, a link and a quantity
- status takes one order or up to 100 at once
- refill and cancel work on services that allow them, singly or in batches
- balance returns your remaining balance and currency
Reseller notes
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.
Service descriptions
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.
If you would rather not build anything
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.
Code examples
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
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
<?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
Python
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
Reading the response
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.
Polling without wasting calls
Two habits keep an integration cheap and fast:
- Ask for orders in batches.
statusaccepts anordersparameter — 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. - Cache the service list.
servicesreturns 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.
API: frequently asked questions
What API does SMM PWR use?
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.
How do I get an API key?
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"}.
Which actions does the API support?
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.
How many services can I pull through the API?
The services action returns the whole live catalogue - 2,168 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.
Is there a minimum spend or subscription to use the API?
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.
Do service descriptions come through the API?
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.
Can I resell under my own brand instead of building an integration?
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.