Bắt đầu nhanh
API cho phép website, bot Telegram / Zalo hoặc phần mềm của bạn mua key tự động trên 113HAX.COM — giống hệt bấm "Thuê ngay" trên web: tiền trừ vào số dư ví tài khoản của bạn, key trả về ngay trong phản hồi. Giá là giá của chính tài khoản (đã áp cấp bậc thành viên / giá đại lý nếu có). Mọi tài khoản thành viên đều dùng được.
1 Tạo API key
Đăng nhập → Tài khoản › API → Tạo API key, sao chép key
hx_...2 Nạp tiền vào ví
API thanh toán bằng số dư ví. Kiểm tra số dư bằng
GET /me.3 Lấy bảng giá
GET /products→ chọn gói, lưuvariantIdcủa gói.4 Mua key
POST /ordersvớivariantId+quantity→ nhận key trongkeys[].
Địa chỉ gốc (Base URL) của mọi API trong tài liệu này:
https://113hax.com/api/clientXác thực
Gửi API key trong header của mọi request, chọn một trong hai cách:
X-API-Key: hx_KEY_CUA_BAN
# hoặc
Authorization: Bearer hx_KEY_CUA_BAN- Key có dạng
hx_+ 32 ký tự. Key chỉ hiện đầy đủ một lần lúc tạo — mất key thì tạo key mới. - Mỗi tài khoản tối đa 10 key; thu hồi key ở Tài khoản › API là key ngừng hoạt động ngay.
- Key chỉ gọi được các API trong tài liệu này (mua key, đơn hàng, số dư). Không đổi được mật khẩu / thông tin tài khoản.
- Sai key / key đã thu hồi / tài khoản bị khoá →
401.
Quy ước chung
- Dữ liệu gửi / nhận là JSON UTF-8. Request có body phải kèm
Content-Type: application/json. - Tiền tệ VND, số nguyên (không có phần thập phân), vd
54000= 54.000đ. - Thời gian theo chuẩn ISO 8601, múi giờ UTC, vd
2026-11-07T10:57:25.339Z(= 17:57 giờ Việt Nam). - Thành công: HTTP
200(đọc) hoặc201(tạo đơn). Lỗi: HTTP 4xx / 5xx kèm JSON mô tả — xem Mã lỗi. - Giới hạn tần suất (theo IP):
POST /orders60 lần/phút,GET /products60 lần/phút,GET /orders/{code}120 lần/phút, các API còn lại 300 lần/phút. Vượt giới hạn →429, chờ vài giây rồi gọi lại. Nên lưu tạm bảng giá (cache) 1–5 phút thay vì gọi trước mỗi lần mua. - Trường mới có thể được bổ sung vào phản hồi trong tương lai — code của bạn nên bỏ qua trường không biết, đừng báo lỗi.
Thông tin tài khoản & số dư ví
GEThttps://113hax.com/api/client/me
Dùng để kiểm tra key hoạt động và số dư trước khi mua.
curl "https://113hax.com/api/client/me" \
-H "X-API-Key: hx_KEY_CUA_BAN"Phản hồi 200
{
"id": "ed1906bf-cb28-41ca-9108-e94e1be914a3",
"email": "[email protected]",
"name": "Shop Của Bạn",
"balance": 1009100,
"currency": "VND",
"tier": { "name": "VIP" },
"isReseller": false
}| Trường | Kiểu | Mô tả |
|---|---|---|
| balance | number | Số dư ví hiện tại (VND). |
| tier | object | null | Cấp bậc thành viên đang hưởng giá ưu đãi (null = giá thường). |
| isReseller | boolean | Tài khoản là đại lý → bảng giá có thêm resellerPrice / resellerMinQty. |
Bảng giá: game → tool → gói
GEThttps://113hax.com/api/client/products
Trả mọi tool đang bán, nhóm theo game. Mỗi tool có danh sách gói (24 giờ, 7 ngày, 30 ngày, Vĩnh viễn…). Bạn chỉ cần lưu variantId của gói muốn bán lại — đó là mã dùng khi mua.
curl "https://113hax.com/api/client/products" \
-H "X-API-Key: hx_KEY_CUA_BAN"Phản hồi 200
{
"currency": "VND",
"games": [
{
"id": "3f4c9084-305b-4c62-87ec-62c638353de4",
"name": "PUBG Mobile",
"slug": "pubg-mobile",
"tools": [
{
"id": "2e661c64-52ff-44e0-a60d-051c35fc2957",
"name": "Vnhax Gameloop Vip1",
"slug": "vnhax-gameloop-vip1",
"image": "https://.../uploads/tool.jpg",
"platform": "Giả lập",
"status": "active",
"packages": [
{
"variantId": "008704de-b0a2-4cba-a1fe-16fef8b94a25",
"value": "24h",
"name": "1 ngày (24h)",
"type": "rent",
"hours": 24,
"listPrice": 60000,
"price": 54000,
"inStock": true
},
{
"variantId": "6601e261-c735-4577-b41e-127b028810e1",
"value": "vinh-vien",
"name": "Vĩnh viễn",
"type": "lifetime",
"hours": null,
"listPrice": 900000,
"price": 810000,
"inStock": false
}
]
}
]
}
]
}Trường của tool
| Trường | Kiểu | Mô tả |
|---|---|---|
| id | string (UUID) | Mã tool. |
| name / slug | string | Tên tool / đường dẫn trên website. |
| status | "active" | "maintenance" | maintenance = tool đang bảo trì, mua sẽ bị từ chối (TOOL_MAINTENANCE). |
| platform | string | Nền tảng (giả lập, Android, iOS, PC…) nếu admin có ghi. |
| resellerMinQty | number | Chỉ có với tài khoản đại lý: số key tối thiểu mỗi đơn để được giá đại lý. |
| packages | array | Danh sách gói (bảng dưới). |
Trường của gói (packages[])
| Trường | Kiểu | Mô tả |
|---|---|---|
| variantId | string (UUID) | Mã gói — gửi lên khi mua. Không đổi theo thời gian. |
| value | string | Giá trị gói: 24h, 168h, 720h… (số giờ thuê) hoặc vinh-vien (mua đứt). |
| name | string | Tên gói để hiển thị, vd "7 ngày", "Vĩnh viễn". |
| type | "rent" | "lifetime" | rent = thuê theo thời gian, lifetime = vĩnh viễn. |
| hours | number | null | Số giờ sử dụng của gói thuê (null với gói vĩnh viễn). |
| listPrice | number | Giá niêm yết trên website. |
| price | number | Giá bạn trả cho 1 key (đã áp cấp bậc của tài khoản). |
| resellerPrice | number | null | Chỉ có với đại lý: giá mỗi key khi một đơn mua từ resellerMinQty key trở lên (null = gói không có giá đại lý). |
| inStock | boolean | Còn key để bán. false = hết key, tạm thời không mua được. (Số lượng tồn kho không được công khai.) |
Mua key
POSThttps://113hax.com/api/client/orders
Tạo đơn, trừ tiền ví ngay và trả về đơn kèm danh sách key (thường dưới 1 giây). Giá tính lại ở máy chủ tại thời điểm mua — dùng maxUnitPrice nếu muốn chắc chắn không mua khi giá tăng.
Tham số (JSON body)
| Tham số | Kiểu | Mô tả |
|---|---|---|
| variantId | string, bắt buộc | Mã gói lấy từ GET /products. |
| quantity | integer, bắt buộc | Số key muốn mua: 1 – 999. |
| requestId | string, nên có | Mã duy nhất do hệ thống bạn tự đặt (thường là mã đơn bên bạn), 1–64 ký tự A-Z a-z 0-9 - _ . :. Gửi lại cùng requestId → API trả lại đúng đơn cũ ("duplicate": true) và không trừ tiền lần nữa. Dùng để gọi lại an toàn khi timeout / mất mạng. |
| maxUnitPrice | number, tuỳ chọn | Đơn giá tối đa chấp nhận. Giá hiện tại cao hơn → từ chối PRICE_CHANGED, không trừ tiền. |
| allowPartial | boolean, mặc định true | Kho còn ít key hơn số đặt: true = mua số key còn lại và chỉ trừ tiền số đó (xem quantity và requestedQuantity trong phản hồi);false = từ chối cả đơn với NOT_ENOUGH_STOCK, không trừ tiền. |
{
"variantId": "008704de-b0a2-4cba-a1fe-16fef8b94a25",
"quantity": 2,
"requestId": "DH-10025",
"maxUnitPrice": 54000,
"allowPartial": false
}curl -X POST "https://113hax.com/api/client/orders" \
-H "X-API-Key: hx_KEY_CUA_BAN" \
-H "Content-Type: application/json" \
-d '{ "variantId": "008704de-b0a2-4cba-a1fe-16fef8b94a25", "quantity": 2, "requestId": "DH-10025", "maxUnitPrice": 54000, "allowPartial": false }'Phản hồi 201
{
"code": "HX26110769627",
"requestId": "DH-10025",
"status": "COMPLETED",
"paymentStatus": "PAID",
"keyStatus": "delivered",
"total": 108000,
"createdAt": "2026-11-07T10:57:25.339Z",
"items": [
{
"productId": "2e661c64-52ff-44e0-a60d-051c35fc2957",
"variantId": "008704de-b0a2-4cba-a1fe-16fef8b94a25",
"tool": "Vnhax Gameloop Vip1",
"packageValue": "24h",
"quantity": 2,
"requestedQuantity": 2,
"unitPrice": 54000,
"total": 108000
}
],
"keys": [
{
"id": "0af49b1f-72c7-49ac-ac5f-014edac1d8f7",
"key": "vip-d7kkchp7fcbuuxady5v44f81t93lzla",
"fields": [{ "label": "Key kích hoạt", "value": "vip-d7kkchp7fcbuuxady5v44f81t93lzla" }],
"tool": "Vnhax Gameloop Vip1",
"packageName": "1 ngày (24h)",
"variantId": "008704de-b0a2-4cba-a1fe-16fef8b94a25",
"status": "active",
"revokeReason": null,
"soldAt": "2026-11-07T10:57:25.458Z",
"expiresAt": null,
"warrantyUntil": "2026-11-08T10:57:25.458Z"
},
{ "id": "…", "key": "vip-…", "...": "…" }
],
"duplicate": false
}Trường của đơn
| Trường | Kiểu | Mô tả |
|---|---|---|
| code | string | Mã đơn trên 113HAX.COM — dùng để tra lại bằng GET /orders/{code} và khi liên hệ hỗ trợ. |
| requestId | string | null | requestId bạn đã gửi. |
| status | string | Trạng thái đơn: COMPLETED (xong), CONFIRMED / PENDING (đang xử lý), CANCELLED, REFUNDED. |
| paymentStatus | string | PAID = đã trừ ví; REFUNDED / PARTIALLY_REFUNDED = đã hoàn tiền (toàn bộ / một phần) về ví. |
| keyStatus | string | delivered = đã giao đủ key; partial = mới giao một phần; pending = chưa giao. Khác delivered → gọi lại GET /orders/{code} sau vài giây. |
| total | number | Tổng tiền đã trừ ví. |
| items[].quantity | number | Số key thực mua (và tính tiền). |
| items[].requestedQuantity | number | Số key bạn đặt. Lớn hơn quantity khi kho không đủ và allowPartial = true. |
| items[].unitPrice | number | Đơn giá thực trả cho 1 key. |
| duplicate | boolean | true = đơn đã tạo từ trước với cùng requestId (không trừ tiền lần này). |
Trường của key (keys[])
| Trường | Kiểu | Mô tả |
|---|---|---|
| key | string | Nội dung key để giao cho khách của bạn. |
| fields | array | Key nhiều phần (vd tài khoản + mật khẩu) đã tách sẵn: [{ label, value }]. Key thường chỉ có một phần. |
| tool / packageName | string | Tên tool / tên gói của key. |
| status | "active" | "revoked" | revoked = key bị thu hồi (lỗi / đổi key), key rỗng, lý do ở revokeReason. |
| soldAt | string | Thời điểm giao key. |
| expiresAt | string | null | Hạn dùng của key nếu admin có ghi. |
| warrantyUntil | string | null | Hạn bảo hành (báo lỗi key ở trang Tài khoản › Key đã mua trước thời điểm này). |
Chi tiết đơn & lấy lại key
GEThttps://113hax.com/api/client/orders/{code}
Trả đơn kèm toàn bộ key, cùng cấu trúc với phản hồi của POST /orders (không có trường duplicate). Dùng khi keyStatus chưa là delivered, hoặc muốn lấy lại key của đơn cũ. Đơn không phải của bạn → 404 ORDER_NOT_FOUND.
curl "https://113hax.com/api/client/orders/HX26110769627" \
-H "X-API-Key: hx_KEY_CUA_BAN"Lịch sử đơn mua key
GEThttps://113hax.com/api/client/orders?page=1&limit=20
Danh sách đơn mua key của tài khoản (cả đơn mua trên web), mới nhất trước. Không kèm key — lấy key bằng API chi tiết đơn.
| Tham số (query) | Kiểu | Mô tả |
|---|---|---|
| page | integer | Trang, mặc định 1. |
| limit | integer | Số đơn mỗi trang, 1 – 100, mặc định 20. |
| from | ISO datetime | Chỉ lấy đơn tạo từ thời điểm này, vd 2026-11-01T00:00:00+07:00. |
| to | ISO datetime | Chỉ lấy đơn tạo trước thời điểm này. |
curl "https://113hax.com/api/client/orders?page=1&limit=20" \
-H "X-API-Key: hx_KEY_CUA_BAN"Phản hồi 200
{
"data": [
{
"code": "HX26110769627",
"requestId": "DH-10025",
"status": "COMPLETED",
"paymentStatus": "PAID",
"keyStatus": "delivered",
"total": 108000,
"createdAt": "2026-11-07T10:57:25.339Z",
"items": [ { "variantId": "…", "tool": "…", "packageValue": "24h", "quantity": 2, "requestedQuantity": 2, "unitPrice": 54000, "total": 108000 } ]
}
],
"meta": { "page": 1, "limit": 20, "total": 37, "totalPages": 2 }
}Mã lỗi
Lỗi nghiệp vụ trả JSON có code (mã cố định để code của bạn xử lý) và message (tiếng Việt, có thể hiện cho người dùng):
{
"statusCode": 402,
"code": "INSUFFICIENT_BALANCE",
"message": "Số dư ví không đủ (hiện có 25.000đ)"
}Lỗi dữ liệu gửi lên (thiếu / sai kiểu tham số) trả 400, message là mảng các lỗi và không có code:
{
"statusCode": 400,
"error": "Bad Request",
"message": ["variantId không hợp lệ", "quantity must not be less than 1"]
}| HTTP · code | Bị trừ tiền? | Ý nghĩa & cách xử lý |
|---|---|---|
| 400 | Không | Tham số sai (variantId không phải UUID, quantity ngoài 1–999…). Sửa request. |
| 401 | Không | Thiếu API key, key sai, đã thu hồi hoặc tài khoản bị khoá. |
| 402 · INSUFFICIENT_BALANCE | Không | Số dư ví không đủ. Nạp thêm tiền rồi gọi lại (có thể dùng lại requestId cũ). |
| 403 | Không | Key không có quyền với API này (vd gọi API ngoài /client) hoặc tính năng đang tắt. |
| 404 · PACKAGE_NOT_FOUND | Không | variantId không tồn tại hoặc gói đã ngừng bán → tải lại GET /products. |
| 404 · ORDER_NOT_FOUND | Không | Mã đơn sai hoặc không thuộc tài khoản của bạn. |
| 409 · OUT_OF_STOCK | Không | Gói đã hết key. Chọn gói khác hoặc thử lại sau. |
| 409 · NOT_ENOUGH_STOCK | Không | Kho ít hơn số đặt và bạn gửi allowPartial = false. |
| 409 · PRICE_CHANGED | Không | Giá hiện tại > maxUnitPrice. Tải lại bảng giá, cập nhật giá bán bên bạn. |
| 409 · TOOL_MAINTENANCE | Không | Tool đang bảo trì. |
| 409 · PACKAGE_UNAVAILABLE | Không | Gói không mua được vì lý do khác (xem message), vd chưa đủ số lượng tối thiểu giá đại lý. |
| 4xx · ORDER_FAILED | Không | Không tạo được đơn (xem message). |
| 429 | Không | Gọi quá nhanh. Chờ vài giây rồi thử lại. |
| 5xx | Xem ghi chú | Lỗi máy chủ / mạng. Gọi lại với cùng requestId để biết đơn đã tạo hay chưa — tuyệt đối không đổi requestId. |
Quy trình khuyến nghị cho website bán lại
- Định kỳ (vd 5 phút / lần) gọi
GET /products, lưuvariantId,price,inStock,statusvào hệ thống bạn; đặt giá bán của bạn ≥price. Ẩn gói cóinStock = falsehoặc toolstatus = maintenance. - Khách của bạn thanh toán xong → tạo bản ghi đơn bên bạn, lấy mã đơn đó làm
requestId. - Gọi
POST /ordersvớirequestId,maxUnitPrice= giá bạn đã lưu vàallowPartial: false(nếu bạn không muốn giao thiếu). Đặt timeout ≥ 30 giây. - Nhận
201→ lưucode+ danh sáchkeys[].key, giao cho khách. NếukeyStatus≠delivered→ gọiGET /orders/{code}mỗi 3–5 giây (tối đa vài phút) đến khi đủ key. - Timeout / mất mạng / lỗi 5xx → gọi lại
POST /ordersvới đúng requestId cũ: đơn đã tạo thì API trả lại đơn đó (duplicate: true), chưa tạo thì tạo mới. Nhờ vậy không bao giờ bị trừ tiền hai lần. - Lỗi 4xx có
code→ không trừ tiền, xử lý theo bảng mã lỗi (báo khách, hoàn tiền bên bạn, nạp thêm ví…). - Theo dõi số dư bằng
GET /me, cảnh báo khi số dư thấp để nạp thêm kịp thời.
Code mẫu đầy đủ
Ví dụ hoàn chỉnh: kiểm tra số dư → mua key với requestId + tự gọi lại khi lỗi mạng → chờ đủ key → in key. Thay hx_KEY_CUA_BAN và variantId bằng giá trị của bạn.
<?php
/**
* Ví dụ đầy đủ: mua key qua API và giao cho khách của bạn.
* Lưu file: buy-key.php — chạy: php buy-key.php
*/
const API_BASE = 'https://113hax.com/api/client';
const API_KEY = 'hx_KEY_CUA_BAN'; // nên đọc từ biến môi trường, không ghi thẳng vào code
/** Gọi API, trả [mã HTTP, dữ liệu JSON] */
function callApi(string $method, string $path, ?array $body = null): array {
$ch = curl_init(API_BASE . $path);
$headers = ['X-API-Key: ' . API_KEY, 'Accept: application/json'];
if ($body !== null) {
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
}
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 40,
]);
$raw = curl_exec($ch);
if ($raw === false) throw new RuntimeException('Lỗi mạng: ' . curl_error($ch));
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [$status, json_decode($raw, true)];
}
/** Mua key; gọi lại an toàn với cùng $requestId (không bị trừ tiền 2 lần) */
function buyKey(string $variantId, int $qty, string $requestId, int $maxUnitPrice): array {
for ($try = 1; $try <= 3; $try++) {
try {
[$status, $res] = callApi('POST', '/orders', [
'variantId' => $variantId,
'quantity' => $qty,
'requestId' => $requestId, // mã đơn bên bạn
'maxUnitPrice' => $maxUnitPrice,
'allowPartial' => false,
]);
} catch (RuntimeException $e) {
sleep(2); // timeout / mất mạng -> gọi lại với CÙNG requestId
continue;
}
if ($status === 201) return $res;
throw new RuntimeException(($res['code'] ?? 'HTTP_' . $status) . ': ' . (is_array($res['message']) ? implode('; ', $res['message']) : $res['message']));
}
throw new RuntimeException('Không kết nối được API sau 3 lần thử');
}
// 1) Kiểm tra số dư
[, $me] = callApi('GET', '/me');
echo "Số dư: {$me['balance']}đ\n";
// 2) Mua 2 key gói đã chọn (variantId lấy từ GET /products)
$order = buyKey('008704de-b0a2-4cba-a1fe-16fef8b94a25', 2, 'DH-10025', 54000);
// 3) Key giao chậm (hiếm) -> hỏi lại vài lần
for ($i = 0; $order['keyStatus'] !== 'delivered' && $i < 10; $i++) {
sleep(3);
[, $order] = callApi('GET', '/orders/' . $order['code']);
}
foreach ($order['keys'] as $k) echo $k['packageName'] . ': ' . $k['key'] . "\n";Câu hỏi thường gặp
- Giá qua API có khác giá trên web không?
- Không. API tính giá y như khi bạn mua trên web bằng chính tài khoản đó: giá thường, giá theo cấp bậc thành viên, hoặc giá đại lý (đại lý mua đủ số lượng tối thiểu).
- Có môi trường thử (sandbox) không?
- Không có sandbox riêng. Hãy thử với gói rẻ nhất, số lượng 1, và luôn dùng requestId để không mua trùng khi chạy thử nhiều lần.
- Lỡ gọi trùng thì sao?
- Cùng requestId → chỉ một đơn duy nhất, các lần sau trả lại đơn cũ. Khác requestId → là hai đơn khác nhau và đều bị trừ tiền.
- Key lỗi / không dùng được?
- Báo lỗi key ở Tài khoản › Key đã mua trên website (trong thời hạn bảo hành) hoặc liên hệ hỗ trợ kèm mã đơn (code). Key được đổi sẽ hiện trong GET /orders/{code}.
- Có webhook báo về khi có key không?
- Hiện chưa có webhook. Key thường trả ngay trong phản hồi POST /orders; trường hợp hiếm giao chậm thì hỏi lại GET /orders/{code}.
- Lộ API key phải làm gì?
- Vào Tài khoản › API bấm Thu hồi key đó (ngừng hoạt động ngay), tạo key mới và cập nhật vào hệ thống của bạn.