POST /apiv2/bandwidth
TRON Bandwidth kiralayın ve bunu sabit bir süre için bir alıcı adrese delege edin: 5 dakika veya akredite hesaplar için 1 saat.
⚠️ Erişim katmanları.
- Akredite hesaplar, havuz boyutu ve maksimum limitler dahilinde herhangi bir miktarı (5000'e kadar) 5 dakika veya 1 saat için, birden fazla eşzamanlı siparişle kiralayabilir. Akreditasyon Netts support tarafından verilir.
- Akreditasyon olmadan, 5 dakika için bir defaya mahsus 400 birim kiralayabilirsiniz — sonraki siparişe yalnızca önceki kiralama sona erdikten sonra izin verilir. 400 dışındaki miktarlar ya da 1 saat için yapılan talepler veya ilki hâlâ etkinken verilen ikinci bir sipariş reddedilir.
Uç Nokta URL'si
POST https://netts.io/apiv2/bandwidthİstek Üstbilgileri
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| X-API-KEY | Yes | Netts panelinden alınan API anahtarınız |
| X-Real-IP | Yes | Beyaz listenizdeki IP adresi |
| X-Idempotency-Key | No | Çift sipariş vermeden güvenli bir şekilde yeniden denemek için isteğe bağlı istemci tarafından oluşturulan anahtar (base64). Belirtilmezse, sunucu otomatik olarak bir tane oluşturur |
İstek Gövdesi
{
"amount": 1500,
"receiveAddress": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"period": "5m"
}Parametreler
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | integer | Yes | Kiralanacak Bandwidth birimi (minimum: 400, maksimum: 5000) |
| receiveAddress | string | Yes | Bandwidth alacak TRON adresi (T…, 34 karakter, base58) |
| period | string | Yes | Kiralama süresi: "5m" (5 dakika) veya "1h" (1 saat, yalnızca akredite hesaplar) |
| trx_send | boolean | No | Garantili işlem: Bandwidth mevcut değilse, işlemin yine de gerçekleşmesi için adrese TRX gönderilir. Yalnızca amount = 400 olduğunda çalışır (aksi takdirde yoksayılır). Varsayılan false |
| check | boolean | No | true ise ve alıcı zaten 400'den fazla Bandwidth değerine sahipse, sipariş delege edilmez ve hiçbir ücret tahsil edilmez (enough durumu). Varsayılan false |
| test | boolean | No | Kuru çalıştırma. true ise, sipariş akışının tamamı simüle edilir — yanıt, zincir üzerinde herhangi bir işlem yapılmadan ve ücret tahsil edilmeden gerçekleşecek sonucu ve tahsil edilecek fiyatı size bildirir. Varsayılan false |
Örnekler
Aşağıdaki örnekler ayrıca, yanlışlıkla yapılan bir tekrarlamanın ikinci bir sipariş oluşturmaması için
X-Idempotency-Keyoluşturur ve gönderir. Tüm kurallar için Idempotency bölümüne bakın.
cURL
API_KEY="your_api_key"
ADDR="TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
AMOUNT=1500
PERIOD="5m"
NONCE=$(( $(date +%s) / 2 )) # stable for retries within a 2s window; or your own order UUID
# X-Idempotency-Key = base64( HMAC-SHA256( API_KEY, "addr:amount:period:nonce" ) )
IDEMP=$(printf '%s' "${ADDR}:${AMOUNT}:${PERIOD}:${NONCE}" \
| openssl dgst -sha256 -hmac "$API_KEY" -binary | base64)
curl -X POST https://netts.io/apiv2/bandwidth \
-H "Content-Type: application/json" \
-H "X-API-KEY: $API_KEY" \
-H "X-Real-IP: your_whitelisted_ip" \
-H "X-Idempotency-Key: $IDEMP" \
-d "{\"amount\": $AMOUNT, \"receiveAddress\": \"$ADDR\", \"period\": \"$PERIOD\"}"Python
import time, hmac, hashlib, base64, requests
API_KEY = "your_api_key"
url = "https://netts.io/apiv2/bandwidth"
payload = {
"amount": 1500,
"receiveAddress": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"period": "5m",
}
# X-Idempotency-Key = base64( HMAC-SHA256( API_KEY, "addr:amount:period:nonce" ) )
# Generate ONCE per order and resend the same value on every retry.
nonce = str(int(time.time() // 2)) # 2s bucket; or your own order UUID
message = f"{payload['receiveAddress']}:{payload['amount']}:{payload['period']}:{nonce}"
idem_key = base64.b64encode(
hmac.new(API_KEY.encode(), message.encode(), hashlib.sha256).digest()
).decode()
headers = {
"Content-Type": "application/json",
"X-API-KEY": API_KEY,
"X-Real-IP": "your_whitelisted_ip",
"X-Idempotency-Key": idem_key,
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
detail = data.get("detail", {})
if response.status_code == 200 and detail.get("status") == "completed":
d = detail["data"]
print(f"Order ID: {d['orderId']}")
print(f"Hashes: {d['hash']}") # array of delegation tx hashes
print(f"Bandwidth: {d['bandwidth']} for {d['period']}")
print(f"Cost: {d['paidTRX']} TRX")
else:
print(f"Code: {detail.get('code')} | {detail.get('msg', detail)}")Hizmet paketiyle birlikte eksiksiz bir istemci örneği (Python + cURL) sağlanmıştır (handler_bandwidth/doc/client_example/).
Yanıt
Başarılı — Bandwidth delege edildi (200 OK)
{
"detail": {
"code": 10000,
"status": "completed",
"msg": "Successful",
"data": {
"orderId": "B5M<key14>",
"paidTRX": "<amount charged in TRX>",
"fulfilledBy": "bandwidth",
"hash": ["a1b2c3...", "d4e5f6..."],
"bandwidth": 1500,
"period": "5m"
}
}
}Başarılı — Bandwidth yerine TRX gönderildi (200 OK, yalnızca amount=400 + trx_send=true)
Havuzda Bandwidth bulunmadığında ve trx_send etkinleştirildiğinde, işlemin yine de tamamlanabilmesi için adrese TRX gönderilir. Talep edilen süreye bakılmaksızın bu durumda sabit bir ücret uygulanır.
{
"detail": {
"code": 10000,
"status": "completed",
"msg": "Successful (sent TRX, bandwidth unavailable)",
"data": {
"orderId": "B5M<key14>",
"paidTRX": "<amount charged in TRX>",
"fulfilledBy": "trx",
"trxSendHash": ["<txid>"],
"hash": [],
"bandwidth": 400,
"period": "5m"
}
}
}Zaten yeterli — ücret tahsil edilmedi (200 OK, yalnızca check=true ile)
{
"detail": {
"code": 10002,
"status": "enough",
"msg": "enough band for 1 transfer",
"data": { "orderId": "B5M<key14>", "paidTRX": 0, "bandwidth": 400, "period": "5m" }
}
}İşleniyor — harici sağlayıcı (202 Accepted)
Sipariş eşzamansız olarak harici bir sağlayıcıya iletildiğinde döndürülür. Tamamlanana kadar orderId kullanarak durum endpoint'ini (aşağıda) sorgulayın.
{
"detail": {
"code": 10001,
"status": "processing",
"msg": "Order accepted, processed by an external provider. Poll the status endpoint.",
"data": { "orderId": "B5M<key14>", "bandwidth": 1500, "period": "5m" }
}
}Test çalıştırması (200 OK, yalnızca test=true ile)
Tüm sipariş akışı simüle edilir. testAction neyin gerçekleşeceğini (would) ve wouldCostTRX ne kadar ücret tahsil edileceğini (would) belirtir. Hiçbir şey delege edilmez, TRX gönderilmez, hiçbir ücret tahsil edilmez (paidTRX: 0).
{
"detail": {
"code": 10003,
"status": "test",
"msg": "Test run — no on-chain action, no charge",
"data": {
"orderId": "B5M<...>",
"testAction": "would_delegate",
"wouldCostTRX": "<amount that would be charged in TRX>",
"paidTRX": 0,
"bandwidth": 400,
"period": "5m",
"receiverFreeBandwidth": 600
}
}
}testAction değerleri: would_delegate (Bandwidth delege edilecek), would_trx_send (Bandwidth yok, amount=400 + trx_send → TRX gönderilecek), enough (alıcıda zaten yeterli var, check=true ile) veya would_error:<reason> (ör. no_bandwidth, not_whitelisted).
Yanıt Alanları
| Field | Type | Description |
|---|---|---|
| detail.code | integer | 10000 delege edildi/TRX, 10002 yeterli, 10001 işleniyor |
| detail.status | string | completed / enough / processing / failed |
| detail.data.orderId | string | Sipariş ID'si, biçim B5M… (5 dk) / B1H… (1 sa) — durum endpoint'i için bunu kullanın |
| detail.data.paidTRX | number | TRX cinsinden tahsil edilen tutar (enough olduğunda 0) |
| detail.data.fulfilledBy | string | bandwidth (delege edildi) / trx (TRX gönderildi) |
| detail.data.hash | array | Delegasyon işlem hash'leri (10 adede kadar). Her zaman bir dizidir (TRX dalı için boştur) |
| detail.data.trxSendHash | array | TRX transfer hash'i/hash'leri, yalnızca fulfilledBy = trx olduğunda mevcuttur |
| detail.data.bandwidth | integer | Delege edilen Bandwidth birimi |
| detail.data.period | string | Kiralama süresi (5m / 1h) |
Durum Uç Noktası
GET https://netts.io/apiv2/bandwidth/status/{orderId}Headers: X-API-KEY + X-Real-IP (sipariş, kimliği doğrulanmış kullanıcıya ait olmalıdır).
| Sipariş durumu | HTTP | code | status |
|---|---|---|---|
| Tamamlandı | 200 | 10000 | completed (hash / trxSendHash ile) |
| Devam ediyor | 200 | 10001 | processing |
| Zaten yeterli | 200 | 10002 | enough |
| Başarısız | 200 | 5003 | failed |
| Bulunamadı / size ait değil | 404 | -1 | — |
Geri Alma Endpoint'i
Delege edilmiş siparişlerinizden birinin Bandwidth değerini süresi dolmadan önce isteğe bağlı olarak geri alın (yetkilendirmeyi kaldırın). Bandwidth otomatik olarak geri alınır ve işlem hash'i döndürülür.
POST https://netts.io/apiv2/bandwidth/reclaim/{orderId}Headers: X-API-KEY + X-Real-IP (sipariş, kimliği doğrulanmış kullanıcıya ait olmalıdır).
| Sipariş durumu | HTTP | code | status | Sonuç |
|---|---|---|---|---|
| Delege edildi → şimdi geri alındı | 200 | 10004 | reclaimed | reclaimHash (delegasyon kaldırma tx hash'leri) |
| Zaten geri alındı | 200 | 10004 | reclaimed | reclaimHash + "already reclaimed" mesajı |
| Delege edilmiş durumda değil (geri alınacak bir şey yok) | 400 | 5005 | failed | — |
| Geri alma işlemi henüz tamamlanmadı | 503 | 5003 | failed | kısa süre sonra tekrar deneyin |
| Bulunamadı / size ait değil | 404 | -1 | — | — |
curl -X POST https://netts.io/apiv2/bandwidth/reclaim/B5M<...> \
-H "X-API-KEY: your_api_key" -H "X-Real-IP: your_whitelisted_ip"{
"detail": {
"code": 10004,
"status": "reclaimed",
"msg": "Bandwidth reclaimed",
"data": { "orderId": "B5M<...>", "reclaimHash": ["<txid>"] }
}
}import requests
order_id = "B5M..." # the orderId from your rental response
url = f"https://netts.io/apiv2/bandwidth/reclaim/{order_id}"
headers = {"X-API-KEY": "your_api_key", "X-Real-IP": "your_whitelisted_ip"}
resp = requests.post(url, headers=headers)
detail = resp.json()["detail"]
if resp.status_code == 200 and detail["status"] == "reclaimed":
print(f"Reclaimed: {detail['data']['reclaimHash']} ({detail['msg']})")
else:
print(f"Code {detail.get('code')}: {detail.get('msg', detail)}")İsteğe bağlı erken geri almada kiralama ücreti iade edilmez — geri alma işlemi yalnızca delege edilen Bandwidth değerini süresinden önce havuza iade eder.
Hata Yanıtları
Kimlik Doğrulama Hatası (401)
{ "detail": { "code": -1, "msg": "Invalid API key or IP not in whitelist" } }Yetersiz Bakiye (403)
{ "detail": { "code": 1004, "status": "failed", "msg": "Insufficient funds" } }Doğrulama Hatası (400)
{ "detail": { "code": 5004, "status": "failed", "msg": "Bandwidth amount out of range (400..5000)" } }Delege Etme Başarısız / Hizmet Kullanılamıyor (503)
{ "detail": { "code": 5003, "status": "failed", "msg": "Bandwidth delegation failed" } }Hata Kodu Referansı
| Code | Description | HTTP Durumu |
|---|---|---|
10000 | Başarılı (delege edildi veya TRX gönderildi) | 200 |
10000 | Başarılı (önbelleğe alınmış yanıt) | 208 |
10001 | Kabul edildi, harici sağlayıcı tarafından işleniyor | 202 |
10002 | Alıcı zaten yeterli Bandwidth değerine sahip (ücret alınmadı) | 200 |
10003 | Test çalıştırması — sonuç + fiyat önizlemesi, ücret alınmadı (test=true) | 200 |
10004 | Bandwidth geri alındı (isteğe bağlı delegasyon kaldırma) — reclaimHash döndürüldü | 200 |
- | Yinelenen istek hâlâ işleniyor | 409 |
-1 | Geçersiz API anahtarı / IP beyaz listede değil | 401 |
1004 | Yetersiz bakiye | 403 |
1005 | Kullanıcı için ödeme yapan adres yok | 400 |
5004 | Geçersiz miktar/süre (doğrulama) | 400 |
5005 | Geri alınacak bir şey yok (sipariş delege edilmiş durumda değil) | 400 |
5007 | Akreditasyon olmadan — aynı anda yalnızca bir kiralama; önceki sipariş hâlâ aktif (sona erene kadar bekleyin) | 503 |
5008 | Akreditasyon olmadan — yalnızca 5 dakikalık 400 birimlik siparişlere izin verilir; daha büyük miktarlar veya 1 saat için akreditasyon gereklidir | 503 |
5003 | Bandwidth delegasyonu başarısız / kullanılamıyor | 503 |
5000 | Sunucu içi hata | 500 |
İstek Sınırları
| Period | Limit | Description |
|---|---|---|
| 1 saniye | 50 istek | IP başına saniyede maksimum 50 istek |
İstek Limiti Aşıldı (429)
{ "message": "API rate limit exceeded" }Idempotency
Yanlışlıkla yapılan bir tekrarlamanın ikinci bir sipariş oluşturmaması (not) için isteğe bağlı X-Idempotency-Key başlığını gönderin — orijinal yanıt HTTP 208 ile döndürülür. Başlığı göndermezseniz sunucu, kısa bir zaman aralığında istek parametrelerinizden otomatik olarak bir anahtar türetir.
Anahtar nasıl oluşturulur
Anahtar base64( HMAC-SHA256( secret, message ) ) biçimindedir — 44 karakterlik bir base64 dizesidir, burada:
- secret = API anahtarınız (
X-API-KEY); - message =
:ile birleştirilmiş alanlar —receiveAddress:amount:period:nonce.
nonce, aynı mantıksal siparişin yeniden denemeleri arasında sabit olan ancak farklı siparişler arasında değişiklik gösteren herhangi bir değerdir — örneğin bu sipariş için tuttuğunuz bir UUID veya kaba bir zaman damgası aralığı. Anahtarı sipariş başına bir kez oluşturun ve her yeniden denemede tamamen aynı değeri tekrar gönderin.
import hmac, hashlib, base64, time
def make_idempotency_key(api_key, receive_address, amount, period, nonce=None):
if nonce is None:
nonce = str(int(time.time() // 2)) # 2-second bucket; or your own order UUID
message = f"{receive_address}:{amount}:{period}:{nonce}"
digest = hmac.new(api_key.encode(), message.encode(), hashlib.sha256).digest()
return base64.b64encode(digest).decode() # 44-char base64# then send it as a header:
-H "X-Idempotency-Key: <base64_key>"Mesaja period bilgisinin dahil edilmesi önemlidir: aynı adres için 5m ve 1h kiralamak farklı siparişlerdir ve farklı anahtarlar üretmelidir.
Doğrulama. Sağlanan bir
X-Idempotency-Key, 16–64 karakterden oluşan bir base64 dizesi olmalıdır (karakter kümesiA–Z a–z 0–9 + / = _ -). Hatalı biçimlendirilmiş veya aşırı uzun bir anahtar HTTP 400 (code 5004) ile reddedilir.
| Durum Kodu | Anlamı |
|---|---|
| 200 | Başarıyla işlendi (ilk istek) |
| 208 | Zaten başarıyla işlendi — önbelleğe alınmış yanıt döndürüldü (ikinci bir ücret alınmaz) |
| 409 | Aynı istek şu anda işleniyor — bekleyin, henüz yeniden denemeyin |
Başarısızlıktan sonra yeniden deneme. Yalnızca başarılı sonuçlar (
completed/enough) önbelleğe alınır. Önceki deneme başarısız olduysa veya zaman aşımına uğradıysa (hiçbir ücret tahsil edilmedi), güvenle aynıX-Idempotency-Keyile yeniden deneyebilirsiniz — eski hatayı döndürmek yerine sipariş tekrar denenir. Bir deneme devam ederken409alırsınız; bekleyin ve tekrar deneyin.
Sonradan Ödemeli Hesaplar
Sonradan ödemeli faturalandırma kullanan hesaplar, herkesle aynı endpoint'i, URL'yi, başlıkları ve istek gövdesini kullanır. Fark, siparişin nasıl ödendiğindedir:
- Depozitonuzdan hiçbir şey düşülmez. Teslim edilen her sipariş, sözleşmenizde kararlaştırılan ödeme para biriminde vadesi gelen hesap bakiyenize eklenir. Sözleşmenize göre fatura yoluyla ödersiniz.
- Hesabınızın bir kredi limiti vardır. Vadesi gelen tutar limit dahilinde olduğu sürece, sıfır depozito ile dahi siparişler kabul edilir. 5 dakikalık ve 1 saatlik kiralamalar aynı Bandwidth limitine sayılır.
- Yalnızca teslim edilen hizmetler faturalandırılır: adrese delege edilen Bandwidth veya bunun yerine gönderilen TRX (
fulfilledBy = trx). Tutar, ön ödemeli siparişlerle aynıdır. - Reddedilen, yürütülmeyen, bir test çalıştırması olan (
test: true) veyaenoughyanıtı verilen (check: true) bir siparişin maliyeti yoktur. - İsteğe bağlı erken geri alma, ön ödemeli siparişlerde olduğu gibi vadesi gelen tutarı azaltmaz.
- Erişim katmanları, miktarlar, süreler ve bu endpoint'in diğer tüm kuralları ön ödemeli hesaplarla aynıdır.
Sonradan ödemeli faturalandırma, talep üzerine Netts tarafından bir hesap için etkinleştirilir. Her yanıt, siparişin nasıl ödendiğini bildirir: paymentMode, postpaid veya prepaid şeklindedir.
Fiyat kontrolü (test: true)
{
"amount": 1000,
"receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"period": "5m",
"test": true
}{
"detail": {
"code": 10003,
"status": "test",
"msg": "Test run — no on-chain action, no charge",
"data": {
"orderId": "B5M1a2b3c4d5e6f70",
"testAction": "would_delegate",
"wouldCostTRX": 0.7,
"paidTRX": 0,
"bandwidth": 1000,
"period": "5m",
"receiverFreeBandwidth": 600,
"paymentMode": "postpaid"
}
}
}wouldCostTRX, TRX cinsinden vadesi gelen bakiyenize eklenecek tutardır. Hiçbir şey delege edilmez veya faturalandırılmaz.
Başarılı sipariş
{
"detail": {
"code": 10000,
"status": "completed",
"msg": "Successful, 0.700000 TRX, postpaid",
"data": {
"orderId": "B5M0f9e8d7c6b5a41",
"paidTRX": 0.7,
"fulfilledBy": "bandwidth",
"hash": ["<txid>"],
"bandwidth": 1000,
"period": "5m",
"paymentMode": "postpaid",
"totalTRX": "0.700000"
}
}
}| Field | Description |
|---|---|
| paidTRX | Hizmetin TRX cinsinden maliyeti. Sonradan ödemeli hesaplar için bu depozitodan düşülmez |
| paymentMode | postpaid |
| totalTRX | Tam tutar, 6 ondalık basamak |
TRX dalı (fulfilledBy = trx, trxSendHash) dahil olmak üzere diğer tüm alanlar, ön ödemeli siparişlerle aynıdır.
Kredi limitine ulaşıldı (402)
{
"detail": {
"code": 1004,
"msg": "Postpaid credit limit reached.",
"paymentMode": "postpaid",
"reason": "limit_reached"
}
}Sipariş yürütülmez ve hiçbir şey faturalandırılmaz. Ödemeniz kaydedildiğinde veya limitiniz artırıldığında yeni siparişler tekrar kabul edilir.
Sonradan ödemeli hata kodları
| Code | HTTP | Description |
|---|---|---|
1004 | 402 | Sonradan ödemeli kredi limitine ulaşıldı |
5032 | 503 | Fiyat geçici olarak kullanılamıyor |
5034 | 503 | Faturalandırma geçici olarak kullanılamıyor — sipariş kabul edilmedi |
5036 | 503 | Kredi kontrolü geçici olarak kullanılamıyor — daha sonra tekrar deneyin |
Yukarıdaki tüm yanıtlarda hiçbir sipariş verilmez ve hiçbir şey faturalandırılmaz. Diğer tüm kodlar ön ödemeli siparişlerle aynıdır.
Notlar
- Erişim katmanları: akredite hesaplar, eşzamanlı siparişlerle havuz/maksimum limitler dahilinde herhangi bir miktarı kiralayabilir; akreditasyon olmadan — 5 dakika için bir defaya mahsus 400 birim (sonraki sipariş yalnızca önceki kiralama sona erdikten sonra). Akreditasyon için Netts support ile iletişime geçin.
- Minimum: 400 birim. Maksimum: sipariş başına 5000 birim (mevcut yapılandırma).
- Süreler:
5m(300 sn) ve1h(3600 sn, yalnızca akredite hesaplar). Süre dolduğunda Bandwidth otomatik olarak geri alınır. - Tampon yok: tam olarak talep edilen miktar delege edilir.
- hash bir dizidir: tek bir sipariş 10 adede kadar delegasyon hash'i üretebilir — tümü döndürülür.
- Fiyatlandırma: talep edilen miktar ve süreye göre TRX cinsinden ücretlendirilir; fiyatlar günün saatine göre değişebilir. Güncel fiyatlandırma için destek ile iletişime geçin.
- Küçük sipariş telafisi (delegasyon): 1000 birimin altındaki siparişler için, zincir üzerindeki delegasyon ve geri alma işleminin telafisi olarak fiyata sabit 0.372 TRX eklenir. 1000 birim veya üzerindeki siparişlerde böyle bir ekleme yoktur.
- TRX gönderme telafisi: sipariş TRX gönderilerek karşılandığında (
fulfilledBy = trx), bunun yerine sabit 0.268 TRX eklenir (zincir üzerindeki TRX transferinin telafisi). - trx_send: yalnızca
amount = 400için; mevcut Bandwidth yoksa, işlemin yine de tamamlanması için adrese TRX gönderilir. - check: alıcı zaten 400'den fazla Bandwidth değerine sahip olduğunda delegasyonu (ve ücretlendirmeyi) atlar.
- Sipariş ID formatı:
B5M…(5 dakika) /B1H…(1 saat). - Yanıt zaman aşımı: delegasyon beklenirken yaklaşık ~12 saniyeye kadar; genellikle 1–2 saniye.