Resellers
Reseller API
Standard SMM panel v2. Your script sends orders to SMG. We charge your USDT wallet and fulfill the order. Rates in services are the prices you pay, per 1,000 unless the service type is Package.
Start
- Create an account and fund the wallet.
- Open Dashboard → API and copy your key.
- Call services and store the service IDs and rates.
- Call add to place an order. Save the returned order ID.
- Call status until the order is completed.
Endpoint
https://smgpanelplus.com/api/v2
POST form fields or JSON. GET with the same fields as query parameters also works. Send key and action on every request.
JSON
curl -X POST https://smgpanelplus.com/api/v2 \
-H "Content-Type: application/json" \
-d '{"key":"YOUR_API_KEY","action":"balance"}'Form
curl -X POST https://smgpanelplus.com/api/v2 \ -d "key=YOUR_API_KEY&action=balance"
Balance
Your remaining USDT wallet balance.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | balance |
Response
{
"balance": "24.50000",
"currency": "USDT"
}Services
The catalog your panel should resell. service is the ID you send to add. rate is USDT per 1,000.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | services |
Response
[
{
"service": "cm123abc",
"name": "Instagram Followers",
"type": "Default",
"category": "Instagram Followers",
"rate": "1.2400",
"min": "100",
"max": "10000",
"refill": true,
"cancel": true,
"dripfeed": false
}
]Add order
Place one order. The charge is taken from your wallet. A successful call returns the SMG order ID.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | add |
| service | Yes | Service ID from the services list |
| link | Usually | Target URL. Not used for subscriptions. |
| quantity | Usually | Amount to deliver. Must be inside min and max. |
| runs | Drip-feed | How many times to repeat the quantity |
| interval | Drip-feed | Minutes between runs |
| comments | Custom comments | One comment per line |
| usernames | Mentions list | One username per line |
| username | Mentions / subscription | A single username |
| keywords | SEO | Comma-separated keywords |
| hashtag | Hashtag mentions | Hashtag without extra spaces |
| groups | Invites | One group per line |
| answer_number | Poll | The poll answer number |
| min / max | Subscription | Quantity range per post |
| posts / old_posts | Subscription | How many posts to cover |
| delay | Subscription | Minutes between posts |
| expiry | Subscription | End date, for example 11/11/2026 |
Default
{
"key": "YOUR_API_KEY",
"action": "add",
"service": "SERVICE_ID",
"link": "https://instagram.com/p/example",
"quantity": 1000
}Drip-feed
{
"key": "YOUR_API_KEY",
"action": "add",
"service": "SERVICE_ID",
"link": "https://example.com/post",
"quantity": 100,
"runs": 10,
"interval": 60
}Custom comments
{
"key": "YOUR_API_KEY",
"action": "add",
"service": "SERVICE_ID",
"link": "https://example.com/post",
"comments": "good pic\ngreat photo\n:)"
}Subscription
{
"key": "YOUR_API_KEY",
"action": "add",
"service": "SERVICE_ID",
"username": "accountname",
"min": 100,
"max": 110,
"old_posts": 5,
"delay": 30,
"expiry": "11/11/2026"
}Response
{
"order": "cmorder123"
}Order status
One order uses order. Several orders use orders as a comma-separated list, up to 100.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | status |
| order | One order | Order ID returned by add |
| orders | Many orders | ID1,ID2,ID3 |
One order
{
"charge": "1.24000",
"start_count": "1200",
"status": "In Progress",
"remains": "400",
"currency": "USDT"
}Many orders
{
"cmorder123": {
"charge": "1.24000",
"start_count": "1200",
"status": "Completed",
"remains": "0",
"currency": "USDT"
},
"cmorder456": { "error": "Incorrect order ID" }
}Refill
Only services marked refill: true can be refilled.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | refill |
| order | One order | Order ID |
| orders | Many orders | ID1,ID2 |
One order
{
"refill": "987654"
}Many orders
[
{ "order": "cmorder123", "refill": "987654" },
{ "order": "cmorder456", "refill": { "error": "This service does not support refill" } }
]Refill status
| Parameter | Required | Description |
|---|---|---|
| action | Yes | refill_status |
| refill | One refill | Refill ID returned by refill |
| refills | Many refills | ID1,ID2 |
Response
{
"status": "Completed"
}Cancel
Cancel one or more orders that the service allows. Send the IDs in orders.
| Parameter | Required | Description |
|---|---|---|
| action | Yes | cancel |
| orders | Yes | ID1,ID2 |
Response
[
{ "order": "cmorder123", "cancel": "554433" },
{ "order": "cmorder456", "cancel": { "error": "Order is not with the provider yet" } }
]PHP client
Drop this into a child panel. It speaks the same actions as the examples above.
smg-api.php
<?php
class SmgApi {
public $api_url = 'https://smgpanelplus.com/api/v2';
public $api_key = 'YOUR_API_KEY';
public function balance() {
return json_decode($this->connect(['key' => $this->api_key, 'action' => 'balance']));
}
public function services() {
return json_decode($this->connect(['key' => $this->api_key, 'action' => 'services']));
}
public function order($data) {
$post = array_merge(['key' => $this->api_key, 'action' => 'add'], $data);
return json_decode($this->connect($post));
}
public function status($order_id) {
return json_decode($this->connect([
'key' => $this->api_key,
'action' => 'status',
'order' => $order_id,
]));
}
public function multiStatus($order_ids) {
return json_decode($this->connect([
'key' => $this->api_key,
'action' => 'status',
'orders' => implode(',', (array) $order_ids),
]));
}
public function refill($order_id) {
return json_decode($this->connect([
'key' => $this->api_key,
'action' => 'refill',
'order' => $order_id,
]));
}
public function cancel($order_ids) {
return json_decode($this->connect([
'key' => $this->api_key,
'action' => 'cancel',
'orders' => implode(',', (array) $order_ids),
]), true);
}
private function connect($post) {
$fields = [];
foreach ($post as $name => $value) {
$fields[] = $name . '=' . urlencode($value);
}
$ch = curl_init($this->api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $fields));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
$api = new SmgApi();
$services = $api->services();
$balance = $api->balance();
$order = $api->order([
'service' => 'SERVICE_ID',
'link' => 'https://example.com/post',
'quantity' => 1000,
]);
$status = $api->status($order->order);
Errors
A failed call returns JSON with an error message. Do not retry add until you know the first call failed, or you may place the order twice.
Examples
{ "error": "API key is required" }
{ "error": "Invalid API key" }
{ "error": "Incorrect request" }
{ "error": "Incorrect quantity" }
{ "error": "Insufficient balance. Add funds to continue." }
{ "error": "Incorrect order ID" }