tonapi.io va rate-limitlar: 429 xatosini qanday yoʻqotish
tonapi.io rate-limit oshib ketganda HTTP 429 qaytaradi. 429 xatosini qanday yoʻqotish, nega «228» — bu mem va TONNode MCP orqali oʻz kalitingizni qanday olish.
tonapi 429: kechki soat sakkiz yarim, prod yonyapti, loglarda esa qizil devor
TONdagi botingiz endigina mashhur roʻyxatlardan biriga tushdi, foydalanuvchilar oqib keldi, ilova esa toʻsatdan boʻsh balanslar qaytara boshladi. Loglarni ochasiz — u yerda yuzlab satr:
HTTP 429 Too Many Requests
Tanishmi? Siz balanslar va tranzaksiyalar tarixi uchun tonapi.io ga borasiz; oʻnta foydalanuvchida hammasi ishlab turgan edi, mingtasida esa anonim kirish oʻz cheklovlariga borib taqaldi. Bu klassika: trafik kichik ekan, ommaviy API bepul va cheksizdek tuyuladi. Yuk oʻsishi bilanoq u boʻgʻiz nuqtasiga aylanadi va siz tonapi 429 ni ketma-ket ola boshlaysiz. Bu sizning kodingizdagi bag ham, «node yiqildi» ham emas — bu ommaviy APIning rate limiti va u oldindan maʼlum yoʻllar bilan hal qilinadi.
429 nega paydo boʻlishini, mashhur «228» ning bunga umuman aloqasi yoʻqligini, qaysi fikslar haqiqatan yordam berishini va TONNode MCP-serveri orqali umumiy anonim pooldan TONni oʻqish uchun shaxsiy limitga qanday oʻtishni koʻrib chiqamiz.
tonapi.io nega 429 Too Many Requests qaytaradi
tonapi.io — TON maʼlumotlariga ommaviy HTTP-API. Har qanday ommaviy servis kabi, unda ham tonapi rate limit bor — bitta klient butun sigʻimni yeb qoʻymasligi uchun soʻrovlar chastotasiga qoʻyilgan cheklov.
Kalitsiz borganingizda siz umumiy anonim poolni sayyoradagi qolgan barcha anonimlar bilan boʻlishasiz. Amalda bu taxminan sekundiga ~1 soʻrov limiti. Bitta skript uchun bunga bardosh berish mumkin. Lekin har bir hamyon uchun avval balansni, keyin jetton balansini, soʻng tarixni soʻraydigan parallel worker paydo boʻlishi bilanoq siz bir zumda sekundlik limitdan oshib ketasiz. Ayniqsa sovuq startda — birdaniga koʻp manzilni indekslash kerak boʻlganda — bu ogʻriqli.
Server shunday javob beradi:
HTTP/1.1 429 Too Many Requests
Retry-After: 1
Tushunish muhim: 429 — bu spetsifikatsiyadagi standart HTTP kodi, tonapining xususiy kodi emas. Chastota oshib ketganda uni istalgan servis qaytaradi — GitHub, Stripe, Cloudflare, har qanday rate-limited servis. Xuddi shu mexanizm toncenterda va koʻpchilik RPC-provayderlarda ham bor. Demak, u ham standart usullar bilan davolanadi — ular haqida quyida.
«228 xatosi» — bu API kodi emas, komyuniti memi (haqiqiy kod — 429)
Agar muammoni rus tilidagi forumlarda qidirgan boʻlsangiz, sizga albatta «228 xatosi» uchragan. Aniqlik kiritamiz, chunki bu yangi boshlovchilarni haqiqatan chalgʻitadi.
«228» — na tonapining, na toncenterning rasmiy xato kodi. Bu TON-komyunitida ancha vaqtdan beri yashab kelayotgan, chatlarda va hazillarda qalqib chiqadigan mem-raqam. Limit oshib ketganiga javoban sizga hech qanday HTTP-status 228 kelmaydi — HTTPda bunday status-kod umuman yoʻq.
Loglarda va javob sarlavhalarida koʻradigan haqiqiy kod — aynan 429. Kimdir chatda «tonapidan 228 yedim» deb yozsa, aslida u 429 (yoki oddiy taymaut) yegan, «228» ni esa shunchaki ibora sifatida ishlatadi. Oʻz loglaringizdan «228» ni emas, 429 ni qidiring — shunda haqiqiy sababni topasiz. Buni bir satrda tekshirish mumkin:
curl -s -o /dev/null -w "%{http_code}\n" https://tonapi.io/v2/blockchain/masterchain-head
# yuk ostida, kalitsiz koʻrasiz: 429
Tezkor fikslar: retraylar, bekoff, kesh va oʻz kalitingiz
429 standart holat ekan, uni davolashning standart toʻplami ham bor. Oddiydan asosiysiga qarab boramiz.
1. Retry-After ni hurmat qiladigan eksponensial bekoff
Birinchi rad javobidanoq endpointni toʻxtovsiz siklda savalamang — faqat vaziyatni yomonlashtirasiz. 429da server koʻpincha Retry-After sarlavhasini qaytaradi va necha soniya kutish kerakligini koʻrsatadi. Uni hurmat qiling, agar u boʻlmasa — pauzani eksponensial oʻstiring.
async function fetchWithBackoff(url, opts = {}, maxRetries = 5) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch(url, opts);
if (res.status !== 429) return res;
// Retry-After ni hurmat qilamiz, aks holda pauzani eksponensial oʻstiramiz
const retryAfter = Number(res.headers.get('retry-after'));
const waitMs = Number.isFinite(retryAfter) && retryAfter > 0
? retryAfter * 1000
: Math.min(1000 * 2 ** attempt, 30_000); // 1s, 2s, 4s… yuqori chegara 30s
await new Promise(r => setTimeout(r, waitMs));
}
throw new Error('429 ketmadi: retraylar soni oshib ketdi');
}
2. Bir vaqtdagi soʻrovlar sonini cheklang
Koʻpincha 429 umumiy hajmdan emas, balki siz Promise.all orqali 50 ta soʻrovni bir vaqtda «yelpigʻichdek» yuborganingizdan keladi. Parallellik limiti (1–4) bilan semafor qoʻying — shunda sakrashlar sekundlik limitni buzmasdan tekislanadi.
3. Oʻzgarmas maʼlumotlarni keshlang
Jetton metadatasi (nom, ramz, decimals), manzil konvertatsiyasining natijasi, eski tranzaksiyalar — bular oʻzgarmaydigan maʼlumotlar. Ularni oqilona TTL bilan lokal keshga soling va APIdan qayta soʻramang. Faqat jettonlarning decimals qiymatini keshlashning oʻzi ham murojaatlarning sezilarli ulushini olib tashlaydi.
4. Asosiy fiks — anonim oʻrniga oʻz kalitingiz
Birinchi uchta punkt — ogʻriq qoldiruvchi. Haqiqiy davo — anonim pooldan oʻz kalitingizga oʻtish. Shaxsiy kalit sizning limitingizni anonimdagi ~1 req/s ga nisbatan oʻnlab-yuzlab marta oshiradi; siz butun internet bilan raqobatlashishni toʻxtatasiz va 429 kundalik ishingizdan shunchaki yoʻqoladi. Qoʻshni provayderdagi xuddi shu holat toncenterdagi 429 fiksida koʻrib chiqilgan — mantiq bir xil.
tonapi limitlari baribir yetmasa nima qilish kerak
Aytaylik, siz hammasini toʻgʻri qildingiz: bekoff, kesh, navbat. Lekin ilova oʻsyapti va hatto kalit bilan ham siz yo tarifga, yo «node ustidagi HTTP-qatlam» modelining oʻziga tiqilib qolyapsiz. Bu yerda odatda ikkita yoʻl koʻrib chiqiladi.
«Oʻz laytserverlarim» yoʻli. «TONning global configidan ommaviy laytserverni olib, ADNL orqali toʻgʻridan-toʻgʻri borsam boʻldi» degan vasvasa paydo boʻladi. Halol izoh: bu sehrli yechim emas. Global configdagi ommaviy laytserverlar ham umumiy va limitli — yuk ostida ular muntazam ravishda not ready javob beradi yoki ADNL-taymaut bilan uzilib qoladi, chuqur tranzaksiyalar tarixini esa saqlamaydi. Alohida tipik ogʻriq — aynan not ready, uning tahlili «liteserver not ready» ni qanday tuzatish maqolasida. Yaʼni shunchaki «ommaviy configga oʻtish» limitlar muammosini hal qilmaydi, baʼzan esa yomonlashtiradi.
«Provayderni yoki interfeysni almashtirish» yoʻli. Muammo aniq bir tonapi.io da emas, balki sizning umumiy resursda oʻtirganingizda. HTTP-API alternativalarining sharhi 2026-yildagi tonapi alternativalarida yigʻilgan. Agar siz AI-agent qurayotgan boʻlsangiz esa, RESTni qoʻlda oʻrash oʻrniga TONni MCP orqali toollar toʻplami sifatida ulash mantiqli — shunda blokcheynni oʻqish retray qilish kerak boʻlgan xom HTTP-soʻrov emas, tool chaqiruviga aylanadi.
TONNode MCP: umumiy anonim pool oʻrniga shaxsiy limit
TONNode (tonnode.io sayti) — bu TON uchun hosted MCP-server. MCP (Model Context Protocol) — AI-agentlar (Claude, Cursor, ChatGPT/Codex va istalgan MCP-klient) tashqi toollarni chaqiradigan standart. Agentni https://tonapi.io/v2/... ni tortishga va 429 ni qayta ishlashga oʻrgatish oʻrniga, siz unga TONni oʻqish uchun nomlangan toollar toʻplamini berasiz.
Kalit jihat: @tonnode/mcp paketi TONning nativ ADNL-protokoli boʻyicha, HTTP-qatlamlarsiz ishlaydi. U open source (MIT), npm va GitHubʼda (tonnode/mcp) mavjud. Bu tonapi ustidagi yana bitta REST-wrapper emas, balki tarmoq bilan toʻgʻridan-toʻgʻri suhbat.
Siz tonapiga borishingizga sabab boʻlgan tipik soʻrovlar oʻqish toollari bilan birma-bir qoplanadi:
- get_balance — manzildagi GRAM balansi.
- get_jetton_balance — USDT yoki istalgan jetton balansi; jetton-hamyon on-chain hisoblanadi, uning manzilini oʻzingiz chiqarishingiz shart emas. Bu bir nechta soʻrovdan iborat bogʻlamni qanday almashtirishi — TONda USDT balansi bitta chaqiruv bilan maqolasida.
- get_account_state — akkaunt statusi, bayroqlar, oxirgi tranzaksiya.
- get_transactions — tranzaksiyalar tarixi.
- run_get_method — kontraktning istalgan read-only get-metodi.
- get_masterchain_info — masterchain boshi (joriy blok).
- get_jetton_info — jetton metadatasi: nom, ramz, emissiya va decimals (USDTda — 6, koʻpchilik jettonlarda — 9; ularsiz siz raw-birliklarni notoʻgʻri qayta hisoblaysiz).
- parse_address — EQ/UQ/raw manzillarni oflayn konvertatsiya qilish va tekshirish, umuman tarmoqqa murojaatsiz.
Neyming haqida kichik izoh: GRAM — bu 2026-yil iyunda qayta nomlangan Toncoin. Tarmoq hamon TON deb ataladi, faqat tanganing nomi oʻzgardi.
get_balancebalanslari — GRAMda.
Agent qoʻlda yozilgan HTTP orqali emas, toollar orqali bajaradigan prompt namunasi:
UQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XF_wm
manzilidagi GRAM balansini va USDT balansini tekshir
hamda shu hamyonning oxirgi 5 ta tranzaksiyasini koʻrsat.
Agent oʻzi get_balance ni, keyin get_jetton_balance ni (jetton-hamyonni on-chain hisoblab), soʻngra get_transactions ni chaqiradi — siz birorta HTTP-soʻrov yozmaysiz, Retry-After bilan ovora boʻlmaysiz va kodingizda qoʻlda bekoff qurmaysiz.
Bir daqiqada qanday ulash: ishlab chiqish uchun lokal yoki prod uchun hosted-kalit
Ikkita usul bor va ikkalasi ham halol. Ularni chalkashtirmaslik muhim: kalitsiz lokal npx ishlab chiqish uchun qulay, lekin TONning ommaviy configida ishlaydi; yuk ostidagi 429 ogʻrigʻini olib tashlaydigan shaxsiy limitni esa aynan hosted-kalit beradi.
A varianti — lokal, bepul, kalitsiz (ishlab chiqish uchun)
Oʻqish toollarining toʻliq toʻplami npx orqali bitta buyruq bilan koʻtariladi — roʻyxatdan oʻtish ham, karta ham kerak emas. MCP-klient configiga qoʻshing:
{
"mcpServers": {
"ton": {
"command": "npx",
"args": ["-y", "@tonnode/mcp"]
}
}
}
Lokal ishlab chiqish va tekshirish uchun ideal start: toʻliq oʻqish toʻplami, nol konfiguratsiya, ichida esa open source. Lekin halol izoh: bu rejim TONning ommaviy configi boʻyicha yuradi, yaʼni istalgan ommaviy laytserverlar kabi oʻsha umumiy cheklovlarga (not ready, yuk ostida ADNL-taymautlar) duchor boʻladi. Prod-trafik uchun bu shaxsiy limitning oʻrnini bosmaydi — buning uchun B variantiga oʻting.
B varianti — oʻz kalitingiz bilan hosted-endpoint (prod uchun)
Kafolatlangan oʻtkazuvchanlik va prod yuki ostida shaxsiy limit kerak boʻlganda oʻz Bearer-kalitingiz bilan hosted-endpointni ulaysiz:
{
"mcpServers": {
"ton": {
"type": "http",
"url": "https://mcp.tonnode.io/mcp",
"headers": { "Authorization": "Bearer tn_live_…" }
}
}
}
Tariflar
Barcha tariflarda TONNodeʼning 16 ta toolining hammasi mavjud — siz faqat oʻtkazuvchanlik uchun toʻlaysiz:
- Hobby — abadiy bepul, daqiqasiga 60 soʻrov. Kalit tizimga kirganingizdan soʻng darhol beriladi, karta talab qilinmaydi.
- Pro — oyiga $29, daqiqasiga 300 soʻrov.
- Scale — oyiga $199, daqiqasiga 1200 soʻrov.
Anonim tonapi bilan farq koʻrinib turibdi: u yerda siz ~1 req/s ni butun internet bilan boʻlishasiz, bu yerda esa sizda shaxsiy limit bor — bepul hosted Hobby-kalitning oʻzida ham bu faqat sizga tegishli daqiqasiga 60 soʻrov, bekoff bilan ovora boʻlmasdan va tasodifiy 429larsiz. Bu kalitsiz lokal npx bilan bir xil bepul yoʻl emas: hosted Hobby-kalitning oʻz limiti bor, umumiy ommaviy pool emas.
Xulosa
tonapi.io dan keladigan 429 — bu bag ham, afsonaviy «228» ham emas, balki halol signal: siz umumiy anonim poolda oʻtiribsiz va uning cheklovlariga borib taqaldingiz. Bekoffli retraylar, Retry-After ni hurmat qilish, bir vaqtdagi soʻrovlar sonini cheklash va kesh oʻtkir ogʻriqni olib tashlaydi. Lekin muammo haqiqatan faqat sizda oʻz sigʻimingiz paydo boʻlgandagina ketadi — agar siz AI-agentlar ustiga qurayotgan boʻlsangiz esa, buni MCP orqali qilish yanada qulayroq: u yerda TONni oʻqish HTTP-qatlam orqali emas, nativ protokol boʻyicha ketadi.
Bepul hosted Hobby-kalitini oling (60 req/min, kartasiz) va 429 ga duch kelishni bas qiling → tonnode.io/dashboard?plan=hobby
Prod-yuk uchun zaxira kerakmi — Pro va Scale tariflarini solishtiring: tonnode.io/pricing.
Agentingizga TONga yoʻl oching
16 ta MCP-vosita: oʻqish, nokastodial svoplar, krosscheyn va hamyonlar. Bepul tarif — 60 soʻrov/daq, karta kerak emas.