GET /apiv2/pricing
เอนด์พอยต์แสดงราคาแบบครอบคลุมทั้งหมด ซึ่งจะส่งคืนราคาบริการทั้งหมดภายในการตอบกลับครั้งเดียวพร้อมช่วงเวลาแบบไดนามิก
ราคาอาจมีการเปลี่ยนแปลงระหว่างการดำเนินการคำสั่งซื้อ
ราคาที่ส่งคืนจากเอนด์พอยต์นี้อาจมีการเปลี่ยนแปลงในขณะที่คำสั่งซื้อกำลังได้รับการประมวลผล ผู้ให้บริการ Energy อาจปฏิเสธคำขอการมอบสิทธิ์ ซึ่งในกรณีดังกล่าว Netts จะเปลี่ยนเส้นทางคำสั่งซื้อไปยังผู้ให้บริการรายถัดไปที่พร้อมใช้งานโดยอัตโนมัติ Netts มุ่งมั่นไม่เพียงแค่การเสนอราคาที่คุ้มค่าที่สุดเท่านั้น แต่ยังรวมถึงการรับประกันการจัดหา Energy ที่เชื่อถือได้อีกด้วย — ดังนั้น คำสั่งซื้ออาจได้รับการดำเนินการในราคาที่สูงกว่าราคาที่เสนอไว้ เงื่อนไขนี้มีผลบังคับใช้เฉพาะกับคำสั่งซื้อตั้งแต่ 300,000 หน่วย Energy ขึ้นไปเท่านั้น
แนะนำ
นี่คือเอนด์พอยต์แสดงราคาที่แนะนำ โดยนำมาใช้แทนที่เอนด์พอยต์เดิม /apiv2/prices ซึ่งกำลังจะหยุดให้บริการ
URL ของ Endpoint
GET https://netts.io/apiv2/pricingHeaders ของคำขอ
| Header | Required | Description | Values |
|---|---|---|---|
| X-API-KEY | Yes | คีย์ API ของคุณ | string |
| X-Real-IP | Yes | ที่อยู่ IP จากไวท์ลิสต์ | IP address |
| X-Format | No | รูปแบบการตอบกลับ (ค่าเริ่มต้น: JSON แบบเต็ม) | now, compact, short, short1h, count |
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| services | string | all | ตัวกรองบริการที่ต้องการรวม โดยคั่นด้วยเครื่องหมายจุลภาค |
บริการที่พร้อมใช้งาน
| Service | Description |
|---|---|
energy_1h | ราคาการมอบสิทธิ์ Energy แบบ 1 ชั่วโมง |
energy_5m | ราคาการมอบสิทธิ์ Energy แบบ 5 นาที |
host | อัตราการมอบสิทธิ์ Energy สำหรับ Host |
aml | ราคาการตรวจสอบที่อยู่ AML |
bandwidth | ราคาเช่า Bandwidth — เลือกรับเพิ่มเติม (opt-in): จะถูกส่งคืนเมื่อมีการระบุคำขออย่างชัดเจนผ่าน ?services=bandwidth เท่านั้น (ไม่ได้เป็นส่วนหนึ่งของการตอบกลับเริ่มต้น) |
Examples การส่งคำขอ
cURL — การตอบกลับแบบเต็ม
curl -X GET https://netts.io/apiv2/pricing \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip"cURL — กรองตามบริการ
# ราคา Energy 1h เท่านั้น
curl -X GET "https://netts.io/apiv2/pricing?services=energy_1h" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip"
# Energy 1h + AML
curl -X GET "https://netts.io/apiv2/pricing?services=energy_1h,aml" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip"
# ราคา Host เท่านั้น
curl -X GET "https://netts.io/apiv2/pricing?services=host" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip"
# ราคาเช่า Bandwidth (ต้องเลือกรับเพิ่มเติม — จำเป็นต้องส่งคำขออย่างชัดเจน)
curl -X GET "https://netts.io/apiv2/pricing?services=bandwidth" \
-H "X-API-KEY: your_api_key" \
-H "X-Real-IP: your_whitelisted_ip"Python
import requests
url = "https://netts.io/apiv2/pricing"
headers = {
"X-API-KEY": "your_api_key",
"X-Real-IP": "your_whitelisted_ip"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("success"):
print(f"API version: {data['version']}")
print(f"TRX/USD rate: {data['data']['trx_rate_usd']}")
services = data["data"]["services"]
for svc_name, svc_data in services.items():
pricing_type = svc_data.get("pricing_type")
print(f"\n--- {svc_name} ({pricing_type}) ---")
if pricing_type == "periodic":
for period in svc_data["periods"]:
marker = " <-- current" if period["is_current"] else ""
print(f" {period['label']}: {period['price']} {svc_data['unit']}{marker}")
elif pricing_type == "flat_rates":
for rate, price in svc_data["rates"].items():
print(f" {rate}: {price} {svc_data['unit']}")
elif pricing_type == "provider_based":
for name, info in svc_data["providers"].items():
status = "available" if info["available"] else "unavailable"
print(f" {name}: {info['price']} {svc_data['unit']} - {status}")Python — กรองบริการ
params = {"services": "energy_1h,aml"}
response = requests.get(url, headers=headers, params=params)Response โครงสร้าง
ฟิลด์ระดับบนสุด
| Field | Type | Description |
|---|---|---|
| success | boolean | true สำหรับคำขอที่สำเร็จ |
| version | string | เวอร์ชัน API (เช่น "2.1") |
| timestamp | string | เวลาเซิร์ฟเวอร์ในรูปแบบ ISO 8601 UTC |
| data | object | ข้อมูลเพย์โหลดการตอบกลับ |
ฟิลด์ข้อมูล Data
| Field | Type | Description |
|---|---|---|
| data.trx_rate_usd | number | อัตราแลกเปลี่ยน TRX/USD ปัจจุบัน |
| data.units_meta | object | ข้อมูลการแปลงหน่วยที่ระบบคอมพิวเตอร์สามารถอ่านและประมวลผลได้ |
| data.services | object | ข้อมูลแมปของบริการที่ร้องขอพร้อมข้อมูลราคา |
Units Meta
ช่วยให้ไคลเอนต์สามารถแปลงหน่วยระหว่างกันได้ผ่านโปรแกรม:
{
"units_meta": {
"sun": {"base": "trx", "multiplier": 1000000},
"trx": {"base": "trx", "multiplier": 1},
"usdt": {"base": "usdt", "multiplier": 1}
}
}หากต้องการแปลงจาก SUN เป็น TRX: trx_price = sun_price / units_meta.sun.multiplier
ฟิลด์ทั่วไปของบริการ
ทุกบริการจะมีฟิลด์เหล่านี้:
| Field | Type | Description |
|---|---|---|
| unit | string | หน่วยของราคา (sun, trx, usdt) |
| pricing_type | string | วิธีแยกวิเคราะห์บริการนี้ (ดูด้านล่าง) |
| description | string | คำอธิบายที่มนุษย์สามารถอ่านเข้าใจได้ |
| cache_ttl | integer | ความถี่ในการรีเฟรชข้อมูลนี้ (วินาที) |
ประเภทการกำหนดราคา
ฟิลด์ pricing_type จะระบุให้ไคลเอนต์ทราบถึงวิธีแยกวิเคราะห์ในแต่ละบริการ:
| Type | Structure | Used by |
|---|---|---|
periodic | อาร์เรย์ periods[] พร้อมราคาตามช่วงเวลา | energy_1h, energy_5m |
flat_rates | ออบเจกต์ rates{} พร้อมคีย์ชื่ออัตรา | host |
provider_based | ออบเจกต์ providers{} พร้อมข้อมูลผู้ให้บริการ | aml |
tiered_by_amount_and_period | tiers[] ตามช่วงจำนวน โดยแต่ละระดับจะมี periods[] | bandwidth |
บริการ: energy_1h / energy_5m
pricing_type: periodic
| Field | Type | Description |
|---|---|---|
| current_period | string | สลักของช่วงเวลาที่ใช้งานอยู่ในปัจจุบัน |
| periods[] | array | ช่วงเวลาราคาทั้งหมด (ไดนามิก โหลดมาจาก DB) |
| periods[].id | string | ตัวระบุช่วงเวลาที่ไม่ซ้ำกัน (สลัก) |
| periods[].label | string | ชื่อช่วงเวลาที่มนุษย์สามารถอ่านเข้าใจได้ |
| periods[].start | string | เวลาเริ่มต้นของช่วงเวลา (HH:MM UTC) |
| periods[].end | string | เวลาสิ้นสุดของช่วงเวลา (HH:MM UTC) |
| periods[].is_current | boolean | ระบุว่าช่วงเวลานี้กำลังใช้งานอยู่หรือไม่ |
| periods[].price | integer | ราคาต่อหน่วย Energy ในหน่วย SUN |
| periods[].tiers | array|null | ระดับราคาตามปริมาณ (ดู Tiers) |
ช่วงเวลาแบบไดนามิก
จำนวนของช่วงเวลา ขอบเขตเวลา ป้ายกำกับ และราคานั้นเป็นแบบไดนามิกทั้งหมดและได้รับการจัดการจากฝั่งเซิร์ฟเวอร์ อย่าเขียนโค้ดแบบฮาร์ดโค้ดรหัสหรือจำนวนช่วงเวลา ให้ทำการวนซ้ำ (iterate) ผ่านอาร์เรย์ periods เสมอ
บริการ: host
pricing_type: flat_rates
| Field | Type | Description |
|---|---|---|
| rates.standard_65k | number | อัตรามาตรฐานสำหรับ 65k Energy (TRX) |
| rates.standard_131k_initial | number | อัตรามาตรฐานสำหรับ 131k Energy สำหรับการเปิดใช้งานครั้งแรก (TRX) |
| rates.frequent_65k | number | อัตราใช้งานบ่อยสำหรับ 65k Energy (TRX) |
| rates.frequent_131k | number | อัตราใช้งานบ่อยสำหรับ 131k Energy (TRX) |
บริการ: aml
pricing_type: provider_based
| Field | Type | Description |
|---|---|---|
| providers | object | ข้อมูลแมปของผู้ให้บริการ AML (ไดนามิก อาจมีการเปลี่ยนแปลง) |
| providers[name].price | number | ราคาตรวจสอบในหน่วย USDT |
| providers[name].price_trx | number | ราคาตรวจสอบที่แปลงเป็น TRX ตามอัตราปัจจุบัน |
| providers[name].available | boolean | ระบุว่าผู้ให้บริการมีโควตาที่พร้อมใช้งานหรือไม่ |
ผู้ให้บริการแบบไดนามิก
ผู้ให้บริการ AML จะถูกโหลดมาจากฐานข้อมูล ผู้ให้บริการใหม่อาจปรากฏขึ้นหรือผู้ให้บริการเดิมอาจไม่พร้อมใช้งาน ให้ทำการวนซ้ำ (iterate) ผ่านออบเจกต์ providers เสมอ
บริการ: bandwidth
pricing_type: tiered_by_amount_and_period
การเลือกรับเพิ่มเติมและการเข้าถึง
ราคา Bandwidth จะถูกส่งคืนเฉพาะเมื่อมีการร้องขออย่างชัดเจนผ่าน ?services=bandwidth เท่านั้น — ไม่ได้ เป็นส่วนหนึ่งของการตอบกลับเริ่มต้น ตัวเอนด์พอยต์การเช่า Bandwidth นั้นพร้อมใช้งานตามคำขอ; ติดต่อฝ่ายสนับสนุนเพื่อขอสิทธิ์การเข้าถึง ดูที่ การเช่า Bandwidth
ราคาเช่า Bandwidth ขึ้นอยู่กับจำนวนของคำสั่งซื้อ (ระดับหน่วย), ระยะเวลาการเช่า (เช่น 5m / 1h), ช่วงเวลาของวัน (UTC) และวันในสัปดาห์ ราคาพื้นฐานอยู่ในหน่วย SUN ต่อหน่วย; นอกเหนือจากราคาพื้นฐาน อาจมีค่าธรรมเนียมเพิ่มเติมคงที่ (ในหน่วย TRX) ที่มีผลบังคับใช้ — ค่าทั้งหมด จะถูกส่งคืนมาในการตอบกลับ
การตอบกลับจะมีทั้งมุมมองแบบสะดวก (tiers — ราคาสำหรับช่วงเวลา/วันปัจจุบัน) และตารางข้อมูลทั้งหมด (windows + schedule — ทุกช่วงเวลาในทุกวันของสัปดาห์)
รูปแบบที่ปรับเปลี่ยนได้ — ห้ามฮาร์ดโค้ด
ตารางราคานี้ขับเคลื่อนด้วยข้อมูลอย่างสมบูรณ์และอาจเปลี่ยนแปลงได้ตลอดเวลา: จำนวนของช่วงเวลา, ป้ายกำกับ, เวลาเริ่มต้น/สิ้นสุด, ชุดของระยะเวลาการเช่า (อาจมีการเพิ่มหรือตัดรอบระยะเวลาใหม่), ระดับจำนวน, การแจกแจงตามวันในสัปดาห์ และราคา เอง ไคลเอนต์จำเป็นต้องวนซ้ำ (iterate) ผ่านอาร์เรย์ที่ส่งคืนมา (windows, schedule, tiers, periods) และจับคู่ตามค่า — ห้ามสมมติจำนวนคงที่, ป้ายกำกับคงที่, เวลาคงที่ หรือรหัสระยะเวลาคงที่โดยเด็ดขาด โค้ดที่เขียนด้วยวิธีนี้จะยังคงทำงานได้ตามปกติแม้ตารางเวลาจะเปลี่ยนแปลงไป
| Field | Type | Description |
|---|---|---|
| unit | string | sun_per_unit |
| window | string | ป้ายกำกับช่วงเวลาของวันปัจจุบัน (UTC) |
| current_day_of_week | integer | วันในสัปดาห์ปัจจุบัน, ISO 1=จันทร์ … 7=อาทิตย์ (UTC) |
| tiers[] | array | ระดับจำนวนสำหรับช่วงเวลา/วันปัจจุบัน (เพื่อความสะดวก; รูปแบบเดียวกันกับที่อยู่ภายใน schedule) |
| windows[] | array | ไดเรกทอรีของช่วงเวลาของวันทั้งหมด (อาจเพิ่มขึ้น/ลดลง/ขยับเปลี่ยน) |
| windows[].label | string | ป้ายกำกับช่วงเวลา |
| windows[].start / .end | string | เวลาเริ่มต้น/สิ้นสุดของช่วงเวลา HH:MM UTC (ช่วงเวลาอาจข้ามเที่ยงคืน กล่าวคือ start > end) |
| schedule[] | array | ตารางข้อมูลทั้งหมด — หนึ่งรายการต่อ (วันในสัปดาห์ × ช่วงเวลา) |
| schedule[].day_of_week | integer | วันในสัปดาห์ตามมาตรฐาน ISO 1…7 |
| schedule[].window | string | ป้ายกำกับช่วงเวลา (ตรงกับ windows[].label) |
| schedule[].period_start / .period_end | string | HH:MM UTC |
| schedule[].is_current | boolean | true สำหรับเซกเมนต์ที่ใช้งานอยู่ในขณะนี้ |
| schedule[].tiers[] | array | ระดับจำนวนสำหรับเซกเมนต์นี้ |
| tiers[].amount_min | integer | ขอบเขตล่างของระดับ (รวมค่านี้) |
| tiers[].amount_max | integer|null | ขอบเขตบนของระดับ (ไม่รวมค่านี้) null = ไม่จำกัด |
| tiers[].periods[] | array | ราคาต่อระยะเวลาการเช่าภายในระดับ |
| tiers[].periods[].id | string | รหัสระยะเวลาการเช่า (เช่น 5m, 1h) — อาจเปลี่ยนแปลง/เพิ่มขึ้น |
| tiers[].periods[].rental_seconds | integer | ความยาวของระยะเวลาเป็นวินาที |
| tiers[].periods[].price | integer | ราคาต่อหน่วย Bandwidth ในหน่วย SUN |
| surcharges | object | ค่าธรรมเนียมเพิ่มเติมคงที่ในราคาของไคลเอนต์ (TRX) — ดูด้านล่าง |
| limits | object | ขีดจำกัดคำสั่งซื้อ: min_units, max_units |
ค่าธรรมเนียมเพิ่มเติม
| Field | Type | Description |
|---|---|---|
| surcharges.small_order_threshold_units | integer | คำสั่งซื้อที่มี amount ต่ำกว่าค่านี้จะถูกเรียกเก็บค่าธรรมเนียมเพิ่มเติมสำหรับคำสั่งซื้อขนาดเล็ก |
| surcharges.small_order_surcharge_trx | number | เพิ่มเติม (TRX) สำหรับคำสั่งซื้อการมอบสิทธิ์ขนาดเล็ก — เพื่อชดเชยการมอบสิทธิ์และการเรียกคืนบนเชน |
| surcharges.trx_send_surcharge_trx | number | เพิ่มเติม (TRX) เมื่อคำสั่งซื้อได้รับการดำเนินการโดยการส่ง TRX — เพื่อชดเชยการโอน TRX |
Example การตอบกลับ
{
"bandwidth": {
"unit": "sun_per_unit",
"pricing_type": "tiered_by_amount_and_period",
"description": "Bandwidth delegation rental",
"cache_ttl": 30,
"window": "<current window label>",
"current_day_of_week": 7,
"tiers": [
{
"amount_min": 400,
"amount_max": 1000,
"periods": [
{"id": "5m", "rental_seconds": 300, "price": "<price_sun>"},
{"id": "1h", "rental_seconds": 3600, "price": "<price_sun>"}
]
},
{"amount_min": 1000, "amount_max": 3000, "periods": ["..."]},
{"amount_min": 3000, "amount_max": null, "periods": ["..."]}
],
"windows": [
{"label": "<window label>", "start": "01:00", "end": "09:00"},
{"label": "<window label>", "start": "14:00", "end": "00:00"}
],
"schedule": [
{
"day_of_week": 1,
"window": "<window label>",
"period_start": "01:00",
"period_end": "09:00",
"is_current": false,
"tiers": [
{"amount_min": 400, "amount_max": 1000, "periods": [
{"id": "5m", "rental_seconds": 300, "price": "<price_sun>"},
{"id": "1h", "rental_seconds": 3600, "price": "<price_sun>"}
]}
]
}
],
"surcharges": {
"small_order_threshold_units": 1000,
"small_order_surcharge_trx": "<trx>",
"trx_send_surcharge_trx": "<trx>"
},
"limits": {"min_units": 400, "max_units": 5000}
}
}schedule ประกอบด้วยหนึ่งรายการสำหรับทุกการรวมกันของ (วันในสัปดาห์ × ช่วงเวลา) — วนซ้ำรายการนี้เพื่อแสดงผล ปฏิทินราคาทั้งหมด โดยจะมีเพียงหนึ่งรายการเท่านั้นที่มี is_current: true
ตรรกะของไคลเอนต์ (คำนวณราคาคำสั่งซื้อ)
ใช้ tiers สำหรับ "ราคา ณ ขณะนี้" หากต้องการค้นหาราคาสำหรับช่วงเวลาอื่น ให้เลือกรายการ schedule ที่ตรงกันตามวันในสัปดาห์ + ช่วงเวลาที่มี [period_start, period_end) ครอบคลุมเวลานั้น (โปรดจำไว้ว่าช่วงเวลาอาจข้ามเที่ยงคืนได้เมื่อ start > end) จากนั้นให้ใช้ tiers ของรายการดังกล่าว
# price for the current moment:
for tier in bandwidth.tiers:
if tier.amount_min <= amount < (tier.amount_max or infinity):
for p in tier.periods:
if p.id == requested_period: # match by value, not by index
base_trx = (p.price / units_meta.sun.multiplier) * amount
if amount < surcharges.small_order_threshold_units:
base_trx += surcharges.small_order_surcharge_trx # delegation orders
# TRX-send fulfillment branch instead:
# trx_branch_trx = base_trx_for_smallest_tier_shortest_period + surcharges.trx_send_surcharge_trx
# price for an arbitrary weekday/time: same logic, but first select the schedule[] entry
# where day_of_week matches and the time falls in [period_start, period_end).เป็นศูนย์กลางและเป็นไดนามิก
ราคา Bandwidth, ช่วงเวลา, การแบ่งตามวันในสัปดาห์ และค่าธรรมเนียมเพิ่มเติมได้รับการจัดการจากฝั่งเซิร์ฟเวอร์ (DB) และอาจ มีการเปลี่ยนแปลง ให้ทำการวนซ้ำ (iterate) windows, schedule, tiers และ periods จากการตอบกลับและจับคู่ ตามค่าเสมอ — อย่าฮาร์ดโค้ดจำนวน ป้ายกำกับ เวลา หรือรหัสระยะเวลา การบวกราคาส่วนต่างของ SUB-user จะไม่มีผล ต่อ Bandwidth
Tiers
ในปัจจุบัน tiers จะมีค่าเป็น null สำหรับทุกช่วงเวลา เมื่อมีการเปิดใช้งานการกำหนดราคาตามปริมาณ ฟิลด์นี้จะประกอบด้วยอาร์เรย์ของออบเจกต์ tier:
{
"tiers": [
{
"min_energy": 0,
"max_energy": 64999,
"price": "<price_sun>",
"label": "standard"
},
{
"min_energy": 65000,
"max_energy": 130999,
"price": "<price_sun>",
"label": "65k"
},
{
"min_energy": 131000,
"max_energy": 131000,
"price": "<price_sun>",
"label": "131k"
},
{
"min_energy": 131001,
"max_energy": null,
"price": "<price_sun>",
"label": "bulk"
}
]
}สกีมาของ Tiers
| Field | Type | Description |
|---|---|---|
| min_energy | integer | ปริมาณ Energy ขั้นต่ำสำหรับระดับนี้ (รวมค่านี้) |
| max_energy | integer|null | ปริมาณ Energy สูงสุดสำหรับระดับนี้ (รวมค่านี้) null = ไม่จำกัด |
| price | integer | ราคาต่อหน่วย Energy ในหน่วย SUN สำหรับระดับนี้ |
| label | string | ตัวระบุระดับ |
ตรรกะของไคลเอนต์
if tiers != null:
find the tier where min_energy <= order_amount <= max_energy
use that tier's price
else:
use the flat price field for all order amountsรูปแบบการตอบกลับแบบย่อ
ใช้ส่วนหัว X-Format เพื่อรับการตอบกลับเป็นข้อความแบบย่อ โดยข้อมูลเหล่านี้จะส่งคืนราคาของช่วงเวลาที่ใช้งานอยู่ในปัจจุบันจาก energy_1h
X-Format: now / compact / short
curl -H "X-API-KEY: your_key" -H "X-Format: now" https://netts.io/apiv2/pricing<Period>: price=<N> sun, 65k=<X.XXX> TRX (<X.XX>$), 131k=<X.XXX> TRX (<X.XX>$), 1m=<X.XXX> TRX (<X.XX>$)X-Format: short1h
เหมือนกันแต่จะไม่มีป้ายกำกับช่วงเวลาและราคาต่อหน่วย
curl -H "X-API-KEY: your_key" -H "X-Format: short1h" https://netts.io/apiv2/pricing65k=<X.XXX> TRX (<X.XX>$), 131k=<X.XXX> TRX (<X.XX>$), 1m=<X.XXX> TRX (<X.XX>$)X-Format: count
ราคาคำสั่งซื้อจำนวนมากสำหรับ 1, 2, 3, 5, 10, 20 คำสั่งซื้อ
curl -H "X-API-KEY: your_key" -H "X-Format: count" https://netts.io/apiv2/pricing1-<X.XXX> TRX (<X.XX>$), 2-<X.XXX> TRX (<X.XX>$), ...สูตรการคำนวณ
TRX cost = (price_sun / units_meta.sun.multiplier) x energy_amount
USD cost = TRX_cost x trx_rate_usdการบวกราคาส่วนต่างของ SUB-User
SUB-user จะได้รับราคาที่ใช้การบวกราคาส่วนต่างของบัญชีหลักโดยอัตโนมัติ API จะส่งคืนราคาสุดท้ายสำหรับผู้ใช้ที่ได้รับการยืนยันตัวตนเสมอ — ไม่จำเป็นต้องคำนวณในฝั่งไคลเอนต์
การตอบกลับเมื่อเกิดข้อผิดพลาด
ข้อผิดพลาดอาจมาจาก สองระดับชั้น ซึ่งมีรูปแบบที่แตกต่างกัน ไคลเอนต์ของคุณควรจัดการได้ทั้งสองรูปแบบ
ข้อผิดพลาดระดับแอปพลิเคชัน (จาก API)
ข้อผิดพลาดในระดับแอปพลิเคชันจะใช้รูปแบบมาตรฐาน success/error:
บริการไม่ถูกต้อง (400)
{
"success": false,
"error": {
"code": 4002,
"message": "Unknown services: invalid_service"
}
}ข้อผิดพลาดในการยืนยันตัวตน (401)
ส่งคืนโดยแอปพลิเคชันเมื่อไม่มีคีย์ API หรือ IP ไม่ได้อยู่ในไวท์ลิสต์:
{
"detail": {
"code": -1,
"msg": "Invalid API key or IP not in whitelist"
}
}รูปแบบที่แตกต่างกัน
ข้อผิดพลาดในการยืนยันตัวตนจะใช้รูปแบบ detail ดั้งเดิมของ FastAPI ไม่ใช่โครงสร้าง success/error เนื่องจากข้อผิดพลาดถูกสร้างขึ้นก่อนที่คำขอจะไปถึงตรรกะของแอปพลิเคชัน
ไม่พบผู้ใช้ (404)
{
"detail": {
"code": -1,
"msg": "User not found"
}
}ข้อผิดพลาดภายในเซิร์ฟเวอร์ (500)
{
"success": false,
"error": {
"code": 5001,
"message": "Failed to retrieve pricing data"
}
}ข้อผิดพลาดระดับเกตเวย์ (จาก Kong)
ข้อผิดพลาดเหล่านี้จะถูกส่งคืนโดย API เกตเวย์ ก่อนที่ คำขอจะไปถึงแอปพลิเคชัน โดยจะใช้รูปแบบของ Kong เอง:
เกินขีดจำกัดอัตราคำขอ (429)
{
"message": "API rate limit exceeded"
}เกตเวย์หมดเวลาเชื่อมต่อ (504)
{
"message": "An invalid response was received from the upstream server"
}ตารางอ้างอิงรหัสข้อผิดพลาด
| Code | Description | HTTP Status | Source |
|---|---|---|---|
-1 | ไม่ได้ระบุคีย์ API | 401 | App |
-1 | คีย์ API ไม่ถูกต้อง หรือ IP ไม่อยู่ในไวท์ลิสต์ | 401 | App |
-1 | ไม่พบผู้ใช้ | 404 | App |
4002 | บริการที่ไม่รู้จักในพารามิเตอร์ ?services= | 400 | App |
5000 | ข้อผิดพลาดภายในเซิร์ฟเวอร์ | 500 | App |
5001 | ไม่สามารถดึงข้อมูลราคาได้ | 500 | App |
5002 | ไม่มีข้อมูลราคาสำหรับรูปแบบย่อ | 500 | App |
- | เกินขีดจำกัดอัตราคำขอของ API | 429 | Kong |
การจัดการข้อผิดพลาดของไคลเอนต์ที่แนะนำ
response = requests.get(url, headers=headers)
data = response.json()
if response.status_code == 200 and data.get("success"):
# Success — process data
services = data["data"]["services"]
elif response.status_code == 429:
# Kong rate limit — back off and retry
retry_after = response.headers.get("Retry-After", "60")
time.sleep(int(retry_after))
elif "detail" in data:
# FastAPI auth/validation error
detail = data["detail"]
if isinstance(detail, dict):
print(f"Error {detail.get('code')}: {detail.get('msg')}")
else:
print(f"Error: {detail}")
elif "error" in data:
# Application error
err = data["error"]
print(f"Error {err.get('code')}: {err.get('message')}")
else:
print(f"Unexpected response: {response.status_code}")การย้ายมาจาก /apiv2/prices
| Aspect | /apiv2/prices (เดิม) | /apiv2/pricing (ใหม่) |
|---|---|---|
| Periods | 5 ช่วงคงที่ | ไดนามิกจาก DB |
| Price tiers | 3 ระดับแบบฮาร์ดโค้ด | ราคาเดี่ยว + tiers ในอนาคต |
| Duration variants | ไม่มีให้บริการ | energy_5m |
| AML prices | เอนด์พอยต์แยกต่างหาก | รวมอยู่ด้วยผ่าน ?services=aml |
| Host prices | ปะปนอยู่ในการตอบกลับ | บริการ host แยกต่างหาก |
| Service filtering | ไม่มีให้บริการ | พารามิเตอร์ ?services= |
| Unit conversion | ไม่มีเอกสารระบุ | units_meta ในการตอบกลับ |
| Cache info | ไม่มีเอกสารระบุ | cache_ttl ต่อบริการ |
| Response format | {"status": "success", ...} | {"success": true, "version": "2.1", "data": {...}} |
การจำกัดอัตราการเรียกใช้
ใช้ขีดจำกัดอัตราคำขอเช่นเดียวกันกับ /apiv2/prices (กำหนดค่าไว้ใน Kong เกตเวย์)
หมายเหตุ
- ราคา Energy ทั้งหมดอยู่ในหน่วย SUN — ใช้
units_metaสำหรับการแปลงหน่วย - ราคา Host อยู่ในหน่วย TRX
- ราคา AML อยู่ในหน่วย USDT โดยมีการแปลงเป็น TRX รวมอยู่ด้วย
- เวลาทั้งหมดอยู่ในเขตเวลา UTC
- ใช้
cache_ttlในแต่ละบริการเพื่อทราบว่าข้อมูลรีเฟรชบ่อยเพียงใด - ใช้
pricing_typeเพื่อกำหนดวิธีแยกวิเคราะห์ในแต่ละบริการ - ช่วงเวลา ผู้ให้บริการ อัตรา และค่าทั้งหมดเป็นแบบไดนามิก — ห้ามฮาร์ดโค้ดค่าเหล่านี้
- ราคา Bandwidth เป็นแบบเลือกรับเพิ่มเติม (opt-in) (
?services=bandwidth), ใช้tiered_by_amount_and_periodพร้อมsurchargesและไม่อยู่ภายใต้การบวกราคาส่วนต่างของ SUB-user