Skip to content
Translated page. The English version is the source of truth.

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 ​

HeaderRequiredDescription
Content-TypeYesapplication/json
X-API-KEYYesNetts panelinden alınan API anahtarınız
X-Real-IPYesBeyaz listenizdeki IP adresi
X-Idempotency-KeyNoÇ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 ​

json
{
    "amount": 1500,
    "receiveAddress": "TXXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "period": "5m"
}

Parametreler ​

ParameterTypeRequiredDescription
amountintegerYesKiralanacak Bandwidth birimi (minimum: 400, maksimum: 5000)
receiveAddressstringYesBandwidth alacak TRON adresi (T…, 34 karakter, base58)
periodstringYesKiralama süresi: "5m" (5 dakika) veya "1h" (1 saat, yalnızca akredite hesaplar)
trx_sendbooleanNoGarantili 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
checkbooleanNotrue 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
testbooleanNoKuru ç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-Key oluşturur ve gönderir. Tüm kurallar için Idempotency bölümüne bakın.

cURL ​

bash
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 ​

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) ​

json
{
    "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.

json
{
    "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) ​

json
{
    "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.

json
{
    "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).

json
{
    "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ı ​

FieldTypeDescription
detail.codeinteger10000 delege edildi/TRX, 10002 yeterli, 10001 işleniyor
detail.statusstringcompleted / enough / processing / failed
detail.data.orderIdstringSipariş ID'si, biçim B5M… (5 dk) / B1H… (1 sa) — durum endpoint'i için bunu kullanın
detail.data.paidTRXnumberTRX cinsinden tahsil edilen tutar (enough olduğunda 0)
detail.data.fulfilledBystringbandwidth (delege edildi) / trx (TRX gönderildi)
detail.data.hasharrayDelegasyon işlem hash'leri (10 adede kadar). Her zaman bir dizidir (TRX dalı için boştur)
detail.data.trxSendHasharrayTRX transfer hash'i/hash'leri, yalnızca fulfilledBy = trx olduğunda mevcuttur
detail.data.bandwidthintegerDelege edilen Bandwidth birimi
detail.data.periodstringKiralama 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ş durumuHTTPcodestatus
Tamamlandı20010000completed (hash / trxSendHash ile)
Devam ediyor20010001processing
Zaten yeterli20010002enough
Başarısız2005003failed
Bulunamadı / size ait değil404-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ş durumuHTTPcodestatusSonuç
Delege edildi → şimdi geri alındı20010004reclaimedreclaimHash (delegasyon kaldırma tx hash'leri)
Zaten geri alındı20010004reclaimedreclaimHash + "already reclaimed" mesajı
Delege edilmiş durumda değil (geri alınacak bir şey yok)4005005failed—
Geri alma işlemi henüz tamamlanmadı5035003failedkısa süre sonra tekrar deneyin
Bulunamadı / size ait değil404-1——
bash
curl -X POST https://netts.io/apiv2/bandwidth/reclaim/B5M<...> \
  -H "X-API-KEY: your_api_key" -H "X-Real-IP: your_whitelisted_ip"
json
{
    "detail": {
        "code": 10004,
        "status": "reclaimed",
        "msg": "Bandwidth reclaimed",
        "data": { "orderId": "B5M<...>", "reclaimHash": ["<txid>"] }
    }
}
python
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) ​

json
{ "detail": { "code": -1, "msg": "Invalid API key or IP not in whitelist" } }

Yetersiz Bakiye (403) ​

json
{ "detail": { "code": 1004, "status": "failed", "msg": "Insufficient funds" } }

Doğrulama Hatası (400) ​

json
{ "detail": { "code": 5004, "status": "failed", "msg": "Bandwidth amount out of range (400..5000)" } }

Delege Etme Başarısız / Hizmet Kullanılamıyor (503) ​

json
{ "detail": { "code": 5003, "status": "failed", "msg": "Bandwidth delegation failed" } }

Hata Kodu Referansı ​

CodeDescriptionHTTP Durumu
10000Başarılı (delege edildi veya TRX gönderildi)200
10000Başarılı (önbelleğe alınmış yanıt)208
10001Kabul edildi, harici sağlayıcı tarafından işleniyor202
10002Alıcı zaten yeterli Bandwidth değerine sahip (ücret alınmadı)200
10003Test çalıştırması — sonuç + fiyat önizlemesi, ücret alınmadı (test=true)200
10004Bandwidth geri alındı (isteğe bağlı delegasyon kaldırma) — reclaimHash döndürüldü200
-Yinelenen istek hâlâ işleniyor409
-1Geçersiz API anahtarı / IP beyaz listede değil401
1004Yetersiz bakiye403
1005Kullanıcı için ödeme yapan adres yok400
5004Geçersiz miktar/süre (doğrulama)400
5005Geri alınacak bir şey yok (sipariş delege edilmiş durumda değil)400
5007Akreditasyon olmadan — aynı anda yalnızca bir kiralama; önceki sipariş hâlâ aktif (sona erene kadar bekleyin)503
5008Akreditasyon olmadan — yalnızca 5 dakikalık 400 birimlik siparişlere izin verilir; daha büyük miktarlar veya 1 saat için akreditasyon gereklidir503
5003Bandwidth delegasyonu başarısız / kullanılamıyor503
5000Sunucu içi hata500

İstek Sınırları ​

PeriodLimitDescription
1 saniye50 istekIP başına saniyede maksimum 50 istek

İstek Limiti Aşıldı (429) ​

json
{ "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.

python
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
bash
# 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ümesi A–Z a–z 0–9 + / = _ -). Hatalı biçimlendirilmiş veya aşırı uzun bir anahtar HTTP 400 (code 5004) ile reddedilir.

Durum KoduAnlamı
200Başarıyla işlendi (ilk istek)
208Zaten başarıyla işlendi — önbelleğe alınmış yanıt döndürüldü (ikinci bir ücret alınmaz)
409Aynı 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-Key ile yeniden deneyebilirsiniz — eski hatayı döndürmek yerine sipariş tekrar denenir. Bir deneme devam ederken 409 alı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) veya enough yanı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) ​

json
{
    "amount": 1000,
    "receiveAddress": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
    "period": "5m",
    "test": true
}
json
{
    "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ş ​

json
{
    "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"
        }
    }
}
FieldDescription
paidTRXHizmetin TRX cinsinden maliyeti. Sonradan ödemeli hesaplar için bu depozitodan düşülmez
paymentModepostpaid
totalTRXTam 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) ​

json
{
    "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ı ​

CodeHTTPDescription
1004402Sonradan ödemeli kredi limitine ulaşıldı
5032503Fiyat geçici olarak kullanılamıyor
5034503Faturalandırma geçici olarak kullanılamıyor — sipariş kabul edilmedi
5036503Kredi 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) ve 1h (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 = 400 iç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.