For developers & resellers

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.

Why v2? In the SMM ecosystem, many reseller panels already wrote their code to this standard. We keep 100% compatibility with the original spec so you don't have to rewrite anything.

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

POSThttps://likesub360.vn/api/v2

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.

Required fields
key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF&action=balance

Errors

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 body
{ "error": "Thiếu tham số 'service'" }
For legacy SMM-panel compatibility, Panel API error messages are returned in Vietnamese (generated server-side from BusinessException). Match on the structure (the presence of an error field), not the exact text. The table below explains each common message.
MessageMeaning
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 đơnThe 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ànhCalling 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ànhThe 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 requestExceeded 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.

POST/api/v2 · action=services

Body parameters

FieldTypeRequiredDescription
keystringYesYour API key.
actionstringYesValue: services

Request

curl "https://likesub360.vn/api/v2" \
  -X POST \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=services"

Response

200 OK
Body
[
  {
    "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
  }
  // ...
]
Panel API currently exposes every variant as type: "Default" — service-types that need a discriminator (REACTIONS, MINUTES) are rejected when calling add. Resellers should use DEFAULT variants.

Action: balance

POST/api/v2 · action=balance

Request

curl
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=balance"

Response

Body
{ "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

POST/api/v2 · action=add

Body parameters

FieldTypeRequiredDescription
keystringYesAPI key.
actionstringYesadd
serviceintegerYesService ID (variantId) from action=services.
linkstringYesPublic URL of the post / channel.
quantityintegerYesThe amount to add, within the [min, max] range.
Panel API add is not idempotent (industry standard — every call creates a new order). If you need idempotency, use v1 with the Idempotency-Key header.

Request

php · drop-in from your old panel
$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

200 OK
Success
{ "order": 48294 }
Error (HTTP is still 200, error in the body)
{ "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:

POST/api/v2 · action=status

Body parameters

FieldTypeRequiredDescription
keystringYesAPI key.
actionstringYesstatus
orderintegerNoA single order ID (used when orders is not sent).
ordersstringNoComma-separated list of IDs, e.g. 48294,48293. If present, order is ignored.

Query a single order

curl
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=status" \
  -d "order=48294"
Body
{
  "charge":      "0.7778",          // USD · string, 4 decimals
  "start_count": 128,                // integer
  "status":      "In progress",
  "remains":     358,                // integer
  "currency":    "USD"
}

Query multiple orders

curl
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=status" \
  -d "orders=48294,48293,48295"
Body · object keyed by orderId
{
  "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

POST/api/v2 · action=cancel

Request 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

FieldTypeRequiredDescription
keystringYesAPI key.
actionstringYescancel
ordersstringYesComma-separated list of IDs. At least 1 order required.

Request

curl
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=cancel" \
  -d "orders=48294,48293"

Response

Body · array of results in input order
[
  { "order": "48294", "cancel": true },
  { "order": "48293", "cancel": { "error": "Không tìm thấy đơn" } }
]
A successful cancel: "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

POST/api/v2 · action=refill

Request 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).

Acceptance conditions. The order must be completed for at least 24 hours (so the engagement settles before topping up), the package must support warranty, it must still be within the warranty period, there must be no request already running, and each order is limited to once per 24 hours. If not met → an error is returned (see Errors).

Body parameters

FieldTypeRequiredDescription
keystringYesAPI key.
actionstringYesrefill
orderintegerNoA single order ID (used when orders is not sent).
ordersstringNoComma-separated list of IDs, e.g. 48294,48293. If present, order is ignored.

Refill a single order

curl
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=refill" \
  -d "order=48294"
Success
{ "refill": true }
Error (HTTP is still 200, error in the body)
{ "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
curl "https://likesub360.vn/api/v2" \
  -d "key=3kQp7xN2hVfL8mYwB1tRzAcEgUjK5sDoXrM4nPiF" \
  -d "action=refill" \
  -d "orders=48294,48293"
Body · array of results in input order
[
  { "order": "48294", "refill": true },
  { "order": "48293", "refill": { "error": "Đơn đã hết thời hạn bảo hành" } }
]
A successful request: "refill": true. A failed order (not yet 24h, warranty expired, not yours…): "refill": { "error": "..." }. The order field keeps the original string from the input.
Consider upgrading. Once your project is stable, move to v1 for the Idempotency-Key, detailed error codes, and offset-based pagination. Webhook events are in development — they'll ship with the webhook-out module.