SMM Panel API Documentation
Order 4SNS PLUS services from your Telegram bot or your own panel with the standard SMM panel API v2.
What is an SMM panel API?
An SMM panel API lets a program get the service list, place orders and check order status and balance without going through the website. 4SNS PLUS supports the standard SMM panel API v2 format used by many panels and bots, so code you already connected to another panel works right away once you change the URL and key.
API prices and balance are the same as on the website. The rate in the services response equals the price per 1,000 (US dollars) in the price list, and orders placed with add are taken from your balance exactly like web orders and also appear in the order history in your dashboard. Amounts returned from canceled or partial orders go back to the same balance.
Basics
| Endpoint | https://4snsplus.com/api/v2 |
| Method | POST |
| Request format | Form fields (application/x-www-form-urlencoded, multipart) or a JSON body |
| Response | JSON; errors also come as HTTP 200 with an error field |
| Authentication | key parameter (your API key) on every request |
| Rate limit | 300 requests per minute per key |
| Currency | US dollar (USD) |
Request example
curl -X POST https://4snsplus.com/api/v2 \ -d key=YOUR_API_KEY \ -d action=balance
import requests
r = requests.post("https://4snsplus.com/api/v2", data={
"key": "YOUR_API_KEY",
"action": "add",
"service": 2210,
"link": "https://t.me/yourchannel",
"quantity": 1000,
})
print(r.json()) # {"order": 31877} or {"error": "..."}How do I get an API key?
Once your first top up is credited to your balance, you can create an API key from the API key menu in your dashboard. The key is shown only once when you create it, so store it somewhere safe. Creating a new key disables the previous key immediately.
The key is separate from your account token. Put only the API key in your bot or server, never your account token. If you think your key was exposed, simply create a new one on the API key screen.
Service list (services)
Returns every service you can order. rate is the price per 1,000 (USD), and when type is Package it is the price of one package. When type is Custom Comments, you send a list of comments instead of a quantity. category is the platform name plus the group name.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | services |
Response example
[
{
"service": 2210,
"name": "Members - 30 Days Non Drop - 30 Days Refill",
"type": "Default",
"category": "Telegram - Members (30 Days Non Drop)",
"rate": "1.4300",
"min": "100",
"max": "50000",
"refill": true,
"cancel": false
}
]Add an order (add)
Places an order and takes the amount from your balance. The amount is the price per 1,000 times the quantity; for Package it is the package price, and for Custom Comments the number of comment lines is the quantity. Orders are available on accounts whose first top up is credited. The order in the response is your order ID.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | add |
| service | Service ID (service from services) |
| link | Public link. For Telegram: t.me/name, private invite link t.me/+code, post t.me/name/123, bot t.me/botname. @name is accepted too |
| quantity | Quantity (within min and max). Not needed for Package and Custom Comments |
| comments | Custom Comments only. One comment per line, up to 10,000 lines, up to 500 characters per line |
Response example
{
"order": 31877
}Order status (status)
The status of one order. charge is the actual amount paid after refunds (USD, 6 decimals), start_count is the count when the order started, and remains is the quantity not yet delivered.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | status |
| order | Order ID |
Response example
{
"charge": "1.430000",
"start_count": "8120",
"status": "In progress",
"remains": "410",
"currency": "USD"
}Multiple order status (status, orders)
Checks up to 100 orders at once, with order IDs joined by commas. IDs that do not exist or are not on your account get an error in their place.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | status |
| orders | List of order IDs, for example 1,10,100 |
Response example
{
"1": { "charge": "0.300000", "start_count": "120", "status": "Completed", "remains": "0", "currency": "USD" },
"10": { "error": "Incorrect order ID" }
}Request a refill (refill)
For an order of a service with a refill period that ended as Completed or Partial, request within the refill period counted from when it ended. Each order can have one open request, with 24 hours between requests.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | refill |
| order | Order ID |
Response example
{
"refill": 512
}Refill status (refill_status)
The status of one refill request.
| Parameter | Description |
|---|---|
| key | Your API key |
| action | refill_status |
| refill | Refill ID (refill from the refill response) |
Response example
{
"status": "Completed"
}Balance (balance)
Your balance (USD, 6 decimals).
| Parameter | Description |
|---|---|
| key | Your API key |
| action | balance |
Response example
{
"balance": "84.120000",
"currency": "USD"
}Order status values
| Pending | Received. Being passed on, waiting to start, or an operator is checking the handoff result |
| In progress | Being delivered |
| Completed | Fully delivered |
| Partial | Partly delivered. The undelivered part is refunded to your balance |
| Canceled | Not delivered. Full refund to your balance |
Refill status values
| Pending | Refill request received |
| In progress | Refill being delivered |
| Completed | Refill delivered |
| Rejected | Refill request was not accepted |
Error messages
Errors come as JSON with an error field in an HTTP 200 response. In your code, check for the error field first.
{
"error": "Not enough funds on balance"
}| Invalid API key | Key is missing, wrong, or replaced by a new key |
| Too many requests | More than 300 requests per minute. Try again shortly |
| Incorrect action | The action value is not in the list above |
| Add funds first | Order from an account whose first top up is not credited yet |
| Incorrect service ID | No orderable service with that ID |
| Incorrect link | Link is empty or not a web address |
| Quantity out of range | Below the minimum or above the maximum quantity |
| Incorrect comments | Custom Comments are empty or exceed 10,000 lines or 500 characters per line |
| Not enough funds on balance | Balance is lower than the order amount. Top up and order again |
| Incorrect order ID | That order ID is not on your account |
| Refill is not available for this service | Service has no refill period |
| Order is not finished yet | Refill is available once the order is Completed or Partial |
| Refill period has ended | The refill period, counted from when the order ended, has passed |
| Refill already requested | This order already has an open refill request |
| Refill already requested, try again later | 24 hours have not passed since the last request |
| Incorrect refill ID | That refill ID is not on your account |
How do I connect an SMM panel API to a Telegram bot?
1. Save the service list
Call services a few times a day and save the service ID, name, rate, min and max in your own data. Calculate the price you show customers by adding your margin to rate, and use the saved service ID as is when you order.
2. Check quantity and link before ordering
Checking first that quantity is between min and max and that the link is in t.me format cuts down Quantity out of range and Incorrect link errors. It also helps to check your balance with balance in advance.
3. Check status in batches
Check orders in progress every few minutes in batches of 100 with the orders parameter. This stays comfortably within the limit of 300 requests per minute per key. When an order becomes Completed, Partial or Canceled, let your customer know the result.
4. Refill only finished orders
When an order for a refill service becomes Completed or Partial, you can send refill. Save the refill ID from the response and track progress with refill_status.
