Likesub360 API — SMM Panel standard.
Integrate Likesub360 into your system via the Panel API — it follows the SMM Panel standard, so migrating from another panel only takes a URL change.
Introductionv2
v2 follows the familiar SMM Panel standard — a single endpoint, form-encoded body, key + action. The goal is to let you migrate from other SMM panels to Likesub360 without changing your code — just swap the domain and key.
Endpoint
likesub360.vn/api/v2
One endpoint for every action
Method
POST
application/x-www-form-urlencoded
Currency
USD only
The system converts VND ↔ USD
Rate limit
60 / min
10,000 / day per API key
Authentication
Every request sends the key in the body (not a header). You can use the same key as v1 — just copy the value. The key is a 40-character base62 string with no prefix.
key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF&action=balanceErrors
v2 always returns HTTP 200 — even on errors. Reseller code expects this exact format, so the backend never throws 4xx/5xx. Errors are encoded in the body:
{ "error": "Thiếu tham số 'service'" }BusinessException). Match on the structure (the presence of an error field), not the exact text. The table below explains each common message.| Message | Meaning |
|---|---|
| API key không hợp lệ | The key field is missing, wrong, or has been rotated/revoked. |
| Thiếu tham số 'action' | The body has no action field. |
| Action không hợp lệ: <name> | The action is not one of the 6 standard actions (services, balance, add, status, cancel, refill). |
| Thiếu tham số 'service' / 'link' / 'quantity' / 'order' / 'orders' | A required field for the action being called is missing. |
| Tham số '<field>' không hợp lệ | Could not be parsed as an integer (service, quantity, order). |
| Số dư ví không đủ | The wallet does not have enough to hold the order. |
| Không tìm thấy đơn | The order does not exist or does not belong to the API key's account. |
| Chỉ có thể yêu cầu bảo hành cho đơn đã hoàn thành | Calling refill when the order is not yet Completed/Partial. |
| Vui lòng chờ đủ 24 giờ kể từ khi đơn hoàn thành… | The order must be completed for at least 24h before refill is accepted (so the engagement settles). |
| Đơn đã hết thời hạn bảo hành | The warranty window has ended — or the package does not support refill. |
| Mỗi đơn chỉ được yêu cầu bảo hành 1 lần / 24 giờ | A refill is already running or recently completed within 24h for this order. |
| Đã vượt giới hạn request | Exceeded the API key's rate limit of 60/min or 10,000/day. |
Action: services
Returns every service (each variant = one service). The service field is exactly the ID you use for action=add.
/api/v2 · action=servicesBody parameters
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Your API key. |
action | string | Yes | Value: services |
Request
curl "https://likesub360.vn/api/v2" \
-X POST \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=services"Response
[
{
"service": 103, // variantId · integer
"name": "FB post likes — Basic package",
"type": "Default", // Panel API is always "Default"
"category": "Basic package", // package name
"rate": "0.7778", // USD per 1000 units · string, 4 decimals
"min": 100, // integer
"max": 50000, // integer
"refill": true,
"cancel": true
}
// ...
]type: "Default" — service-types that need a discriminator (REACTIONS, MINUTES) are rejected when calling add. Resellers should use DEFAULT variants.Action: balance
/api/v2 · action=balanceRequest
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=balance"Response
{ "balance": "47.65", "currency": "USD" }balance is the available balance (holds deducted), converted to USD at the internal rate — a string with 2 decimals.
Action: add — create order
/api/v2 · action=addBody parameters
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | API key. |
action | string | Yes | add |
service | integer | Yes | Service ID (variantId) from action=services. |
link | string | Yes | Public URL of the post / channel. |
quantity | integer | Yes | The amount to add, within the [min, max] range. |
add is not idempotent (industry standard — every call creates a new order). If you need idempotency, use v1 with the Idempotency-Key header.Request
$post = [
"key" => $key,
"action" => "add",
"service" => 103,
"link" => "https://facebook.com/yourpage/posts/123",
"quantity" => 1000,
];
$ch = curl_init("https://likesub360.vn/api/v2");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post),
CURLOPT_RETURNTRANSFER => true,
]);
$res = json_decode(curl_exec($ch), true);
// => [ "order" => 48294 ]Response
{ "order": 48294 }{ "error": "Số dư ví không đủ" }Action: status — order status
The same status action serves both a single order and multiple orders — they differ only by parameter:
/api/v2 · action=statusBody parameters
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | API key. |
action | string | Yes | status |
order | integer | No | A single order ID (used when orders is not sent). |
orders | string | No | Comma-separated list of IDs, e.g. 48294,48293. If present, order is ignored. |
Query a single order
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=status" \
-d "order=48294"{
"charge": "0.7778", // USD · string, 4 decimals
"start_count": 128, // integer
"status": "In progress",
"remains": 358, // integer
"currency": "USD"
}Query multiple orders
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=status" \
-d "orders=48294,48293,48295"{
"48294": { "charge": "0.7778", "start_count": 128, "status": "In progress", "remains": 358, "currency": "USD" },
"48293": { "charge": "1.5556", "start_count": 250, "status": "Completed", "remains": 0, "currency": "USD" },
"48295": { "error": "Không tìm thấy đơn" }
}The status value is one of: Pending, Processing, In progress, Completed, Partial, Canceled. v1's FAILED status is mapped to Canceled to stay compatible with reseller code that only knows the 6 standard statuses.
Action: cancel
/api/v2 · action=cancelRequest to cancel one / many orders at once. The action only moves them to CANCEL_REQUESTED — a worker handles it asynchronously (release if not yet pushed, or call cancel on the processing side). Idempotent.
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | API key. |
action | string | Yes | cancel |
orders | string | Yes | Comma-separated list of IDs. At least 1 order required. |
Request
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=cancel" \
-d "orders=48294,48293"Response
[
{ "order": "48294", "cancel": true },
{ "order": "48293", "cancel": { "error": "Không tìm thấy đơn" } }
]"cancel": true. A failed order (not found, not yours, not cancelable): "cancel": { "error": "..." }. The order field keeps the original string from the input.Action: refill
/api/v2 · action=refillRequest a refill (warranty) for one / many completed orders. The system creates the request and processes it asynchronously — the order is topped up for the engagement that dropped. Like add, this action is not idempotent — each call is a new request (the server prevents duplicates via the conditions below).
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | API key. |
action | string | Yes | refill |
order | integer | No | A single order ID (used when orders is not sent). |
orders | string | No | Comma-separated list of IDs, e.g. 48294,48293. If present, order is ignored. |
Refill a single order
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=refill" \
-d "order=48294"{ "refill": true }{ "error": "Vui lòng chờ đủ 24 giờ kể từ khi đơn hoàn thành rồi mới yêu cầu bảo hành" }Refill multiple orders
curl "https://likesub360.vn/api/v2" \
-d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
-d "action=refill" \
-d "orders=48294,48293"[
{ "order": "48294", "refill": true },
{ "order": "48293", "refill": { "error": "Đơn đã hết thời hạn bảo hành" } }
]"refill": true. A failed order (not yet 24h, warranty expired, not yours…): "refill": { "error": "..." }. The order field keeps the original string from the input.