Bỏ qua tới nội dung

Tài liệu API mua key

Mua key tự động bằng API: kết nối website bán lại, bot Telegram / Zalo hoặc phần mềm của bạn — trừ ví, nhận key ngay.

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. 1 Tạo API key

    Đăng nhập → Tài khoản › API → Tạo API key, sao chép key hx_...

  2. 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. 3 Lấy bảng giá

    GET /products → chọn gói, lưu variantId của gói.

  4. 4 Mua key

    POST /orders với variantId + quantity → nhận key trong keys[].

Địa chỉ gốc (Base URL) của mọi API trong tài liệu này:

Base URL
https://113hax.com/api/client

Xác thực

Gửi API key trong header của mọi request, chọn một trong hai cách:

Header
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.
Bảo mật: ai có API key đều mua được key bằng tiền trong ví của bạn. Chỉ gọi API từ máy chủ của bạn (backend), không nhúng key vào JavaScript chạy trên trình duyệt, app điện thoại hay chia sẻ cho người khác. Lưu key trong biến môi trường / file cấu hình bí mật.

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ặc 201 (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 /orders 60 lần/phút, GET /products 60 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

JSON
{
  "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ườngKiểuMô tả
balancenumberSố dư ví hiện tại (VND).
tierobject | nullCấp bậc thành viên đang hưởng giá ưu đãi (null = giá thường).
isResellerbooleanTà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

JSON
{
  "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ườngKiểuMô tả
idstring (UUID)Mã tool.
name / slugstringTê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).
platformstringNền tảng (giả lập, Android, iOS, PC…) nếu admin có ghi.
resellerMinQtynumberChỉ có với tài khoản đại lý: số key tối thiểu mỗi đơn để được giá đại lý.
packagesarrayDanh sách gói (bảng dưới).

Trường của gói (packages[])

TrườngKiểuMô tả
variantIdstring (UUID)Mã gói — gửi lên khi mua. Không đổi theo thời gian.
valuestringGiá trị gói: 24h, 168h, 720h… (số giờ thuê) hoặc vinh-vien (mua đứt).
namestringTê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.
hoursnumber | nullSố giờ sử dụng của gói thuê (null với gói vĩnh viễn).
listPricenumberGiá niêm yết trên website.
pricenumberGiá bạn trả cho 1 key (đã áp cấp bậc của tài khoản).
resellerPricenumber | nullChỉ 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ý).
inStockbooleanCò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ểuMô tả
variantIdstring, bắt buộcMã gói lấy từ GET /products.
quantityinteger, bắt buộcSố key muốn mua: 1 – 999.
requestIdstring, 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.
maxUnitPricenumber, 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.
allowPartialboolean, mặc định trueKho 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.
Body mẫu
{
  "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

JSON
{
  "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ườngKiểuMô tả
codestringMã đơn trên 113HAX.COM — dùng để tra lại bằng GET /orders/{code} và khi liên hệ hỗ trợ.
requestIdstring | nullrequestId bạn đã gửi.
statusstringTrạng thái đơn: COMPLETED (xong), CONFIRMED / PENDING (đang xử lý), CANCELLED, REFUNDED.
paymentStatusstringPAID = đã trừ ví; REFUNDED / PARTIALLY_REFUNDED = đã hoàn tiền (toàn bộ / một phần) về ví.
keyStatusstringdelivered = đã 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.
totalnumberTổng tiền đã trừ ví.
items[].quantitynumberSố key thực mua (và tính tiền).
items[].requestedQuantitynumberSố key bạn đặt. Lớn hơn quantity khi kho không đủ và allowPartial = true.
items[].unitPricenumberĐơn giá thực trả cho 1 key.
duplicatebooleantrue = đơ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ườngKiểuMô tả
keystringNội dung key để giao cho khách của bạn.
fieldsarrayKey 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 / packageNamestringTê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.
soldAtstringThời điểm giao key.
expiresAtstring | nullHạn dùng của key nếu admin có ghi.
warrantyUntilstring | nullHạ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).
Key đã mua cũng xem được trên website ở Tài khoản › Key đã mua, và đơn qua API hiện trong lịch sử đơn như đơn mua trên web.

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ểuMô tả
pageintegerTrang, mặc định 1.
limitintegerSố đơn mỗi trang, 1 – 100, mặc định 20.
fromISO datetimeChỉ lấy đơn tạo từ thời điểm này, vd 2026-11-01T00:00:00+07:00.
toISO datetimeChỉ 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

JSON
{
  "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):

JSON
{
  "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:

JSON
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": ["variantId không hợp lệ", "quantity must not be less than 1"]
}
HTTP · codeBị trừ tiền?Ý nghĩa & cách xử lý
400KhôngTham số sai (variantId không phải UUID, quantity ngoài 1–999…). Sửa request.
401KhôngThiếu API key, key sai, đã thu hồi hoặc tài khoản bị khoá.
402 · INSUFFICIENT_BALANCEKhôngSố dư ví không đủ. Nạp thêm tiền rồi gọi lại (có thể dùng lại requestId cũ).
403KhôngKey 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_FOUNDKhôngvariantId không tồn tại hoặc gói đã ngừng bán → tải lại GET /products.
404 · ORDER_NOT_FOUNDKhôngMã đơn sai hoặc không thuộc tài khoản của bạn.
409 · OUT_OF_STOCKKhôngGói đã hết key. Chọn gói khác hoặc thử lại sau.
409 · NOT_ENOUGH_STOCKKhôngKho ít hơn số đặt và bạn gửi allowPartial = false.
409 · PRICE_CHANGEDKhôngGiá 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_MAINTENANCEKhôngTool đang bảo trì.
409 · PACKAGE_UNAVAILABLEKhôngGó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_FAILEDKhôngKhông tạo được đơn (xem message).
429KhôngGọi quá nhanh. Chờ vài giây rồi thử lại.
5xxXem 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

  1. Định kỳ (vd 5 phút / lần) gọi GET /products, lưu variantId, price, inStock, status vào hệ thống bạn; đặt giá bán của bạn ≥ price. Ẩn gói có inStock = false hoặc tool status = maintenance.
  2. 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.
  3. Gọi POST /orders với requestId, 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.
  4. Nhận 201 → lưu code + danh sách keys[].key, giao cho khách. Nếu keyStatus ≠ delivered → gọi GET /orders/{code} mỗi 3–5 giây (tối đa vài phút) đến khi đủ key.
  5. Timeout / mất mạng / lỗi 5xx → gọi lại POST /orders vớ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.
  6. 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í…).
  7. 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.