POST /apiv2/order5m
Tạo đơn thuê Energy trong 5 phút thông qua các pool Energy nội bộ của Netts.
URL của Endpoint
POST https://netts.io/apiv2/order5mHeaders của yêu cầu
| Header | Bắt buộc | Mô tả |
|---|---|---|
| Content-Type | Có | application/json |
| X-API-KEY | Có | API key của bạn từ bảng điều khiển Netts |
| X-Real-IP | Có | Địa chỉ IP từ danh sách trắng của bạn |
Body của yêu cầu
{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}Tham số yêu cầu
| Tham số | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| amount | integer | Có | Số lượng Energy cần thuê (tối thiểu: 61.000, tối đa: 650.000) |
| receiveAddress | string | Có | Địa chỉ TRON sẽ nhận Energy (định dạng TRC-20) |
Giới hạn Energy
Endpoint 5 phút chấp nhận số lượng Energy từ 61.000 đến 650.000 đơn vị cho mỗi đơn hàng. Các yêu cầu ngoài phạm vi này sẽ bị từ chối với lỗi HTTP 400.
Thông tin nhà cung cấp
Các đơn hàng Energy 5 phút được xử lý độc quyền thông qua các pool Energy nội bộ của Netts. Không giống như endpoint 1 giờ, nhà cung cấp bên ngoài không được sử dụng.
Tính khả dụng & Chiến lược thử lại
Vì việc ủy quyền chỉ đến từ các pool nội bộ, tình trạng tạm thời không khả dụng có thể xảy ra trong các khoảng thời gian nhu cầu cao. Nếu bạn nhận được lỗi 503, hãy thử lại yêu cầu sau một khoảng thời gian ngắn hoặc chuyển sang dùng endpoint 1 giờ vốn có quyền truy cập vào nhiều nhà cung cấp bên ngoài.
Ví dụ
cURL
curl -X POST https://netts.io/apiv2/order5m \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip" \
-d '{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}'Python
import requests
url = "https://netts.io/apiv2/order5m"
headers = {
"Content-Type": "application/json",
"X-API-KEY": "your_api_key",
"X-Real-IP": "your_whitelisted_ip"
}
payload = {
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
if response.status_code == 200:
detail = data.get('detail', {})
order_data = detail.get('data', {})
print(f"Order ID: {order_data.get('orderId')}")
print(f"Transaction Hash: {order_data.get('hash')}")
print(f"Energy Delivered: {order_data.get('energy')}")
print(f"Cost: {order_data.get('paidTRX')} TRX")
print(f"Delegate Address: {order_data.get('delegateAddress')}")
elif response.status_code == 503:
# Pool temporarily unavailable - retry or fallback to 1h
print("Pool busy, retrying in 2 seconds...")
else:
error_detail = data.get('detail', data)
print(f"Error Code: {error_detail.get('code', 'N/A')}")
print(f"Error Message: {error_detail.get('msg', error_detail)}")Phản hồi
Phản hồi thành công (200 OK)
{
"detail": {
"code": 10000,
"msg": "Successful, 1.430 TRX deducted",
"data": {
"orderId": "5Mb4ee11ef86",
"paidTRX": 1.43,
"hash": "3636f97dde244fca17cdc0b2cf7fd1572a9b4c6d8e0f1a3b5c7d9e1f3a5b7c9d",
"delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq",
"energy": 65050
}
}
}Thành công kèm kích hoạt địa chỉ (200 OK)
Khi địa chỉ người nhận chưa được kích hoạt trên mạng lưới TRON, Netts sẽ tự động kích hoạt. Chi phí kích hoạt được cộng vào tổng số tiền:
{
"detail": {
"code": 10000,
"msg": "Successful, 1.430 TRX for energy + 1.100 TRX for address activation",
"data": {
"orderId": "5Mb4ee11ef86",
"paidTRX": 2.53,
"hash": "3636f97dde244fca17cdc0b2cf7fd1572a9b4c6d8e0f1a3b5c7d9e1f3a5b7c9d",
"delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq",
"energy": 65050,
"activationHash": "bab38070a64b237acc9110ecf5135acc4d6e8f0a2b4c6d8e0f2a4b6c8d0e2f4a"
}
}
}Các trường phản hồi
| Trường | Loại | Mô tả |
|---|---|---|
| detail.code | integer | Luôn là 10000 cho các đơn hàng thành công |
| detail.msg | string | Thông báo thành công kèm số tiền bị trừ |
| detail.data.orderId | string | ID đơn hàng hợp nhất (định dạng: 5M{id}) |
| detail.data.paidTRX | number | Tổng chi phí bằng TRX (bao gồm phí kích hoạt nếu có) |
| detail.data.hash | string | Hash giao dịch ủy quyền |
| detail.data.delegateAddress | string | Địa chỉ pool đã ủy quyền Energy |
| detail.data.energy | integer | Số lượng Energy + phần đệm (thường là +50) |
| detail.data.activationHash | string | Chỉ xuất hiện nếu việc kích hoạt địa chỉ được thực hiện |
Phản hồi lỗi
Số lượng Energy không hợp lệ (400)
{
"code": 1003,
"msg": "Energy amount must be between 61000 and 650000. Requested: 50000"
}Lỗi xác thực (401)
{
"detail": "Invalid API key or IP not in whitelist"
}Số dư không đủ (403)
{
"code": 1004,
"msg": "Insufficient funds. Required: 1.43 TRX, Available: 0.50 TRX"
}Dịch vụ không khả dụng (503)
{
"code": 5003,
"msg": "Service temporarily unavailable. Energy delegation failed after retries."
}Xử lý lỗi 503
Phản hồi 503 có nghĩa là các pool nội bộ tạm thời đạt công suất tối đa. Chiến lược đề xuất:
- Đợi 2-3 giây và thử lại đơn hàng 5 phút
- Nếu vẫn không khả dụng, hãy chuyển sang dùng endpoint 1 giờ vốn sử dụng nhiều nhà cung cấp
Lỗi máy chủ nội bộ (500)
{
"code": 5000,
"msg": "Internal server error occurred"
}Tra cứu mã lỗi
| Mã | Mô tả | Trạng thái HTTP |
|---|---|---|
10000 | Thành công | 200 |
10000 | Thành công (phản hồi được lưu trong bộ nhớ đệm) | 208 |
- | Yêu cầu trùng lặp vẫn đang được xử lý | 409 |
1003 | Số lượng Energy nằm ngoài phạm vi | 400 |
1004 | Số dư không đủ | 403 |
1005 | Địa chỉ thanh toán của người dùng chưa được cấu hình | 400 |
5000 | Lỗi máy chủ nội bộ | 500 |
5003 | Dịch vụ Energy không khả dụng | 503 |
Giới hạn tốc độ
Các giới hạn tốc độ sau đây áp dụng cho endpoint này (trên mỗi địa chỉ IP):
| Khoảng thời gian | Giới hạn | Mô tả |
|---|---|---|
| 1 giây | 50 yêu cầu | Tối đa 50 yêu cầu mỗi giây |
Các Header giới hạn tốc độ
RateLimit-Limit: 50
RateLimit-Remaining: 49
RateLimit-Reset: 1
X-RateLimit-Limit-Second: 50
X-RateLimit-Remaining-Second: 49Vượt quá giới hạn tốc độ (429)
{
"message": "API rate limit exceeded"
}Tính bình đẳng (Idempotency)
API hỗ trợ tính bình đẳng để ngăn chặn việc xử lý đơn hàng trùng lặp. Khi bạn gửi nhiều yêu cầu giống hệt nhau, hệ thống đảm bảo đơn hàng chỉ được xử lý một lần duy nhất.
Cơ chế hoạt động của tính bình đẳng
Tính duy nhất của yêu cầu được xác định bởi sự kết hợp của:
- Dấu thời gian yêu cầu (khung thời gian 2 giây)
- Số lượng Energy
- Địa chỉ người nhận
- API key
Mỗi yêu cầu được cấp một khung thời gian duy nhất 2 giây. Các yêu cầu có thông số giống hệt nhau trong khung thời gian này được coi là trùng lặp.
Cung cấp khóa của riêng bạn
Bạn có thể chủ động kiểm soát tính bình đẳng bằng cách gửi header X-Idempotency-Key. Khi header này xuất hiện, giá trị đó sẽ là yếu tố duy nhất quyết định liệu một yêu cầu có phải là lặp lại hay không, và việc kết hợp tự động ở trên sẽ không được sử dụng. Khi vắng mặt header này, mọi thứ giữ nguyên — máy chủ sẽ tự tạo khóa cho bạn.
Các quy tắc tương tự như trên /apiv2/order1h:
| Header | X-Idempotency-Key |
| Định dạng | Chính xác 64 ký tự thập lục phân viết thường — một chuỗi băm SHA-256 |
| Thời hạn | 24 giờ kể từ yêu cầu đầu tiên mang khóa đó |
| Phạm vi | Tài khoản của bạn. Cùng một giá trị được gửi bởi một tài khoản khác sẽ không bao giờ trả về kết quả của bạn |
Khóa có bất kỳ định dạng nào khác — một UUID có dấu gạch ngang, base64, hex viết hoa — đều bị từ chối với mã 400 trước khi đơn hàng được tạo và trước khi bị tính phí:
{
"detail": "Invalid idempotency key format. Must be 64-character hexadecimal string."
}Hãy tạo khóa bắt nguồn từ API key của bạn để đảm bảo tính duy nhất cho tài khoản và có thể tái tạo khi thử lại — ví dụ chi tiết có trên trang 1 giờ. Bao gồm cả thời gian thuê vào thông điệp bạn băm: thuê cùng một địa chỉ trong 5 phút và trong 1 giờ là các đơn hàng khác nhau, và việc dùng lại một khóa cho cả hai sẽ trả về phản hồi của đơn hàng đầu tiên cho yêu cầu thứ hai.
Đặt hai đơn hàng giống hệt nhau
Cùng một cạm bẫy như trên endpoint theo giờ, với một khung thời gian rộng hơn. Hai đơn hàng giống hệt nhau — cùng một số lượng đến cùng một địa chỉ — không thể phân biệt được với một lần thử lại, và chỉ có thời điểm đến mới tách biệt chúng.
Nếu không có khóa của riêng bạn:
| Khoảng cách giữa hai yêu cầu | Điều gì xảy ra |
|---|---|
| Trong cùng khung thời gian 2 giây | Yêu cầu thứ hai được coi là lặp lại. Nó không được thực thi: bạn nhận được mã 208 và phản hồi của đơn hàng đầu tiên. Không có khoản phí nào bị trừ cho yêu cầu này |
| Cách nhau hơn hai giây | Hai khóa khác nhau — cả hai đơn hàng đều được tạo và cả hai đều bị tính phí |
Vì vậy hãy để cách nhau hơn hai giây giữa hai đơn hàng giống hệt nhau, và đọc mã trạng thái: 208 có nghĩa là đơn hàng bạn vừa gửi đã không được tạo.
Tạm dừng chỉ là giải pháp tạm thời, không phải là cách khắc phục triệt để — nó cũng tách biệt các yêu cầu mà bạn chưa bao giờ có ý định lặp lại, chẳng hạn như lần thử lại sau khi hết thời gian chờ hoặc một tin nhắn được gửi lại bởi hàng đợi của bạn, và mỗi yêu cầu đó sẽ trở thành một đơn hàng riêng biệt với một khoản phí riêng biệt. Việc gửi khóa của riêng bạn mới thực sự giải quyết dứt điểm vấn đề: một nonce mới cho một đơn hàng mới, nonce của lần thử đầu tiên cho một lần thử lại. Lập luận đầy đủ có trên trang 1 giờ.
Mã trạng thái HTTP cho các yêu cầu trùng lặp
| Mã trạng thái | Tên | Mô tả |
|---|---|---|
| 200 | OK | Đơn hàng được xử lý thành công (yêu cầu đầu tiên) |
| 208 | Already Reported | Đơn hàng đã được xử lý, trả về phản hồi được lưu trong bộ nhớ đệm |
| 409 | Conflict | Yêu cầu hiện đang được xử lý, không thử lại |
Yêu cầu trùng lặp - Đã được xử lý (208)
{
"detail": {
"code": 10000,
"msg": "Successful, 1.430 TRX deducted",
"data": {
"hash": "3636f97dde244fca17cdc0b2cf7fd1572a9b4c6d8e0f1a3b5c7d9e1f3a5b7c9d",
"energy": 65050,
"orderId": "5Mb4ee11ef86",
"paidTRX": 1.43,
"delegateAddress": "TNp5gsJhBmZFXgCdgjMgr8pEZ8fHgXUHDq"
}
},
"idempotency": {
"status": "completed",
"cached": true,
"original_created_at": "2026-03-21T08:53:52.498000"
}
}Yêu cầu trùng lặp - Đang xử lý (409)
{
"success": false,
"error": "duplicate_request_processing",
"message": "This request is currently being processed. Please wait and do not retry.",
"retry_after_seconds": 3
}Thực hành tốt nhất
- Không gửi các yêu cầu song song với các tham số giống nhau - hãy đợi từng phản hồi
- Xử lý phản hồi 409 bằng cách chờ đợi, không thử lại ngay lập tức
- Kiểm tra trường
idempotency.cachedđể nhận diện các phản hồi được lưu trong bộ nhớ đệm
So sánh: Đơn hàng 5 phút với 1 giờ
| Tính năng | Đơn hàng 5 phút | Đơn hàng 1 giờ |
|---|---|---|
| Endpoint | /apiv2/order5m | /apiv2/order1h |
| Thời hạn | 5 phút | 1 giờ |
| Phạm vi Energy | 61.000 - 650.000 | 61.000 - 3.000.000 |
| Nhà cung cấp | Chỉ các pool nội bộ của Netts | Các pool nội bộ + nhà cung cấp bên ngoài |
| Giá | Thấp hơn (giá 5 phút) | Giá tiêu chuẩn theo giờ |
| Tính khả dụng | Có thể bị hạn chế trong giờ cao điểm | Cao (có nhiều nhà cung cấp dự phòng) |
| Tốt nhất cho | Giao dịch nhỏ thường xuyên | Giao dịch lớn hoặc giao hàng đảm bảo |
Tài khoản trả sau
Các tài khoản sử dụng thanh toán trả sau dùng cùng endpoint, URL, headers và request body như những người khác. Sự khác biệt là cách thức thanh toán cho đơn hàng:
- Không có khoản nào bị trừ từ tiền gửi của bạn. Mỗi đơn hàng thành công được thêm vào số dư nợ tài khoản của bạn theo loại tiền thanh toán được thỏa thuận trong hợp đồng của bạn. Bạn thanh toán qua hóa đơn, theo thỏa thuận của bạn.
- Tài khoản của bạn có một hạn mức tín dụng. Trong khi số tiền đến hạn vẫn nằm trong hạn mức, các đơn hàng vẫn được chấp nhận ngay cả khi số tiền gửi bằng 0.
- Chỉ các dịch vụ đã được bàn giao mới được thanh toán. Một đơn hàng bị từ chối hoặc không được thực hiện sẽ không tốn chi phí.
- Nếu địa chỉ nhận phải được kích hoạt, việc kích hoạt là một phần của cùng một đơn hàng và được lập hóa đơn dưới dạng một khoản phí riêng biệt.
Thanh toán trả sau được Netts kích hoạt cho tài khoản theo yêu cầu. Mỗi phản hồi sẽ cho bạn biết đơn hàng được thanh toán như thế nào: paymentMode là postpaid hoặc prepaid.
Các trường yêu cầu bổ sung
| Tham số | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| test | boolean | Không | true — chỉ tính giá. Không có gì được đặt hàng, bàn giao hoặc tính phí |
| freezePrice | boolean | Không | true — cố định giá theo hợp đồng của bạn trong 60 giây. Không có gì được đặt hàng hoặc tính phí |
| quoteId | string | Không | Đặt hàng theo giá của một báo giá được tạo bởi freezePrice |
| priceCurrency | string | Không | TRX (mặc định) hoặc loại tiền tệ trong hợp đồng của bạn, như trong settlement.asset. Đối với các tài khoản trả sau, các số tiền theo loại tiền tệ hợp đồng của bạn luôn được bao gồm |
quoteId không thể kết hợp với test hoặc freezePrice. Bất kỳ trường nào khác trong request body đều bị từ chối.
Kiểm tra giá (test: true)
{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"test": true
}{
"detail": {
"code": 10010,
"msg": "Test calculation",
"data": {
"amount": 65000,
"unitPriceSun": "19",
"discount": null,
"energyTRX": "1.235000",
"activationTRX": "1.100000",
"wouldCostTRX": "2.335000",
"paidTRX": 0,
"paymentMode": "postpaid",
"activationCheck": "inactive",
"alt": {"USDC": {"energy": "0.409088", "activation": "0.364370", "total": "0.773458"}},
"fxAt": "2026-10-19T07:16:12.548894+00:00"
}
}
}| Trường | Mô tả |
|---|---|
| unitPriceSun | Giá cho mỗi đơn vị Energy tính bằng SUN, bao gồm giảm giá cá nhân nếu bạn có |
| discount | Giảm giá cá nhân của bạn (type, value) hoặc null |
| energyTRX / activationTRX / wouldCostTRX | Energy, kích hoạt (nếu địa chỉ cần) và tổng cộng, tính bằng TRX |
| activationCheck | inactive — địa chỉ sẽ được kích hoạt và tính phí; active — không cần kích hoạt; unknown — hiện tại không thể kiểm tra |
alt.<currency> | Cùng số tiền bằng đơn vị tiền tệ trong hợp đồng của bạn |
| fxAt | Thời điểm của tỷ giá hối đoái được áp dụng cho các số tiền bằng đơn vị tiền tệ hợp đồng của bạn |
Báo giá cố định giá (freezePrice: true)
Sử dụng báo giá để cố định giá theo hợp đồng của bạn trước khi bạn đặt hàng.
- Gửi đơn hàng với
"freezePrice": true. Phản hồi có mã10011(Quote issued), các trường giống như kiểm tra giá, cộng thêmquoteIdvàexpiresAt. - Trong vòng 60 giây gửi đơn hàng với
"quoteId": "<quoteId>"cùng vớiamountvàreceiveAddressgiống hệt nhau. - Đơn hàng được thanh toán theo giá được báo — mức giá theo hợp đồng của bạn tại thời điểm báo giá — ngay cả khi giá thay đổi trong khoảng thời gian đó.
Một báo giá chỉ có thể được sử dụng một lần và chỉ cho cùng một sản phẩm: một báo giá 5 phút không thể dùng để thanh toán cho đơn hàng 1 giờ. Báo giá đã hết hạn hoặc đã sử dụng sẽ bị từ chối và không có gì được đặt hàng.
{
"amount": 65000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"quoteId": "q_4f540f16a2c94b7f8e3d1a6b5c0e9d72"
}Đơn hàng thành công
{
"detail": {
"code": 10000,
"msg": "Successful, 1.24 TRX service cost, postpaid",
"data": {
"orderId": "5M5f557d2fba",
"paidTRX": 1.235,
"hash": "c1fafd8ef7fb6b7fb8a729120756b26e611f401275cb4f7a04fe2bafd75b13da",
"delegateAddress": "TR3qZsdmkFcvP729Md3PwXzktFQkMoUzjg",
"energy": 65000,
"paymentMode": "postpaid",
"energyTRX": "1.235000",
"activationTRX": "0.000000",
"totalTRX": "1.235000"
}
}
}| Trường | Mô tả |
|---|---|
| paidTRX | Chi phí của dịch vụ bằng TRX. Đối với các tài khoản trả sau số tiền này không bị trừ từ tiền gửi |
| paymentMode | postpaid |
| energyTRX / activationTRX / totalTRX | Số tiền chính xác, 6 chữ số thập phân |
| quoteId, alt | Xuất hiện khi đơn hàng được đặt kèm báo giá: ID báo giá và các số tiền được báo |
Tất cả các trường khác đều giống như các đơn hàng trả trước.
Đạt hạn mức tín dụng (402)
{
"detail": {
"code": 1004,
"msg": "Postpaid credit limit reached.",
"paymentMode": "postpaid",
"reason": "limit_reached"
}
}Đơn hàng không được thực thi và không có khoản nào bị tính phí. Các đơn hàng mới sẽ được chấp nhận trở lại khi thanh toán của bạn được ghi nhận hoặc hạn mức của bạn được tăng lên.
Mã lỗi trả sau
| Mã | HTTP | Mô tả |
|---|---|---|
10010 | 200 | Kết quả kiểm tra giá (test) |
10011 | 200 | Báo giá đã được tạo (freezePrice) |
1004 | 402 | Đạt hạn mức tín dụng trả sau |
4100 | 400 | Yêu cầu không hợp lệ |
4101 | 400 | Không hỗ trợ priceCurrency |
4102 | 400 | quoteId được kết hợp với test hoặc freezePrice |
4103 | 409 | Báo giá đã được sử dụng |
4104 | 409 | Báo giá đã hết hạn |
4105 | 409 | Khóa idempotency đã được dùng cho một yêu cầu khác |
4106 | 404 | Không tìm thấy báo giá |
4107 | 409 | Các thông số đơn hàng khác với báo giá |
4108 | 400 | Định dạng quoteId không hợp lệ |
4109 | 422 | Không khả dụng cho tài khoản phụ |
5032 | 503 | Giá tạm thời không khả dụng |
5033 | 503 | Tỷ giá hối đoái tạm thời không khả dụng |
5034 | 503 | Hệ thống thanh toán tạm thời không khả dụng — đơn hàng không được chấp nhận |
5036 | 503 | Kiểm tra tín dụng tạm thời không khả dụng — hãy thử lại sau |
Đối với tất cả các phản hồi 4xx và 503 ở trên, không có gì được đặt hàng và không có gì bị tính phí.
Ghi chú
- Energy được bàn giao ngay lập tức khi đặt hàng thành công (thường trong vòng 0,5-2 giây)
- Thời gian chờ phản hồi API: Tối đa 10 giây (bao gồm cả các lần thử lại nội bộ)
- Kích hoạt địa chỉ: Nếu địa chỉ người nhận chưa được kích hoạt, Netts sẽ kích hoạt theo giá gốc. Chi phí kích hoạt chỉ được tính một lần cho mỗi địa chỉ
- Thời hạn: Cố định 5 phút (300 giây)
- Số lượng Energy tối thiểu: 61.000 đơn vị
- Số lượng Energy tối đa: 650.000 đơn vị mỗi đơn hàng
- Đệm Energy: Tự động cộng thêm +50 đơn vị (miễn phí)
- Định dạng ID đơn hàng:
5M{id}để theo dõi hợp nhất - Định giá: Năng động dựa trên thời gian trong ngày thông qua Pricing API
- Giới hạn tốc độ: 50 yêu cầu mỗi giây trên mỗi địa chỉ IP
- Chỉ dùng pool nội bộ: Nếu các pool đạt công suất tối đa, hãy thử lại sau một khoảng thời gian ngắn hoặc sử dụng endpoint 1 giờ để dự phòng