# Tài liệu API tuongtac86.com

> API chuẩn SMM để mua và quản lý dịch vụ tăng tương tác trên tuongtac86.com. Mọi thao tác dùng CHUNG một endpoint, phân biệt bằng tham số `action`.

## Tổng quan

| Mục | Giá trị |
|---|---|
| Endpoint V2 | `https://tuongtac86.com/api/v2` |
| Endpoint V3 | `https://tuongtac86.com/api/v3` |
| HTTP method | `POST` |
| Content-Type | `application/x-www-form-urlencoded` (cũng nhận `multipart/form-data` và `application/json`) |
| Xác thực | Tham số `key` trong body (API Key lấy ở trang Website & API sau khi đăng nhập) |
| Phản hồi | JSON |

### V2 và V3 khác nhau thế nào

Tham số gửi đi giống hệt nhau, cùng trả thông báo tiếng Việt và tiền tệ USD (tiền và số lượng trả dạng chuỗi, ví dụ `"863.17804"`). Chỉ khác cách báo lỗi:

- **API V2** (`/api/v2`): Chuẩn chung của đa số API SMM. Luôn trả HTTP 200, kể cả khi lỗi; có lỗi thì body có trường `error` (kèm `code`). Postman: https://documenter.getpostman.com/view/7443180/2sBY4WowTV
- **API V3** (`/api/v3`): Dùng cho các đầu nối API SMM tại Việt Nam. Lỗi trả HTTP khác 200 (400: lỗi chung, 401: sai API Key), body có `code`, `status: "error"` và `error`. Postman: https://documenter.getpostman.com/view/7443180/2sBY4WowTV

Ví dụ lỗi V2 (HTTP 200):

```json
{
  "error": "Không tìm thấy đơn hàng này*",
  "code": 400
}
```

Ví dụ lỗi V3 (HTTP 400):

```json
{
  "code": "400",
  "status": "error",
  "error": "Không tìm thấy đơn hàng này*"
}
```

Cách phát hiện lỗi an toàn cho cả hai phiên bản: body có trường `error`.

### Tham số chung (mọi action)

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Tên thao tác. |

### Danh sách action

- Đơn hàng: `services` (Danh sách dịch vụ), `add` (Tạo đơn, thay đổi dữ liệu), `status` (Trạng thái đơn), `refill` (Bảo hành, thay đổi dữ liệu), `cancel` (Huỷ đơn, thay đổi dữ liệu)
- Dịch vụ VIP: `add_vip` (Tạo đơn VIP, thay đổi dữ liệu), `update_vip` (Cập nhật VIP, thay đổi dữ liệu), `extend_vip` (Gia hạn VIP, thay đổi dữ liệu), `add_post_vip` (Thêm bài viết VIP, thay đổi dữ liệu), `refund_vip` (Hoàn tiền VIP, thay đổi dữ liệu), `delete_vip_expired` (Xoá đơn VIP hết hạn, thay đổi dữ liệu), `list_vip` (Danh sách đơn VIP), `vip_log` (Lịch sử VIP)
- Tài khoản & tiện ích: `balance` (Số dư), `get_numeric_uid` (Lấy UID Facebook dạng số)

Quy trình mua thường gặp: gọi `services` để lấy `service` và `type` → gọi `add` (hoặc `add_vip` nếu `is_vip: true`) kèm tham số riêng theo `type` → lưu `order` trả về → gọi `status` định kỳ để theo dõi.

## Đơn hàng

### `services` - Danh sách dịch vụ

Lấy toàn bộ dịch vụ đang mở bán cùng giá theo cấp tài khoản của bạn. Trường `type` cho biết khi tạo đơn cần gửi thêm tham số gì.

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"services"`. |
| `platform` | string | không | Chỉ lấy dịch vụ của một nền tảng. Giá trị: `Facebook`, `Instagram`, `Tiktok`, `Telegram`, `Twitter`, `Youtube`, `Shopee`, `Lazada`, `Threads`. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=services'
```

**Phản hồi thành công** (HTTP 200)

```json
[
  {
    "service": 55,
    "name": "Member group",
    "sub_name": "buff_group",
    "type": "Default",
    "category": "buff_group",
    "description": "Member beta, Vietnamese [10k-20k/ 24 hours.]",
    "rate": "1",
    "min": "200",
    "max": "3000000",
    "refill": false,
    "refill_days": 0,
    "cancel": true,
    "currency": "USD",
    "platform": "Facebook",
    "data": {}
  },
  {
    "service": 63,
    "name": "Like Speed",
    "sub_name": "s_like",
    "type": "Reaction",
    "category": "Like",
    "description": "Like Vietnamese",
    "rate": "1",
    "min": "10",
    "max": "50000",
    "refill": false,
    "refill_days": 0,
    "cancel": true,
    "currency": "USD",
    "platform": "Facebook",
    "data": {
      "allow_reaction": true,
      "reactions": [
        "like",
        "love",
        "wow",
        "haha"
      ]
    }
  },
  {
    "service": 523,
    "name": "Vip Like V10",
    "sub_name": "vip_like_v10",
    "type": "Vip Default",
    "category": "VIP Like Theo Tháng",
    "description": "Thời gian chạy từ 7h-23h. Tùy chọn số bài theo khách hàng.",
    "rate": "87.5",
    "min": "50",
    "max": "1000",
    "currency": "USD",
    "platform": "Facebook",
    "data": {
      "has_custom_post": true,
      "post_price_ratio": 5
    },
    "is_vip": true
  }
]
```

**Giải thích trường trả về**

- `service`: ID dịch vụ, dùng cho tham số `service` khi tạo đơn.
- `type`: Loại dịch vụ, quyết định tham số riêng khi tạo đơn (xem action `add` và `add_vip`).
- `rate`: Giá cho mỗi 1000 đơn vị, tính bằng USD (chuỗi).
- `min / max`: Số lượng mua tối thiểu / tối đa (chuỗi).
- `refill`: Có cho bảo hành không.
- `refill_days`: Số ngày được bảo hành, tính từ khi đơn hoàn thành.
- `cancel`: Có cho huỷ đơn không.
- `is_vip`: Dịch vụ VIP - mua bằng `add_vip`, không dùng `add`. Dịch vụ VIP không có `refill`/`cancel`.
- `data.allow_reaction`: Được chọn cảm xúc qua tham số `reaction` không.
- `data.reactions`: Các cảm xúc dịch vụ chạy được. Không có trường này nghĩa là chạy đủ cảm xúc.
- `data.has_custom_post`: (VIP) Được chọn số bài mỗi ngày qua `max_post` không.
- `data.post_price_ratio`: (VIP) Tỉ lệ số bài/giá. Ví dụ 5: 5 bài giá x1, 10 bài giá x2.

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Key không hợp lệ*","code":401}` · V3 (HTTP 401): `{"code":"401","status":"error","error":"Key không hợp lệ*"}`

### `add` - Tạo đơn

Mua một dịch vụ thường. Trừ tiền ngay khi tạo đơn thành công.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"add"`. |
| `service` | integer | có | ID dịch vụ (trường `service` của action `services`). |
| `link` | string | có | Link profile/bài viết, tối đa 200 ký tự. Dịch vụ profile Facebook cần link có UID dạng số, ví dụ https://www.facebook.com/100000000001 (lấy bằng action `get_numeric_uid`). |
| `quantity` | integer | có | Số lượng mua, trong khoảng `min`-`max` của dịch vụ. |
| `note` | string | không | Ghi chú, tối đa 100 ký tự. |

**Tham số riêng theo `type` của dịch vụ** (lấy `type` từ action `services`):

| type | Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|---|
| Default | - | | | Không cần thêm tham số. |
| Custom Comments | `comments` | string | có | Nội dung bình luận, mỗi dòng một bình luận, nối bằng `\n`. Số dòng phải BẰNG `quantity`. |
| Custom Reviews | `comments` | string | có | Nội dung đánh giá, mỗi dòng một đánh giá, nối bằng `\n`. Mỗi dòng dài tối thiểu 26 ký tự. Số lượng mua tính theo SỐ DÒNG, giá trị `quantity` gửi lên không được dùng (vẫn phải gửi một số nguyên dương). Một số dịch vụ không nhận emoji. |
| Custom Checkin | `comments` | string | không | Nội dung check-in, mỗi dòng một nội dung, nối bằng `\n`. Có thể bỏ trống; nếu gửi thì mỗi dòng dài tối thiểu 26 ký tự. Số lượng mua lấy theo `quantity`, không theo số dòng. |
| Reaction | `reaction` | string | không | Cảm xúc, mặc định `like`. Chỉ chọn trong `data.reactions` của dịch vụ (nếu có). Giá trị: `like`, `love`, `care`, `wow`, `haha`, `sad`, `angry`. |
| Reaction Comment | `reaction` | string | không | Cảm xúc thả vào bình luận, mặc định `like`. Giá trị: `like`, `love`, `care`, `wow`, `haha`, `sad`, `angry`. |
| View Special | - | | | Không cần thêm tham số. |
| Custom Livestream | `minutes` | integer | có | Số phút xem livestream muốn mua. |
| Like Comment Tiktok | - | | | Không cần thêm tham số. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=add' \
  --data-urlencode 'service=63' \
  --data-urlencode 'link=https://www.facebook.com/100000000001' \
  --data-urlencode 'quantity=100'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "order": 673925,
  "start_count": 69
}
```

**Giải thích trường trả về**

- `order`: Mã đơn, dùng cho `status`, `refill`, `cancel`.
- `start_count`: Số lượng ban đầu lúc tạo đơn.

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Tài khoản không đủ tiền*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Tài khoản không đủ tiền*"}`

### `status` - Trạng thái đơn

Xem trạng thái một hoặc nhiều đơn. Truyền một ID trả về một object; nhiều ID trả về object có khoá là từng ID.

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"status"`. |
| `order` | string | có | Một Order ID, hoặc nhiều ID nối bằng dấu phẩy. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=status' \
  --data-urlencode 'order=672792,672796'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "672792": {
    "charge": "0.05833",
    "status": "Refunded",
    "start_count": "0",
    "remains": "100",
    "currency": "USD"
  },
  "672796": {
    "charge": "0.09583",
    "status": "Processing",
    "start_count": "69",
    "remains": "100",
    "currency": "USD"
  },
  "672800": {
    "error": "Không tìm thấy đơn hàng này*"
  }
}
```

**Giải thích trường trả về**

- `status`: Một trong: Pending, Processing, In progress, Completed, Canceled, Refunded, Waiting Cancel.
- `charge`: Đơn giá đã trừ cho mỗi đơn vị, tính bằng USD (chuỗi).
- `start_count`: Số lượng ban đầu lúc bắt đầu chạy (chuỗi).
- `remains`: Số lượng còn lại chưa chạy (chuỗi).
- `error`: Có khi ID đó không tồn tại (chỉ trong kết quả nhiều đơn).

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `refill` - Bảo hành

Yêu cầu bảo hành đơn đã hoàn thành (`Completed`), với dịch vụ có `refill: true`.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"refill"`. |
| `order` | integer | có | Mã đơn hàng (Order ID). |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=refill' \
  --data-urlencode 'order=673925'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "refill": 673925,
  "success": true,
  "updated_order_id": 673925
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `cancel` - Huỷ đơn

Huỷ đơn đang chạy và hoàn tiền phần chưa chạy (trừ phí huỷ), với dịch vụ có `cancel: true`. Có đơn chưa huỷ ngay mà trả `status: "Waiting Cancel"`, tiền hoàn sau khi huỷ xong.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"cancel"`. |
| `order` | integer | có | Mã đơn hàng (Order ID). |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=cancel' \
  --data-urlencode 'order=673925'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true,
  "refund_count": 100,
  "status": "Refunded"
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

## Dịch vụ VIP

### `add_vip` - Tạo đơn VIP

Mua gói VIP theo ngày cho dịch vụ có `is_vip: true`. Trừ tiền ngay khi tạo đơn thành công.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"add_vip"`. |
| `service` | integer | có | ID dịch vụ VIP (dòng có `is_vip: true` trong `services`). |
| `link` | string | có | Link profile/kênh chạy VIP, tối đa 200 ký tự. |
| `quantity` | integer | có | Số lượng muốn mua. |
| `days` | integer | có | Số ngày mua. Giá trị: `30`, `60`, `90`, `120`, `180`. |
| `max_post` | integer | không | Số bài tối đa mỗi ngày, bắt buộc khi dịch vụ có `data.has_custom_post: true`. |
| `name` | string | không | Tên hiển thị của profile, tối đa 150 ký tự. |
| `note` | string | không | Ghi chú, tối đa 120 ký tự. |

**Tham số riêng theo `type` của dịch vụ** (lấy `type` từ action `services`):

| type | Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|---|
| Vip Default | - | | | Không cần thêm tham số. |
| Vip Comment | `comments` | string | có | Nội dung bình luận, mỗi dòng một bình luận, nối bằng `\n`. |
| Vip Livestream | `minutes` | integer | có | Số phút mỗi lần live: bội số của 30, từ 30 đến 480. |
| Vip Livestream | `order_count` | integer | có | Tổng số live trong gói. |
| Vip View Video | `video_type` | integer | có | Loại video. Giá trị: `1`, `2`, `3`, `4`, `5`. |
| Vip View Video | `speed` | integer | không | Tốc độ: `0` thường, `1` nhanh. Giá trị: `0`, `1`. |
| Vip View Video | `max_post` | integer | không | Số bài mỗi ngày. Giá trị: `5`, `10`, `20`. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=add_vip' \
  --data-urlencode 'service=523' \
  --data-urlencode 'link=https://www.facebook.com/100000000001' \
  --data-urlencode 'quantity=50' \
  --data-urlencode 'days=30'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "order": 12345
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Tài khoản không đủ tiền*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Tài khoản không đủ tiền*"}`

### `update_vip` - Cập nhật VIP

Đổi nội dung bình luận của đơn VIP bình luận.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"update_vip"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |
| `comments` | string | có | Nội dung bình luận mới, mỗi dòng một bình luận, nối bằng `\n`. |
| `note` | string | không | Ghi chú, tối đa 120 ký tự. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=update_vip' \
  --data-urlencode 'order=12345' \
  --data-urlencode 'comments=Hay quá
Ủng hộ bạn'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `extend_vip` - Gia hạn VIP

Mua thêm ngày cho đơn VIP. Trừ tiền theo số ngày gia hạn.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"extend_vip"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |
| `days` | integer | có | Số ngày gia hạn. Giá trị: `30`, `60`, `90`, `120`, `180`. |
| `note` | string | không | Ghi chú, tối đa 120 ký tự. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=extend_vip' \
  --data-urlencode 'order=12345' \
  --data-urlencode 'days=30'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `add_post_vip` - Thêm bài viết VIP

Thêm một bài viết cụ thể vào đơn VIP để chạy bù.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"add_post_vip"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |
| `link` | string | có | Link (hoặc ID) bài viết, tối đa 300 ký tự. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=add_post_vip' \
  --data-urlencode 'order=12345' \
  --data-urlencode 'link=https://www.facebook.com/100000000001/posts/123456789'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Bài viết này đã tồn tại trong hệ thống*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Bài viết này đã tồn tại trong hệ thống*"}`

### `refund_vip` - Hoàn tiền VIP

Dừng đơn VIP và hoàn tiền phần còn lại của gói.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"refund_vip"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=refund_vip' \
  --data-urlencode 'order=12345'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true,
  "refund": "7.36538",
  "currency": "USD",
  "days_left": 23,
  "subtract_days": 7
}
```

**Giải thích trường trả về**

- `refund`: Số tiền được hoàn, tính bằng USD (chuỗi).
- `days_left`: Số ngày còn lại của gói.
- `subtract_days`: Số ngày bị trừ khi hoàn.

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `delete_vip_expired` - Xoá đơn VIP hết hạn

Xoá một đơn VIP đã hết hạn khỏi danh sách. Đơn còn hạn không xoá được.

_Thao tác này thay đổi dữ liệu thật (có thể trừ tiền)._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"delete_vip_expired"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=delete_vip_expired' \
  --data-urlencode 'order=12345'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `list_vip` - Danh sách đơn VIP

Xem chi tiết nhiều đơn VIP cùng lúc.

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"list_vip"`. |
| `orders` | string | có | Danh sách mã đơn VIP, nối bằng dấu phẩy. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=list_vip' \
  --data-urlencode 'orders=106,107'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true,
  "data": [
    {
      "id": 106,
      "uid": "uid_profile",
      "type": "vip_love_tiktok",
      "time_expired": "2025-10-17",
      "server": "server_1",
      "status": 1,
      "post_today": 0,
      "max_post": 5,
      "time": "2025-09-17T15:14:41.000Z",
      "package": 100,
      "duration": "30 ngày",
      "quantity": 100
    }
  ]
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không tìm thấy đơn hàng này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không tìm thấy đơn hàng này*"}`

### `vip_log` - Lịch sử VIP

Các bài viết mà đơn VIP đã chạy.

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"vip_log"`. |
| `order` | integer | có | Mã đơn VIP (do `add_vip` trả về, khác mã đơn thường). |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=vip_log' \
  --data-urlencode 'order=12345'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "success": true,
  "posts": [
    {
      "post_id": "123",
      "post_type": "post",
      "time": "2025/09/18 10:47:32",
      "status": 0,
      "original": 69,
      "present": null,
      "note": "Bù đơn",
      "status_text": "In progress"
    }
  ]
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Đơn hàng này đã bị hết hạn hoặc không tồn tại*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Đơn hàng này đã bị hết hạn hoặc không tồn tại*"}`

## Tài khoản & tiện ích

### `balance` - Số dư

Số dư tài khoản, quy đổi sang USD theo tỉ giá `rate` (1 USD = `rate` VND).

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"balance"`. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=balance'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "balance": "863.17804",
  "currency": "USD",
  "rate": "26000",
  "success": true
}
```

**Giải thích trường trả về**

- `balance`: Số dư, tính bằng USD (chuỗi).
- `rate`: Tỉ giá đang dùng để quy đổi: 1 USD = `rate` VND (chuỗi).

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Key không hợp lệ*","code":401}` · V3 (HTTP 401): `{"code":"401","status":"error","error":"Key không hợp lệ*"}`

### `get_numeric_uid` - Lấy UID Facebook dạng số

Đổi link profile Facebook (username, link chia sẻ) sang UID dạng số, dùng cho tham số `link` khi tạo đơn.

_Chỉ đọc dữ liệu, không trừ tiền._

**Tham số**

| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
| `key` | string | có | API Key của tài khoản, lấy ở trang Website & API. |
| `action` | string | có | Cố định `"get_numeric_uid"`. |
| `link` | string | có | Link profile Facebook. |

**Ví dụ request**

```bash
curl -X POST https://tuongtac86.com/api/v2 \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=get_numeric_uid' \
  --data-urlencode 'link=https://www.facebook.com/zuck'
```

**Phản hồi thành công** (HTTP 200)

```json
{
  "id": "100000000001",
  "link": "https://www.facebook.com/100000000001",
  "name": "Tên Khách Hàng",
  "success": true
}
```

**Phản hồi lỗi** - V2 (HTTP 200): `{"error":"Không nhận dạng được uid/link này*","code":400}` · V3 (HTTP 400): `{"code":"400","status":"error","error":"Không nhận dạng được uid/link này*"}`

## Trạng thái đơn

`Pending`, `Processing`, `In progress`, `Completed`, `Canceled`, `Refunded`, `Waiting Cancel`
