API V2
Kết nối server-to-server để đồng bộ sản phẩm, kiểm tra số dư, tạo đơn hàng và nhận kết quả giao hàng từ VNLIKE.
Header khuyến nghị:
Authorization: Bearer YOUR_API_KEY Accept: application/json
Hoặc:
X-API-Key: YOUR_API_KEY
Không đặt API key trong URL hoặc JavaScript công khai. Hãy gọi API từ server/backend của bạn.
OpenAPI JSON →Quản lý API key
Đang kiểm tra đăng nhập...
Liên kết VNLIKE với Telegram Bot
Nhận diện đúng tài khoản VNLIKE của bạn trên Telegram, dùng chung số dư và lịch sử đơn hàng. Không gửi API Key hoặc mật khẩu vào Telegram.
Đang kiểm tra liên kết Telegram...
API tự đồng bộ gì?
Vì vậy khi Admin thay đổi các dữ liệu trên, đối tác gọi API lần tiếp theo sẽ nhận dữ liệu mới. Không cần sửa API.
Nếu VNLIKE thêm một loại xử lý hoàn toàn mới có quy trình nghiệp vụ riêng, API server sẽ được bổ sung handler cho loại đó. API V2 cũ vẫn được giữ tương thích.
GET /capabilities
Lấy sản phẩm
GET /products?page=1&limit=50
curl "https://vnlike.vn/api/v2/products?page=1&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Accept: application/json"
Chi tiết một sản phẩm
GET /products/96
Nếu requires_package=true,
khi tạo đơn phải truyền package_id.
fields cho biết các trường
khách cần gửi. Có thể gửi theo ID trường hoặc
theo key.
Tạo đơn
Dùng POST JSON và bắt buộc một
Idempotency-Key duy nhất cho đơn.
POST /orders Authorization: Bearer YOUR_API_KEY Idempotency-Key: reseller-order-20261009-0001 Content-Type: application/json
{
"product_id": 96,
"package_id": 10,
"quantity": 1,
"customer_fields": {}
}
Nếu mất mạng hoặc timeout, gửi lại đúng request
với cùng Idempotency-Key.
Hệ thống sẽ trả lại đơn cũ thay vì trừ tiền lần hai.
Sản phẩm cần thông tin khách
{
"product_id": 104,
"package_id": 21,
"quantity": 1,
"customer_fields": {
"field_250674b57696": "customer@example.com",
"field_2d3bfb1ea7e7": "PASSWORD"
}
}
Theo dõi đơn
GET /orders/1234
API trả một trạng thái chung:
waiting processing completed cancelled refunded
Đồng thời vẫn trả
payment_status,
work_status và
fulfillment_type.
Đơn Auto
{
"fulfillment": {
"type": "auto",
"keys": [
"ACCOUNT|PASSWORD"
]
}
}
Admin giao tay / nâng cấp
{
"fulfillment": {
"type": "manual",
"delivery_content": "Nội dung Admin đã giao"
}
}
Thuê SMS
{
"fulfillment": {
"type": "sms",
"sms": {
"status": "waiting_otp",
"number": "+123456789",
"otp": null,
"expires_at": "2026-10-09T14:30:00+07:00",
"remaining_seconds": 420
}
}
}
Tra bằng Idempotency-Key
GET /orders?idempotency_key=reseller-order-20261009-0001
Lỗi API
HTTP 4xx/5xx trả
application/problem+json.
{
"type": "https://vnlike.vn/api/problems/insufficient-balance",
"title": "Insufficient Balance",
"status": 409,
"detail": "Số dư ví không đủ để tạo đơn hàng.",
"code": "INSUFFICIENT_BALANCE",
"request_id": "req_abcd1234"
}
| HTTP | Ý nghĩa |
|---|---|
| 200 | Thành công / replay đơn |
| 201 | Tạo đơn mới thành công |
| 400 | Request không hợp lệ |
| 401 | API key sai / bị thu hồi |
| 403 | Tài khoản bị khóa |
| 404 | Không tìm thấy dữ liệu |
| 409 | Số dư, kho hoặc Idempotency conflict |
| 415 | Sai Content-Type |
| 422 | Dữ liệu không hợp lệ |
| 429 | Quá giới hạn request |
| 500 | Lỗi server; retry cùng Idempotency-Key |
Code mẫu
PHP · cURL
<?php
$apiKey = getenv('VNL_API_KEY');
$payload = [
'product_id' => 96,
'package_id' => 10,
'quantity' => 1,
'customer_fields' => []
];
$ch = curl_init(
'https://vnlike.vn/api/v2/orders'
);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer '.$apiKey,
'Idempotency-Key: '.bin2hex(random_bytes(16)),
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
$response = curl_exec($ch);
if ($response === false) {
throw new RuntimeException(
curl_error($ch)
);
}
$status = curl_getinfo(
$ch,
CURLINFO_HTTP_CODE
);
curl_close($ch);
$data = json_decode(
$response,
true,
512,
JSON_THROW_ON_ERROR
);
print_r($data);
Python
import os
import uuid
import requests
api_key = os.environ["VNL_API_KEY"]
response = requests.post(
"https://vnlike.vn/api/v2/orders",
headers={
"Authorization": f"Bearer {api_key}",
"Idempotency-Key": str(uuid.uuid4()),
"Accept": "application/json",
},
json={
"product_id": 96,
"package_id": 10,
"quantity": 1,
"customer_fields": {},
},
timeout=30,
)
response.raise_for_status()
print(response.json())