Tài liệu API v2 cho đại lý

API theo chuẩn chung của các panel SMM. Nếu phần mềm của bạn đã kết nối được với một panel khác, bạn thường chỉ cần đổi URL và khoá.

Bắt đầu

  1. Tạo tài khoản và nạp tiền vào ví.
  2. Vào Quản lý API để tạo khoá. Khoá chỉ hiện một lần, hãy lưu ngay. Có thể chọn quyền (chỉ đọc hoặc đặt đơn), đặt hạn mức yêu cầu mỗi ngày và giới hạn theo danh sách IP.
  3. Gửi yêu cầu POST tới endpoint dưới đây.
Endpoint
POST https://ducksmm.devlor.tech/api/v2
  • Nội dung gửi: application/x-www-form-urlencoded hoặc application/json. Không nhận khoá trên URL.
  • Mọi yêu cầu đều có key và action. Kết quả luôn là JSON.
  • Tiền tệ: VND. Mã đơn là số nguyên tăng dần, ví dụ 10245. Mã chuỗi trên trang đơn hàng (ORDER_20261107_A1B2C3D4E5) cũng dùng được ở mọi tham số order, orders; kết quả trả lại đúng kiểu bạn đã gửi.
actionViệcQuyền khoá
servicesDanh sách dịch vụ đang bánread, order
balanceSố dư khả dụngread, order
statusTrạng thái một hoặc nhiều đơnread, order
refill_statusTrạng thái yêu cầu bảo hànhread, order
addĐặt đơnorder
refillYêu cầu bảo hànhorder
cancelHuỷ đơn còn chờ xử lýorder

services

Trả về các dịch vụ đang bán, giá theo cấp của tài khoản bạn. Không cần thêm tham số.

Kết quả
[
  {
    "service": 101,
    "id": 101,
    "name": "Tăng like bài viết Facebook - Server 1",
    "type": "Default",
    "category": "Facebook - Like",
    "rate": "20000.00",
    "currency": "VND",
    "price_unit": "per_1000",
    "min": "100",
    "max": "50000",
    "step": "1",
    "refill": true,
    "cancel": true
  }
]
TrườngÝ nghĩa
serviceMã dịch vụ, là số, cố định (id là bản sao cùng giá trị). Dùng cho action add.
rateGiá VND cho 1.000 đơn vị. Số tiền một đơn: rate × quantity ÷ 1000, đúng với mọi dịch vụ.
price_unitĐơn vị bán gốc: per_1000, per_unit, fixed (gói, số lượng luôn là 1), per_1000_per_minute (cần thêm minutes, tiền nhân thêm số phút).
typeDefault, Package (gói cố định) hoặc Custom Comments (cần comments).
min, max, stepSố lượng cho phép. Với hàng có giới hạn tồn, max không vượt số còn lại. Số lượng phải là bội của step.
refill, cancelDịch vụ có bảo hành hay không; đơn có thể huỷ trong lúc còn chờ xử lý hay không.

add

Tham sốBắt buộcMô tả
keyCóKhoá API của bạn.
actionCóadd
serviceCóMã dịch vụ.
linkVới dịch vụ SMMĐường dẫn cần chạy, dạng http hoặc https.
quantityCó, trừ gói cố địnhSố nguyên trong khoảng min đến max.
commentsVới Custom CommentsNội dung bình luận, mỗi dòng một bình luận.
minutesVới per_1000_per_minuteSố phút.
idempotency_keyNên cóChuỗi bạn tự đặt, tối đa 90 ký tự (chữ, số, _ - . :). Có thể gửi qua header Idempotency-Key. Gửi lại cùng khoá sẽ nhận lại đúng đơn cũ, không tạo đơn mới hay trừ tiền lần nữa. Cùng khoá với nội dung khác bị từ chối (422).
Kết quả
{
  "order": 10245,
  "order_code": "ORDER_20261107_A1B2C3D4E5",
  "status": "Pending",
  "charge": "20000.00",
  "currency": "VND"
}

order là mã bạn lưu để gọi các action sau. order_code là mã hiện trên website, dùng khi liên hệ hỗ trợ.

status

Tham sốBắt buộcMô tả
keyCóKhoá API của bạn.
actionCóstatus
orderMột trong haiMột mã đơn: số, hoặc mã chuỗi cũ.
ordersMột trong haiNhiều mã đơn, ngăn bằng dấu phẩy, tối đa 100.
Một đơn
{
  "charge": "20000.00",
  "start_count": "1230",
  "status": "In progress",
  "remains": "600",
  "currency": "VND"
}
Nhiều đơn
{
  "10245": {
    "charge": "20000.00",
    "start_count": "1230",
    "status": "Completed",
    "remains": "0",
    "currency": "VND"
  },
  "99999": { "error": "Incorrect order ID" }
}

Trạng thái: Pending, In progress, Completed, Partial, Canceled. charge là số tiền thực trừ sau hoàn tiền.

refill và refill_status

Tham sốBắt buộcMô tả
keyCóKhoá API của bạn.
actionCórefill
order hoặc ordersCóMột mã đơn, hoặc nhiều mã ngăn bằng dấu phẩy (tối đa 100).
Một đơn
{ "order": 10245, "refill": "cmabc123" }
Nhiều đơn: lỗi nằm trong từng phần tử
[
  { "order": 10245, "refill": "cmabc123" },
  { "order": 99999, "refill": { "error": "Incorrect order ID" } }
]

Đơn phải hoàn thành, dịch vụ có bảo hành, còn trong thời hạn, cách lần trước đủ lâu. Tra kết quả bằng action=refill_status với refill (một mã) hoặc refills (nhiều mã):

{ "status": "In progress" }

[
  { "refill": "cmabc123", "status": "Completed" },
  { "refill": "cmabc456", "status": { "error": "Refill not found" } }
]

Trạng thái: Pending, In progress, Completed, Rejected.

cancel

Huỷ đơn chưa được xử lý và trả lại tiền giữ. Tham số order hoặc orders như refill.

{ "order": 10245, "cancel": 1 }

[
  { "order": 10245, "cancel": 1 },
  { "order": 99999, "cancel": { "error": "Incorrect order ID" } }
]

balance

{ "balance": "1250000", "currency": "VND" }

Đây là số dư khả dụng, đã trừ tiền đang giữ cho các đơn chưa hoàn tất.

Ví dụ

Luôn lưu khoá ở phía máy chủ, không đặt trong mã chạy trên trình duyệt hay ứng dụng di động.

curl
# Lấy danh sách dịch vụ
curl -X POST https://ducksmm.devlor.tech/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=services

# Đặt đơn (gửi kèm idempotency_key để gửi lại an toàn)
curl -X POST https://ducksmm.devlor.tech/api/v2 \
  -d key=YOUR_API_KEY \
  -d action=add \
  -d service=101 \
  --data-urlencode "link=https://www.facebook.com/yourpage" \
  -d quantity=1000 \
  -d idempotency_key=my-order-0001

# Gửi JSON cũng được
curl -X POST https://ducksmm.devlor.tech/api/v2 \
  -H "Content-Type: application/json" \
  -d '{"key":"YOUR_API_KEY","action":"balance"}'
PHP
<?php
function duck_api(array $params) {
    $ch = curl_init('https://ducksmm.devlor.tech/api/v2');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query(
            array_merge(['key' => getenv('DUCK_API_KEY')], $params)
        ),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
    ]);
    $body = curl_exec($ch);
    curl_close($ch);
    $data = json_decode($body, true);
    if (isset($data['error'])) {
        throw new RuntimeException($data['error']);
    }
    return $data;
}

$order = duck_api([
    'action' => 'add',
    'service' => 101,
    'link' => 'https://www.facebook.com/yourpage',
    'quantity' => 1000,
    'idempotency_key' => 'my-order-0001',
]);
echo $order['order'];
Python
import os
import requests

URL = "https://ducksmm.devlor.tech/api/v2"
KEY = os.environ["DUCK_API_KEY"]


def duck_api(**params):
    res = requests.post(URL, data={"key": KEY, **params}, timeout=30)
    data = res.json()
    if isinstance(data, dict) and "error" in data:
        raise RuntimeError(f"{res.status_code}: {data['error']}")
    return data


order = duck_api(
    action="add",
    service=101,
    link="https://www.facebook.com/yourpage",
    quantity=1000,
    idempotency_key="my-order-0001",
)
print(duck_api(action="status", order=order["order"]))

Mã lỗi

Lỗi có dạng { "error": "..." } kèm mã HTTP tương ứng. Lỗi nghiệp vụ khác của đơn (hết hàng, sai bước số lượng, đơn không huỷ được...) có lời nhắn tiếng Việt và mã 400 hoặc 409.

HTTPerrorKhi nào
400Missing action / Incorrect actionThiếu hoặc sai action.
400Missing service / link / quantity / orderThiếu tham số.
400Incorrect quantitySố lượng không phải số nguyên dương.
400Quantity must be between X and YNgoài khoảng cho phép.
400Too many orders (maximum 100)Quá 100 mã đơn một lần.
400Order was partially refunded, refill is not availableRefill đơn đã hoàn tiền một phần. Kèm code ORDER_ALREADY_PARTIALLY_REFUNDED.
400Drip-feed is not supported for this serviceCó gửi runs hoặc interval.
400Comments are not supported for this serviceCó gửi comments cho dịch vụ không nhận.
401Missing API key / Invalid API keyThiếu, sai khoá, khoá đã tắt hoặc tài khoản bị khoá.
401IP not allowedIP không nằm trong danh sách của khoá.
402Not enough funds on balanceKhông đủ số dư.
403API key is read-onlyKhoá chỉ đọc gọi action ghi.
404Incorrect service IDDịch vụ không có hoặc đã ngừng bán.
404Incorrect order IDĐơn không có hoặc không phải của bạn.
404Refill not foundYêu cầu bảo hành không có hoặc không phải của bạn.
405Method not allowed, use POSTKhông dùng POST.
409Service is out of stockHết hàng.
422(lời nhắn tiếng Việt)idempotency_key đã dùng cho nội dung khác.
429Too many requestsVượt giới hạn theo phút. Xem header Retry-After.
429Daily request limit exceededHết hạn mức ngày của khoá.
500Internal server errorLỗi hệ thống. Gửi lại với cùng idempotency_key là an toàn.

Giới hạn

Giới hạnMặc địnhPhạm vi
Action ghi (add, refill, cancel)60 yêu cầu / phútMỗi khoá
Action đọc (services, balance, status, refill_status)300 yêu cầu / phútMỗi khoá
Tổng yêu cầu một ngày50.000, hoặc mức thấp hơn bạn tự đặt cho khoáMỗi khoá, đặt lại lúc 0 giờ giờ Việt Nam
Khoá sai60 lần / phútMỗi IP

Danh sách services được lưu đệm tới 60 giây, không cần gọi liên tục. Nên gọi status theo lô bằng orders.

Cần hỗ trợ tích hợp? Liên hệ chúng tôi.