Developers
GreatSMM API — SMM Panel HTTP API Reference
Automate service discovery, order creation, status polling, refills, and balance lookups against
greatsmm.pro. The API follows the standard Perfect Panel contract,
so libraries and code samples written for any panel in the same family work here without modification.
Need an integration account? Create a free account, then
sign in and copy your API key from account settings.
Service IDs returned by the services method always match the IDs on the public
services catalog. Commercial scope lives in the Terms of Service.
Endpoint, Authentication & HTTP Contract
Base endpoint
POST https://greatsmm.pro/api/v2
Request format
- HTTP method:
POST
- Content-Type:
application/x-www-form-urlencoded (recommended) or multipart/form-data
- Every request must include your private
key and the action parameter
- Rate-limit your cron jobs and back off on errors so the panel stays stable for every reseller
Response format
All responses are JSON. Successful responses return the requested object; failures return an
error string. HTTP status is 200 even when the payload contains error — always
check the JSON body, not the status code.
Authentication errors
{ "error": "Incorrect API key" }
Never embed your API key in client-side JavaScript. Keep it in server-side environment variables and
regenerate it from account settings if it leaks.
Available Methods
services — list every service available on the panel
add — create a new order (default, drip-feed, custom comments, subscriptions, mentions, polls, packages)
status — check the status of a single order
multi-status — check the status of up to 100 orders in one call
refill — request a refill on a single completed order
refill (bulk) — request refill on up to 100 orders at once
refill_status — check the status of a refill task
cancel — cancel pending orders (where supported)
balance — return your current account balance and currency
services — list services
Returns every active service ID, name, category, type, rate per 1,000, minimum / maximum quantities, refill / cancel flags, and whether the service supports drip-feed.
Parameters
| Parameter | Description |
key | Your API key |
action | services |
Example response
[
{
"service": 11,
"name": "Instagram Likes [5to10K+/Day][R45]",
"type": "Default",
"category": "Best Seller Services",
"rate": "0.07",
"min": "10",
"max": "5000000",
"refill": true,
"cancel": true
},
{
"service": 17,
"name": "Youtube Views[R30][Instant][1K to 2K/Day]",
"type": "Default",
"category": "Non Drop Youtube views",
"rate": "1.46",
"min": "50",
"max": "1000000000",
"refill": true,
"cancel": false
}
]
add — create new order
Submit a new order. The parameter set depends on the service type returned by services. The seven type variants are documented below.
Default order
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID from the services method |
link | Public URL of the target (profile, post, video, channel, live stream) |
quantity | Quantity within the service's min–max range |
Drip-feed order (Type: Default with drip-feed enabled)
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID |
link | Public URL of the target |
quantity | Quantity per run |
runs | Number of runs to spread over |
interval | Interval in minutes between runs |
Custom comments (Type: Custom Comments)
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID |
link | Public URL of the target post |
comments | Newline-separated list of comment strings |
Mentions (Type: Mentions, Mentions with Hashtags, Mentions Custom List)
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID |
link | Public URL of the target post |
quantity | Quantity |
usernames | Newline-separated usernames (Custom List only) |
hashtags | Newline-separated hashtags (Mentions with Hashtags only) |
Subscriptions (Type: Subscriptions)
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID |
username | Target username (without @) |
min | Minimum quantity per new post |
max | Maximum quantity per new post |
posts | Number of new posts to apply to (optional) |
delay | Start delay in minutes (optional) |
expiry | Expiry date in d/m/Y format (optional) |
Polls (Type: Poll)
| Parameter | Description |
key | Your API key |
action | add |
service | Service ID |
link | Public URL of the poll |
quantity | Quantity of votes |
answer_number | The answer index to vote for (1, 2, 3, …) |
Example response
{ "order": 123456 }
status — single order status
| Parameter | Description |
key | Your API key |
action | status |
order | Order ID returned by add |
Example response
{
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
}
Possible status values
Pending, In progress, Processing, Completed, Partial, Canceled.
status — multiple orders status
Pass up to 100 order IDs as a comma-separated string.
| Parameter | Description |
key | Your API key |
action | status |
orders | Up to 100 IDs, comma-separated (1,10,100) |
Example response
{
"1": {
"charge": "0.27819",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "USD"
},
"10": {
"error": "Incorrect order ID"
},
"100": {
"charge": "1.44219",
"start_count": "234",
"status": "In progress",
"remains": "10",
"currency": "USD"
}
}
refill — create refill task for one order
| Parameter | Description |
key | Your API key |
action | refill |
order | Order ID |
Example response
{ "refill": "1" }
refill — bulk refill (up to 100 orders)
| Parameter | Description |
key | Your API key |
action | refill |
orders | Comma-separated order IDs (e.g. 1,2,3) |
Example response
[
{ "order": 1, "refill": 1 },
{ "order": 2, "refill": 2 },
{ "order": 3, "refill": { "error": "Incorrect order ID" } }
]
refill_status — refill status
Single refill — use refill parameter. Bulk (up to 100) — use refills comma-separated.
| Parameter | Description |
key | Your API key |
action | refill_status |
refill or refills | Refill task ID, or comma-separated IDs |
Example response (single)
{ "status": "Completed" }
Possible refill statuses
Pending, In progress, Completed, Rejected.
cancel — cancel orders
Cancels orders that are still in Pending state and where the underlying service supports cancellation (cancel: true on the services response).
| Parameter | Description |
key | Your API key |
action | cancel |
orders | Comma-separated order IDs (up to 100) |
Example response
[
{ "order": 9, "cancel": { "error": "Incorrect order status" } },
{ "order": 2, "cancel": 1 }
]
balance — account balance
| Parameter | Description |
key | Your API key |
action | balance |
Example response
{
"balance": "100.84292",
"currency": "USD"
}
Code Examples
PHP (cURL)
<?php
$api_url = 'https://greatsmm.pro/api/v2';
$api_key = 'YOUR_API_KEY';
$post = http_build_query([
'key' => $api_key,
'action' => 'add',
'service' => 11,
'link' => 'https://instagram.com/p/EXAMPLE/',
'quantity' => 100,
]);
$ch = curl_init($api_url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $post,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_TIMEOUT => 30,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
Python (requests)
import requests
API_URL = "https://greatsmm.pro/api/v2"
API_KEY = "YOUR_API_KEY"
payload = {
"key": API_KEY,
"action": "add",
"service": 11,
"link": "https://instagram.com/p/EXAMPLE/",
"quantity": 100,
}
response = requests.post(API_URL, data=payload, timeout=30)
print(response.json())
Node.js (axios)
import axios from 'axios';
import qs from 'querystring';
const API_URL = 'https://greatsmm.pro/api/v2';
const API_KEY = process.env.GREATSMM_API_KEY;
const body = qs.stringify({
key: API_KEY,
action: 'add',
service: 11,
link: 'https://instagram.com/p/EXAMPLE/',
quantity: 100,
});
const { data } = await axios.post(API_URL, body, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
timeout: 30000,
});
console.log(data);
cURL (shell)
curl -X POST "https://greatsmm.pro/api/v2" \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "action=add" \
--data-urlencode "service=11" \
--data-urlencode "link=https://instagram.com/p/EXAMPLE/" \
--data-urlencode "quantity=100"
Additional Methods Configured by This Panel
These entries come from the admin-configured method list and may extend or override the standard contract above.
Error Reference
Common error strings returned in the error field:
Incorrect API key — the key parameter is missing, malformed, or revoked. Regenerate from account settings.
Incorrect action — the action parameter is missing or not one of the supported method names.
Incorrect service ID — service was disabled, removed, or you mistyped the ID. Refresh the list with services.
Not enough funds on balance — top up via Add funds after sign-in.
Incorrect order ID — order does not exist or belongs to another account.
Incorrect order status — the order cannot accept the requested action (e.g. canceling an already-completed order).
Incorrect link — URL fails the service's validator (private profile, deleted post, wrong domain).
Quantity out of range — quantity is below min or above max for the service.
Active order with the same link exists — wait for the previous order on this URL to finish or use a different service.
Integration Best Practices
- Cache
services — call it once per hour, not per order. Service IDs are stable; rates and min/max can shift inside that window so a 60-minute cache is the conservative default.
- Validate ranges client-side — read
min and max from the cached service list and reject out-of-range quantities before they hit the API.
- Poll with
multi-status — group up to 100 orders per call instead of one request per order. Saves API quota and finishes a daily reconciliation in seconds.
- Back off on errors — exponential back-off starting at 2 seconds avoids flooding the panel during supplier outages. Retry only on network errors and 5xx, never on logical
error strings.
- Store both
charge and currency — the panel may run in a different base currency than the user; storing both fields prevents reconciliation drift.
- Use refill buttons strategically — refills are free but suppliers prioritise new orders. Schedule refill polling in off-peak windows.
- Never embed the API key in client JS — keep it server-side. Public-facing apps should proxy through your own backend, which holds the secret.
Related Documentation