API chính thức do GenzShop phát hành, dành cho đối tác bán sản phẩm tự động trên website, ứng dụng hoặc bot của mình.
GET /products.php.GET /balance.php.POST /purchase.php.deliveredAccounts để giao cho khách..php (ví dụ /products.php). Gọi thiếu .php sẽ trả về trang HTML 404 chứ không phải JSON.HTTPS_REQUIRED).replay: true, không trừ tiền lần hai.OUT_OF_STOCK.errorCode để biết cách xử lý.Base URL:
https://genzshop.vn/api/partner/v1
Mọi request phải kèm header xác thực (khuyến nghị dùng X-API-Key):
X-API-Key: YOUR_API_KEY
Hoặc dùng chuẩn Bearer (tương đương):
Authorization: Bearer YOUR_API_KEY
/products.php
Lấy danh sách sản phẩm đang mở bán, kèm giá đại lý và tồn kho.
curl "https://genzshop.vn/api/partner/v1/products.php" \ -H "X-API-Key: YOUR_API_KEY"
Phản hồi (rút gọn):
{
"success": true,
"walletCurrency": "VND",
"products": [
{
"product_id": "CUR-0001",
"name": "Cursor Pro 1 tháng",
"description": "Tài khoản Cursor Pro dùng 1 tháng",
"type": "cursor",
"walletCurrency": "VND",
"walletPricing": 120000,
"walletPricingText": "120.000 VND",
"available": 38
}
]
}
Dùng product_id (chính là SKU) để mua. Nếu sản phẩm tạm hết hàng, lệnh mua sẽ trả về lỗi OUT_OF_STOCK.
/balance.php
Xem số dư ví hiện tại của tài khoản gắn với API key.
curl "https://genzshop.vn/api/partner/v1/balance.php" \ -H "X-API-Key: YOUR_API_KEY"
{
"success": true,
"walletCurrency": "VND",
"balance": 5000000,
"balanceText": "5.000.000 VND"
}
/purchase.php
Mua hàng và nhận tài khoản ngay. Trừ số dư ví, trả về tài khoản trong deliveredAccounts.
curl -X POST "https://genzshop.vn/api/partner/v1/purchase.php" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_id": "CUR-0001",
"quantity": 1,
"idempotency_key": "don-khach-0001"
}'
Tham số body:
| Tham số | Kiểu | Mô tả |
|---|---|---|
product_id | string | SKU sản phẩm, ví dụ CUR-0001 (bắt buộc) |
quantity | integer | Số lượng 1..1000 (bắt buộc) |
idempotency_key | string | 8..128 ký tự [A-Za-z0-9._:-] (bắt buộc) |
customer_email | string | Email khách của bạn để đối soát (tùy chọn) |
Phản hồi thành công:
{
"success": true,
"walletCurrency": "VND",
"orderCode": "GZ260724CUR3F9A2B",
"productType": "cursor",
"quantity": 1,
"amount": 120000,
"amountText": "120.000 VND",
"balance": 4880000,
"balanceText": "4.880.000 VND",
"deliveredAccounts": [
{
"productItemId": "1024",
"user": "acc@example.com",
"password": "example-password",
"verifyEmail": "mail-phu@example.com"
}
]
}
Nếu gửi lại cùng idempotency_key đã dùng, phản hồi giữ nguyên đơn cũ và có thêm "replay": true — không trừ tiền lần nữa.
Mọi lỗi đều trả JSON theo dạng cố định (HTTP status ≥ 400):
{
"success": false,
"errorCode": "INSUFFICIENT_BALANCE",
"detail": "Số dư ví không đủ. Cần 120.000 VND, số dư hiện tại 50.000 VND."
}
| HTTP | errorCode | Ý nghĩa |
|---|---|---|
| 400 | INVALID_BODY | Body không phải JSON hợp lệ |
| 401 | MISSING_API_KEY | Thiếu header X-API-Key (hoặc Authorization: Bearer) |
| 401 | INVALID_API_KEY | Key sai hoặc đã bị thu hồi |
| 402 | INSUFFICIENT_BALANCE | Số dư ví không đủ |
| 403 | HTTPS_REQUIRED | Gọi qua HTTP ở production — phải dùng HTTPS |
| 403 | IP_NOT_ALLOWED | IP không nằm trong allowlist của key |
| 404 | PRODUCT_NOT_FOUND | Không tìm thấy sản phẩm |
| 405 | METHOD_NOT_ALLOWED | Sai HTTP method cho endpoint |
| 409 | PRODUCT_INACTIVE | Sản phẩm hiện không mở bán |
| 409 | OUT_OF_STOCK | Không đủ hàng trong kho |
| 422 | INVALID_PRODUCT_ID | Thiếu hoặc sai định dạng product_id |
| 422 | INVALID_QUANTITY | Số lượng ngoài khoảng 1..1000 |
| 422 | INVALID_IDEMPOTENCY_KEY | idempotency_key sai định dạng |
| 422 | INVALID_CUSTOMER_EMAIL | customer_email không hợp lệ |
| 429 | RATE_LIMITED | Gọi quá nhanh (theo IP hoặc theo key), thử lại sau |
| 500 | INTERNAL_ERROR | Lỗi hệ thống, không trừ tiền |
Khi bị RATE_LIMITED theo giới hạn của key, phản hồi kèm header Retry-After, X-RateLimit-Limit và X-RateLimit-Remaining — chờ đủ số giây trong Retry-After rồi gọi lại.