{"openapi":"3.0.3","info":{"title":"StarsPaymee Partner Purchase API","version":"1.0.0","description":"Tashqi tizimlar ushbu API orqali Telegram **Stars**, **Premium**, **Steam** hamyoni va **o'yin akkauntlarini** to'ldiradi.\n\n| Mahsulot | Endpoint | Yetkazish |\n|---|---|---|\n| ⭐️ Telegram Stars | `POST /v1/stars` | sinxron (javobda natija) |\n| 💎 Telegram Premium | `POST /v1/premium` | sinxron |\n| 🎮 Steam hamyoni | `POST /v1/steam` | **asinxron bo'lishi mumkin** (`202` → polling) |\n| 🔫 PUBG Mobile UC | `POST /v1/games/pubgm/order` | **asinxron** (~2 daqiqa, `202` → polling) |\n| ⚔️ Mobile Legends olmos | `POST /v1/games/mlbb_global/order` | **asinxron** (~1 daqiqa, `202` → polling) |\n\nHammasi bitta USDT balansdan yechiladi va javob shakli bir xil skeletda\n(`success`, `order_id`, `status`, `usdt_charged`, `balance_remaining_usdt`) —\nbitta parser hammasiga yetadi.\n\n### Autentifikatsiya\nHar bir so'rovda API kalit beriladi (ikki xil usul, biri yetarli):\n```\nX-API-Key: sj_...\n```\nyoki\n```\nAuthorization: Bearer sj_...\n```\nKalit — mijozning **USDT hamyoni**: balans yetarli bo'lsa yechiladi va yetkaziladi, aks holda `402`. Fragment xatosida balans avtomatik qaytariladi (`502`).\n\n#### Kalit turlari\nIkki xil kalit bor. **Ular bir xil manzillar, bir xil so'rov va bir xil javob formatidan foydalanadi** — quyidagi hamma narsa ikkalasiga ham tegishli, integratsiyada faqat kalitni almashtirasiz.\n\n| Tur | Mablag' manbai | `402` qachon |\n|---|---|---|\n| **standard** (oddiy mijoz) | o'zining ichki USDT balansi | balans yetmasa |\n| **owner** (tizim kaliti) | to'g'ridan-to'g'ri StarsPaymee hamyoni — **balans limiti yo'q** | hamyonda mablag' yetmasa (yoki admin qo'ygan kunlik/buyurtma chegarasidan oshsa) |\n\n`owner` kalitida `GET /v1/balance` ichki balansni emas, **hamyonda xaridga sarflash mumkin bo'lgan summani** qaytaradi (`balance_usdt` — o'sha maydon, o'sha `number` turi) va qo'shimcha `unlimited: true` beriladi.\n\n### Idempotency\nHar buyurtmaga **unikal** `idempotency_key` bering — takroriy so'rov bir marta pul yechadi. Tarmoq uzilsa xavfsiz qayta yuborasiz.\n\n### 30 soniyada integratsiya\nBu — oddiy REST + JSON API. **PHP, Node.js, Python** yoki istalgan til HTTP request orqali ulanadi. Quyidagi 4 misol `POST /v1/stars`ni ko'rsatadi:\n\n**cURL**\n```bash\ncurl -X POST \"https://api.starstg.uz/api/purchase/v1/stars\" \\\n  -H \"X-API-Key: sj_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"username\":\"durov\",\"stars\":500,\"idempotency_key\":\"order-12345\"}'\n```\n\n**PHP** (cURL kengaytmasi)\n```php\n<?php\n$ch = curl_init(\"https://api.starstg.uz/api/purchase/v1/stars\");\ncurl_setopt_array($ch, [\n  CURLOPT_RETURNTRANSFER => true,\n  CURLOPT_POST           => true,\n  CURLOPT_HTTPHEADER     => [\n    \"X-API-Key: sj_...\",\n    \"Content-Type: application/json\",\n  ],\n  CURLOPT_POSTFIELDS => json_encode([\n    \"username\"        => \"durov\",\n    \"stars\"           => 500,\n    \"idempotency_key\" => \"order-12345\",\n  ]),\n]);\n$res  = json_decode(curl_exec($ch), true);\n$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\necho $code . PHP_EOL;\nprint_r($res);\n```\n\n**Node.js** (18+, o'rnatilgan `fetch`)\n```js\nconst res = await fetch(\"https://api.starstg.uz/api/purchase/v1/stars\", {\n  method: \"POST\",\n  headers: {\n    \"X-API-Key\": \"sj_...\",\n    \"Content-Type\": \"application/json\",\n  },\n  body: JSON.stringify({\n    username: \"durov\",\n    stars: 500,\n    idempotency_key: \"order-12345\",\n  }),\n});\nconsole.log(res.status, await res.json());\n```\n\n**Python** (`requests`)\n```python\nimport requests\n\nres = requests.post(\n    \"https://api.starstg.uz/api/purchase/v1/stars\",\n    headers={\"X-API-Key\": \"sj_...\"},\n    json={\"username\": \"durov\", \"stars\": 500, \"idempotency_key\": \"order-12345\"},\n    timeout=240,  # yetkazish xato bergach blockchain tarixi tekshiriladi — kamdan-kam holatda uzoqroq davom etadi\n)\nprint(res.status_code, res.json())\n```\n\n### 🎮 Steam to'ldirish — to'liq oqim\n\nSteam **login** bo'yicha, **USD** nominalda ishlaydi. O'zbekiston uchun ham to'liq\nqo'llab-quvvatlanadi: Steam UZ akkauntlari USD hamyonda, shuning uchun valyuta\nkonvertatsiyasi yo'q.\n\nBoshqa mahsulotlardan yagona jiddiy farqi — **yetkazish asinxron bo'lishi mumkin**.\nShuning uchun `202` javobini ham qayta ishlang:\n\n**Narx qanday hisoblanadi.** Ustama nominalga emas, tannarxga (nominal +\nprovayder komissiyasi) qo'llanadi:\n\n```\nprovider_fee = amount_usd × provider_fee_ratio\ncost         = amount_usd + provider_fee\ntotal        = cost × (1 + markup_percent / 100)     ← usdt_charged shu\n\nMisol: $10 nominal, provayder 2%, ustama 5%\n  provider_fee = $0.20\n  cost         = $10.20\n  total        = $10.71\n```\n\nHisobni o'zingizda takrorlamang — `GET /v1/steam/pricing?amount_usd=...`\nhar doim aniq, jonli qiymatni beradi.\n\n```python\nimport requests, time\n\nAPI  = \"https://api.starstg.uz/api/purchase/v1\"\nHEAD = {\"X-API-Key\": \"sj_...\"}\n\n# 1) Aniq narxni oling — o'zingizda hisoblamang\nq = requests.get(f\"{API}/steam/pricing\", headers=HEAD,\n                 params={\"amount_usd\": 10}, timeout=30).json()\nprint(q[\"quote\"])   # {'amount_usd': 10, 'provider_fee_usd': 0.2, 'cost_usd': 10.2,\n                     #  'markup_percent': 5, 'markup_usdt': ..., 'total_usdt': ...}\n\n# 2) Buyurtma. idempotency_key — SIZNING invoice id'ingiz, tasodifiy emas!\nres = requests.post(f\"{API}/steam\", headers=HEAD, timeout=120, json={\n    \"login\": \"mysteamlogin\",\n    \"amount_usd\": 10,\n    \"idempotency_key\": \"invoice-1042\",\n})\norder = res.json()\n\n# 3) 202 = qabul qilindi, hali bajarilmoqda → holatni kuzatamiz\nif res.status_code == 202:\n    for _ in range(180):                     # ~15 daqiqa\n        time.sleep(5)\n        order = requests.get(f\"{API}/steam/{order['order_id']}\",\n                             headers=HEAD, timeout=30).json()\n        if order[\"status\"] in (\"completed\", \"failed\"):\n            break\n\nprint(order[\"status\"], order[\"usdt_charged\"])\n```\n\n**Node.js**\n```js\nconst res = await fetch(\"https://api.starstg.uz/api/purchase/v1/steam\", {\n  method: \"POST\",\n  headers: { \"X-API-Key\": \"sj_...\", \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    login: \"mysteamlogin\",\n    amount_usd: 10,\n    idempotency_key: \"invoice-1042\",\n  }),\n});\nlet order = await res.json();\n\n// 202 → tugagunicha kuzatamiz\nwhile (order.status === \"processing\") {\n  await new Promise((r) => setTimeout(r, 5000));\n  order = await (await fetch(`https://api.starstg.uz/api/purchase/v1/steam/${order.order_id}`, {\n    headers: { \"X-API-Key\": \"sj_...\" },\n  })).json();\n}\nconsole.log(order.status, order.usdt_charged);\n```\n\n#### Steam uchun 5 ta qoida\n\n1. **`202` xato emas.** `status: \"processing\"` — buyurtma qabul qilingan.\n   Terminal holat faqat `completed` yoki `failed`.\n2. **`login` — aynan login.** Email yoki `/profiles/765611...` (SteamID) ishlamaydi.\n   `https://steamcommunity.com/id/<login>` havolasi qabul qilinadi.\n3. **`idempotency_key` majburiy darajada tavsiya etiladi** va u SIZNING barqaror\n   invoice id'ingiz bo'lishi kerak. Tasodifiy qiymat bilan qayta yuborsangiz\n   ikkinchi buyurtma yaratiladi va **pul ikki marta ketadi**.\n4. **Timeout — \"yiqildi\" degani emas.** Javob kelmasa, refund qilmang: aynan\n   o'sha `idempotency_key` bilan qayta yuboring yoki holatni so'rang.\n5. **Narxni `/v1/steam/pricing` dan oling.** Ustama foizi sizning kalitingizga\n   xos bo'lishi mumkin (oborotga qarab shaxsiy tarif).\n\n### O'yin to'ldirish (PUBG Mobile / Mobile Legends)\n\nTo'liq oqim — ID tekshiruvidan yakunigacha:\n\n```js\nconst H = { \"X-API-Key\": \"sj_...\", \"Content-Type\": \"application/json\" };\nconst GAME = \"pubgm\"; // yoki \"mlbb_global\"\n\n// 1) Narxni JONLI oling — kurs bilan o'zgaradi\nconst cat = await (await fetch(`https://api.starstg.uz/api/purchase/v1/games/${GAME}/catalogue`, { headers: H })).json();\nconst item = cat.denominations.find((d) => d.name === \"60\"); // AYNAN nom bo'yicha!\n// item.price_usdt — balansdan shuncha yechiladi\n\n// 2) O'yinchini tekshiring va nikni XARIDORGA KO'RSATING (bepul)\nconst who = await (await fetch(`https://api.starstg.uz/api/purchase/v1/games/${GAME}/check-player`, {\n  method: \"POST\", headers: H,\n  body: JSON.stringify({ player_id: \"51221257198\" }),\n})).json();\nif (!who.valid) throw new Error(\"ID noto'g'ri\");\n// who.player_name → \"MirshodforwarD\" — tasdiqlatmasdan davom etmang\n\n// 3) Buyurtma\nlet order = await (await fetch(`https://api.starstg.uz/api/purchase/v1/games/${GAME}/order`, {\n  method: \"POST\", headers: H,\n  body: JSON.stringify({\n    denomination: item.name,\n    player_id: \"51221257198\",\n    idempotency_key: \"invoice-1042\", // SIZNING barqaror invoice id\n  }),\n})).json();\n\n// 4) 202 → tugagunicha kuzatamiz (PUBG ~2 daq, MLBB ~1 daq)\nwhile (order.status === \"processing\") {\n  await new Promise((r) => setTimeout(r, 5000));\n  order = await (await fetch(`https://api.starstg.uz/api/purchase/v1/games/orders/${order.order_id}`, { headers: H })).json();\n}\nconsole.log(order.status, order.usdt_charged); // \"completed\" 0.9345\n```\n\n#### O'yin to'ldirish uchun 5 ta qoida\n\n1. **ID ni tekshirmasdan sotmang.** Noto'g'ri ID ga tushgan UC/olmosni **hech kim\n   qaytara olmaydi** — na biz, na provayder, na o'yin ishlab chiqaruvchisi.\n   `check-player` bepul va bir soniya oladi.\n2. **`denomination` — aynan katalogdagi `name`.** Prefiks bo'yicha qidirmang:\n   PUBG'da `\"60\"` (haqiqiy UC) va `\"60 WOW Coins\"` (boshqa mahsulot) yonma-yon turadi.\n3. **Narxni har safar qayta o'qing.** Katalog narxi valyuta kursi bilan o'zgaradi;\n   eskirgan narxni xaridorga aytib qo'ysangiz farqni o'zingiz to'laysiz.\n4. **`server_id` — o'yinga bog'liq.** Mobile Legends'da majburiy, PUBG'da umuman\n   kerak emas. `GET /v1/games` javobidagi `required_fields` ga qarang.\n5. **`202` xato emas va timeout — \"yiqildi\" degani emas.** Javob kelmasa refund\n   qilmang: aynan o'sha `idempotency_key` bilan qayta yuboring yoki holatni so'rang.\n\n> 💡 Avval Sandbox bilan sinang — `/test/v1/stars`, `/test/v1/premium`,\n> `/test/v1/steam`: balans yechilmaydi, hech narsa yetkazilmaydi.","contact":{"name":"StarsPaymee","url":"https://api.starstg.uz"}},"servers":[{"url":"https://api.starstg.uz/api/purchase","description":"Partner Purchase API"}],"tags":[{"name":"Health","description":"Holat, balans va narxlar (umumiy ma'lumot)"},{"name":"Search","description":"Qabul qiluvchini qidirish (pul yechilmaydi)"},{"name":"Stars","description":"Telegram Stars yetkazish"},{"name":"Premium","description":"Telegram Premium yetkazish"},{"name":"Steam","description":"**Steam hamyonini to'ldirish** — Steam login bo'yicha, USD nominalda.\n\nO'zbekiston uchun ham to'liq ishlaydi: Steam UZ akkauntlari `USD_CIS` narx zonasida va hamyon USD'da, shuning uchun **valyuta konvertatsiyasi umuman yo'q** (FX ustamasi nol).\n\nBoshqa mahsulotlardan farqi — yetkazish **asinxron** bo'lishi mumkin: javob `202` va `status: \"processing\"` bo'lsa, yakunni `GET /v1/steam/{order_id}` bilan kuzating."},{"name":"Games","description":"**O'yin akkauntini to'g'ridan-to'g'ri to'ldirish** — PUBG Mobile UC, Mobile Legends olmos.\n\nVoucher kod **emas**: kredit o'yinchi ID si bo'yicha akkauntga to'g'ridan-to'g'ri yoziladi. Xaridor hech narsa aktivlashtirmaydi.\n\n### To'g'ri oqim\n1. `GET /v1/games` — o'yinlar va har biri qanday maydon talab qilishi\n2. `GET /v1/games/{code}/catalogue` — nominallar va **siz to'laydigan narx**\n3. `POST /v1/games/{code}/check-player` — ID ni tekshiring, **nikni xaridorga ko'rsating**\n4. `POST /v1/games/{code}/order` — buyurtma\n5. `GET /v1/games/orders/{order_id}` — yakunni kuzating\n\n⚠️ **3-qadamni o'tkazib yubormang.** Noto'g'ri ID ga yuborilgan UC yoki olmosni **qaytarib bo'lmaydi** — na biz, na provayder, na o'yin ishlab chiqaruvchisi uni bekor qila oladi.\n\nYetkazish **asinxron**: javob `202` va `status: \"processing\"` bo'lishi normal holat. O'lchangan vaqt — PUBG ~2 daqiqa, Mobile Legends ~1 daqiqa."},{"name":"Orders","description":"Buyurtma holati va tarixi"},{"name":"Sandbox","description":"**Test rejimi** — xuddi real kabi javob qaytaradi, lekin balans yechilmaydi va yetkazilmaydi.\n\nSo'rov formati real endpoint bilan bir xil. Javobda `\"test\": true` qo'shiladi va `transaction_id` `test_...` bilan boshlanadi. Integratsiyani xavfsiz sinash uchun ishlating."}],"components":{"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Mijoz API kaliti, masalan `sj_live_...`"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"sj_...","description":"`Authorization: Bearer sj_...` — X-API-Key bilan bir xil kalit"}},"schemas":{"Error":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Noto'g'ri yoki yo'q API kalit"},"retry_after":{"type":"integer","nullable":true,"description":"Faqat 429 da: necha soniyadan keyin qayta urinish mumkin","example":42}}},"HealthResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"delivery_provider":{"type":"string","example":"smart"},"delivery_ready":{"type":"boolean","example":true},"fragment_ready":{"type":"boolean","example":true},"steam_ready":{"type":"boolean","example":true,"description":"Steam to'ldirish yoqilganmi. `false` bo'lsa `/v1/steam` 503 qaytaradi."},"game_ready":{"type":"boolean","example":true,"description":"O'yin to'ldirish yoqilganmi. `false` bo'lsa `/v1/games/...` 503 qaytaradi."},"db_ready":{"type":"boolean","example":true},"api_configured":{"type":"boolean","example":true},"version":{"type":"string","example":"1.0.0"}}},"BalanceResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"balance_usdt":{"type":"number","example":28.5},"currency":{"type":"string","example":"USDT"}}},"PricingResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"stars":{"type":"object","properties":{"min":{"type":"integer","example":50},"max":{"type":"integer","example":10000},"usdt_per_star":{"type":"number","example":0.0153}}},"premium":{"type":"object","properties":{"months":{"type":"array","items":{"type":"integer"},"example":[3,6,12]},"usdt":{"type":"object","example":{"3":12,"6":16,"12":29}}}},"payment_method":{"type":"string","example":"usdt_ton"}}},"LiveRatesResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"base_currency":{"type":"string","example":"USDT"},"rates":{"type":"object","properties":{"ton_usd":{"type":"number","nullable":true,"description":"1 TON = X USD (jonli, ~60s keshlanadi). Provider yo'q bo'lsa null","example":5.23},"uzs_per_usd":{"type":"number","description":"1 USD = X UZS","example":12500}}},"stars":{"type":"object","properties":{"min":{"type":"integer","example":50},"max":{"type":"integer","example":10000},"usdt_per_star":{"type":"number","example":0.0153},"ton_per_star":{"type":"number","nullable":true,"example":0.00287},"uzs_per_star":{"type":"integer","example":188}}},"premium":{"type":"object","properties":{"months":{"type":"array","items":{"type":"integer"},"example":[3,6,12]},"usdt":{"type":"object","example":{"3":12,"6":16,"12":29}},"ton":{"type":"object","nullable":true,"example":{"3":2.29,"6":3.06,"12":5.54}},"uzs":{"type":"object","example":{"3":150000,"6":200000,"12":362500}}}},"payment_method":{"type":"string","example":"usdt_ton"},"updated_at":{"type":"string","format":"date-time"}}},"SearchRequest":{"type":"object","required":["product_type","query"],"properties":{"product_type":{"type":"string","enum":["stars","premium","ads"],"description":"Mahsulot turi","example":"stars"},"query":{"type":"string","description":"Telegram @username yoki identifikator","example":"durov"},"quantity":{"type":"string","description":"Stars miqdori (product_type=stars uchun)","example":"50"},"months":{"type":"string","description":"Premium muddati (product_type=premium uchun)","example":"3"},"amount":{"type":"string","description":"Ads miqdori (product_type=ads uchun)","example":"1"}},"example":{"product_type":"stars","query":"durov","quantity":"50"}},"SearchResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"found":{"type":"object","properties":{"myself":{"type":"boolean","example":false,"description":"Qabul qiluvchi o'zingizmi"},"name":{"type":"string","example":"Mirshod","description":"Profil ismi"},"photo":{"type":"string","format":"uri","example":"https://cdn4.telesco.pe/file/abc123.jpg","description":"Profil rasmi URL'i"},"recipient":{"type":"string","description":"Qabul qiluvchi username (xaridda shu ishlatiladi)","example":"durov"},"premium":{"type":"boolean","nullable":true,"description":"Faqat product_type=premium da qaytadi: profil allaqachon Telegram Premium'ga egami. Aniqlab bo'lmasa null.","example":false}}}}},"StarsRequest":{"type":"object","required":["username","stars"],"properties":{"username":{"type":"string","description":"Telegram @username ( @ ixtiyoriy, 3–32 belgi )","example":"durov"},"stars":{"type":"integer","minimum":50,"maximum":10000,"description":"Stars soni (50–10000)","example":500},"idempotency_key":{"type":"string","maxLength":128,"description":"Takroriy so'rovda bir xil natija qaytadi — bir buyurtmaga bir unikal kalit. Tarmoq xatosida xavfsiz qayta yuborish uchun majburiy tavsiya etiladi.","example":"order-12345"}},"example":{"username":"durov","stars":500,"idempotency_key":"order-12345"}},"PremiumRequest":{"type":"object","required":["username","months"],"properties":{"username":{"type":"string","example":"durov"},"months":{"type":"integer","enum":[3,6,12],"description":"Premium muddati (oy)","example":3},"idempotency_key":{"type":"string","maxLength":128,"example":"order-12346"}},"example":{"username":"durov","months":3,"idempotency_key":"order-12346"}},"PurchaseResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"order_id":{"type":"integer","example":1},"idempotency_key":{"type":"string","nullable":true,"example":"order-12345"},"product_type":{"type":"string","enum":["stars","premium"]},"username":{"type":"string","example":"durov"},"amount":{"type":"integer","description":"stars soni yoki premium oylar","example":500},"stars":{"type":"integer","nullable":true,"example":500},"months":{"type":"integer","nullable":true,"example":null},"usdt_charged":{"type":"number","example":7.5},"status":{"type":"string","enum":["processing","completed","failed"],"example":"completed"},"transaction_id":{"type":"string","nullable":true,"example":"frg_abc123"},"error":{"type":"string","nullable":true,"example":null},"balance_remaining_usdt":{"type":"number","example":21},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true}}},"OrderSummary":{"type":"object","properties":{"order_id":{"type":"integer","example":42},"product_type":{"type":"string","enum":["stars","premium","steam","game"],"example":"stars"},"username":{"type":"string","example":"durov","description":"Telegram username — `steam` da bu Steam login"},"amount":{"type":"number","example":500,"description":"stars soni | premium oylari | steam nominal (USD)"},"steam_login":{"type":"string","nullable":true,"description":"Faqat `product_type=steam` da","example":null},"steam_amount_usd":{"type":"number","nullable":true,"description":"Faqat `product_type=steam` da — Steam'ga tushgan nominal","example":null},"usdt_charged":{"type":"number","example":7.5},"status":{"type":"string","enum":["processing","completed","failed"],"example":"completed"},"transaction_id":{"type":"string","nullable":true,"example":"frg_abc123"},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true}}},"OrdersListResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer","example":2},"orders":{"type":"array","items":{"$ref":"#/components/schemas/OrderSummary"}}}},"SandboxPurchaseResponse":{"type":"object","properties":{"test":{"type":"boolean","example":true,"description":"Har doim true — bu sandbox javobi"},"success":{"type":"boolean","example":true},"order_id":{"type":"integer","example":9999},"idempotency_key":{"type":"string","nullable":true},"product_type":{"type":"string","enum":["stars","premium"]},"username":{"type":"string"},"amount":{"type":"integer"},"stars":{"type":"integer","nullable":true},"months":{"type":"integer","nullable":true},"usdt_charged":{"type":"number","example":7.5,"description":"Real bo'lganda yechilishi kerak bo'lgan summa (haqiqatda yechilmaydi)"},"status":{"type":"string","enum":["completed"],"example":"completed"},"transaction_id":{"type":"string","example":"test_1718000000_abc123"},"error":{"type":"string","nullable":true,"example":null},"balance_remaining_usdt":{"type":"number","example":100,"description":"O'zgarmagan balans"},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time"}}},"InsufficientResponse":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"USDT balans yetarli emas"},"required_usdt":{"type":"number","example":7.5},"balance_usdt":{"type":"number","example":2}}},"SteamRequest":{"type":"object","required":["login","amount_usd"],"properties":{"login":{"type":"string","description":"Steam akkaunt **login'i** (email yoki ko'rinadigan nik EMAS).\n\nKechirimli qabul qilinadi: `mylogin`, `https://steamcommunity.com/id/mylogin`. Email va `/profiles/7656119...` (SteamID) rad etiladi — ular bilan to'ldirib bo'lmaydi.","example":"mysteamlogin"},"amount_usd":{"type":"number","format":"double","minimum":1,"maximum":400,"description":"Steam hamyoniga tushadigan **nominal** summa (USD, ko'pi bilan 2 kasr xona). Amaldagi chegaralarni `GET /v1/steam/pricing` beradi (hozir $1–$400).\n\n⚠️ Bu **balansdan yechiladigan summa emas** — yechiladigani nominal + ustama (`usdt_charged`).","example":10},"idempotency_key":{"type":"string","maxLength":128,"description":"Takroriy so'rovda bir xil natija qaytadi. Steam'da **ayniqsa muhim**: yetkazish asinxron, shuning uchun tarmoq uzilsa xavfsiz qayta yuborishning yagona yo'li shu.","example":"steam-order-777"}},"example":{"login":"mysteamlogin","amount_usd":10,"idempotency_key":"steam-order-777"}},"SteamOrderResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true,"description":"`status === \"completed\"` bo'lgandagina `true`. `processing` da `false`."},"order_id":{"type":"integer","example":128},"idempotency_key":{"type":"string","nullable":true,"example":"steam-order-777"},"product_type":{"type":"string","enum":["steam"],"example":"steam"},"steam_login":{"type":"string","example":"mysteamlogin"},"steam_amount_usd":{"type":"number","example":10,"description":"Steam hamyoniga tushgan nominal (USD)"},"steam_markup_usdt":{"type":"number","example":0.51,"description":"Bizning **sof foydamiz**. Ustama nominalga emas, tannarxga (nominal + provayder komissiyasi) qo'llanadi, shuning uchun bu son aynan `markup_percent` foizga teng — provayder komissiyasidan mustaqil."},"amount":{"type":"number","example":10,"description":"Mahsulot miqdori — Steam uchun bu nominal USD (Stars'da — stars soni)"},"usdt_charged":{"type":"number","example":10.71,"description":"Balansdan **haqiqatda yechilgan** summa = (nominal + provayder komissiyasi) × (1 + ustama%), 2 kasr xonaga yaxlitlangan. Aniq qiymatni oldindan `GET /v1/steam/pricing` beradi."},"status":{"type":"string","enum":["processing","completed","failed"],"example":"completed","description":"`processing` — provayder navbatida, yakuni hali noma'lum (HTTP 202).\n`completed` — Steam hamyoni to'ldirildi.\n`failed` — amalga oshmadi, balans **qaytarildi**."},"transaction_id":{"type":"string","nullable":true,"example":"b7034b62-a10e-409c-a89e-16accbf7cd06","description":"Provayder order UUID — support bilan bog'lanishda shu id ishlatiladi"},"error":{"type":"string","nullable":true,"example":null},"balance_remaining_usdt":{"type":"number","example":89.5},"pending":{"type":"boolean","nullable":true,"example":null,"description":"Faqat `processing` da: `true`. Holatni `/v1/steam/{order_id}` bilan kuzating."},"refunded":{"type":"boolean","nullable":true,"example":null,"description":"Faqat `failed` da: balans qaytarilganmi"},"error_code":{"type":"string","nullable":true,"enum":["login_not_supported","invalid_amount","provider_error","provider_balance","provider_unavailable","order_not_found","expired","disabled"],"description":"Mashina o'qiy oladigan xato sababi (faqat xatoda)","example":null},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true}}},"SteamQuote":{"type":"object","description":"Narx tafsiloti. **Ustama nominalga emas, tannarxga (nominal + provayder komissiyasi) qo'llanadi** — `total_usd = (amount_usd + provider_fee_usd) × (1 + markup_percent/100)`, 2 kasr xonaga yaxlitlangan. Shu tufayli sof foydangiz doim aniq `markup_percent`ga teng, provayder o'z komissiyasini o'zgartirsa ham.","properties":{"amount_usd":{"type":"number","example":10,"description":"Nominal — Steam hamyoniga tushadi"},"provider_fee_usd":{"type":"number","example":0.2,"description":"Provayder (Play Wallet) nominaldan oladigan komissiya"},"cost_usd":{"type":"number","example":10.2,"description":"Bizning haqiqiy tannarx = amount_usd + provider_fee_usd — ustama shu summaga qo'shiladi"},"markup_percent":{"type":"number","example":5,"description":"Sof foyda foizi (tannarxga nisbatan)"},"markup_usdt":{"type":"number","example":0.51,"description":"Sof foyda summasi = cost_usd × markup_percent / 100"},"total_usdt":{"type":"number","example":10.71,"description":"Balansdan yechiladigan jami = cost_usd + markup_usdt, 2 kasr xonaga yaxlitlangan"}}},"SteamPricingResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"currency":{"type":"string","example":"USDT"},"min_usd":{"type":"number","example":1},"max_usd":{"type":"number","example":400},"markup_percent":{"type":"number","example":5,"description":"Sizning kalitingizga amal qiladigan ustama (sof foyda) foizi — shaxsiy tarif bo'lishi mumkin"},"provider_fee_ratio":{"type":"number","example":0.02,"description":"Play Wallet joriy komissiyasi (0.02 = 2%) — faqat ma'lumot uchun, narx hisobida avtomatik hisobga olinadi"},"examples":{"type":"array","items":{"$ref":"#/components/schemas/SteamQuote"},"description":"Tayyor namuna narxlar — UI'da tugma chizish uchun"},"quote":{"allOf":[{"$ref":"#/components/schemas/SteamQuote"}],"nullable":true,"description":"Faqat `amount_usd` berilganda to'ladi"}}},"GamesListResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"markup_percent":{"type":"number","example":5,"description":"Sizning kalitingizga amal qiladigan ustama foizi — shaxsiy tarif bo'lishi mumkin"},"games":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"pubgm","description":"Barcha `/v1/games/{code}/...` yo'llarida ishlatiladi"},"name":{"type":"string","example":"PUBG Mobile"},"image_url":{"type":"string","nullable":true},"required_fields":{"type":"array","items":{"type":"string"},"example":["userid"],"description":"Buyurtma uchun MAJBURIY maydonlar. Formani **aynan shunga qarab** chizing — `serverid` bor bo'lsa `server_id` yuborish shart."},"needs_server":{"type":"boolean","example":false,"description":"`required_fields` dan hosila — qulaylik uchun"},"notes":{"type":"string","nullable":true,"example":"Not available for China, Japan, Korea, Taiwan and Vietnam region","description":"Provayderning mintaqaviy cheklov izohi (bo'lsa)"}}}}}},"GameCatalogueResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"currency":{"type":"string","example":"USDT"},"markup_percent":{"type":"number","example":5},"game":{"type":"object","properties":{"code":{"type":"string","example":"pubgm"},"required_fields":{"type":"array","items":{"type":"string"},"example":["userid"]},"needs_server":{"type":"boolean","example":false},"notes":{"type":"string","nullable":true}}},"denominations":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"60","description":"Buyurtmada `denomination` sifatida **aynan shu satrni** yuboring. ⚠️ Prefiks bo'yicha moslashtirmang: `\"60\"` (haqiqiy UC) va `\"60 WOW Coins\"` — ikki xil mahsulot."},"price_usdt":{"type":"number","example":0.9345,"description":"Balansdan **aynan shuncha** yechiladi (tannarx + ustama, 4 kasr xona)"},"eta":{"type":"object","nullable":true,"description":"Faqat `?eta=1` bilan so'ralganda","properties":{"label":{"type":"string","example":"less_than_5_minutes"},"display":{"type":"string","example":"Less than 5 minutes"},"median_seconds":{"type":"integer","example":243}}}}}}}},"GameCheckPlayerRequest":{"type":"object","required":["player_id"],"properties":{"player_id":{"type":"string","example":"51221257198","description":"O'yinchining in-game ID si"},"server_id":{"type":"string","nullable":true,"example":"18148","description":"Faqat talab qiladigan o'yinlarda (`needs_server: true`) — masalan Mobile Legends"}},"example":{"player_id":"51221257198"}},"GameCheckPlayerResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"valid":{"type":"boolean","example":true},"game_code":{"type":"string","example":"pubgm"},"player_id":{"type":"string","example":"51221257198"},"server_id":{"type":"string","nullable":true,"example":null},"player_name":{"type":"string","example":"MirshodforwarD","description":"O'yin ichidagi nik — **xaridorga aynan shuni ko'rsating va tasdiqlating**"}}},"GameOrderRequest":{"type":"object","required":["denomination","player_id"],"properties":{"denomination":{"type":"string","example":"60","description":"Katalogdagi `name` satri, **o'zgartirilmagan holda**. `GET /v1/games/{code}/catalogue` javobidan aynan nusxa oling."},"player_id":{"type":"string","example":"51221257198"},"server_id":{"type":"string","nullable":true,"example":null,"description":"Talab qiladigan o'yinlarda majburiy"},"idempotency_key":{"type":"string","nullable":true,"example":"game-order-1001","description":"Takroriy so'rovda bir xil natija qaytadi — **pul ikki marta yechilmaydi**. Tarmoq uzilsa aynan shu kalit bilan qayta yuboring."}},"example":{"denomination":"60","player_id":"51221257198","idempotency_key":"game-order-1001"}},"GameOrderResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"order_id":{"type":"integer","example":1001,"description":"BIZNING buyurtma id — status so'rashda shu ishlatiladi"},"idempotency_key":{"type":"string","nullable":true,"example":"game-order-1001"},"product_type":{"type":"string","enum":["game"],"example":"game"},"game_code":{"type":"string","example":"pubgm"},"denomination":{"type":"string","example":"60"},"player_id":{"type":"string","example":"51221257198"},"server_id":{"type":"string","nullable":true,"example":null},"player_name":{"type":"string","nullable":true,"example":"MirshodforwarD","description":"Kredit tushgan akkaunt nikni — chek/kvitansiyada ko'rsating"},"usdt_charged":{"type":"number","example":0.9345,"description":"Balansdan yechilgan summa"},"balance_after":{"type":"number","nullable":true,"example":41.0655},"status":{"type":"string","enum":["processing","completed","failed"],"example":"processing","description":"`processing` — bajarilmoqda (kuzating).\n`completed` — o'yinchi akkauntiga tushdi.\n`failed` — bajarilmadi, **mablag' qaytarildi**."},"provider_order_id":{"type":"integer","nullable":true,"example":1327432,"description":"Provayder tomonidagi id — qo'llab-quvvatlashga murojaatda ayting"},"provider_status":{"type":"string","nullable":true,"example":"PROCESSING"},"refunded":{"type":"boolean","example":true,"description":"Faqat `failed` da — mablag' qaytarilgani"},"error":{"type":"string","nullable":true},"poll":{"type":"boolean","example":true,"description":"Faqat `processing` da: `GET /v1/games/orders/{order_id}` bilan kuzating"},"created_at":{"type":"string","format":"date-time"},"completed_at":{"type":"string","format":"date-time","nullable":true}}}}},"security":[{"ApiKeyHeader":[]},{"BearerAuth":[]}],"paths":{"/v1/health":{"get":{"tags":["Health"],"operationId":"getHealth","summary":"API va Fragment holati","description":"Ochiq probe — kalit talab qilinmaydi. Integratsiyani tekshirish uchun birinchi chaqiriladigan endpoint.","security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/balance":{"get":{"tags":["Health"],"operationId":"getBalance","summary":"Qolgan USDT balans","description":"API kalitiga bog'langan USDT hamyon qoldig'i.","responses":{"200":{"description":"Balans","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"401":{"description":"API kalit noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pricing":{"get":{"tags":["Health"],"operationId":"getPricing","summary":"Narxlar (USDT)","description":"Stars va Premium uchun joriy tariflar hamda chegaralar.","responses":{"200":{"description":"Tariflar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingResponse"}}}},"401":{"description":"API kalit noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/rates":{"get":{"tags":["Health"],"operationId":"getLiveRates","summary":"Real-vaqt narxlar (jonli TON kursi + TON/UZS ekvivalenti)","description":"`/v1/pricing` bilan bir xil USDT tariflar, lekin **jonli TON→USD kursi** (TONAPI'dan, ~60s keshlanadi) hamda har mahsulot uchun hisoblangan **TON** va **UZS** ekvivalentlari bilan. Asosiy narx har doim USDT — faqat `ton`/`uzs` maydonlari kursga qarab o'zgaradi. TON provider mavjud bo'lmasa `ton` maydonlari `null` qaytadi (USDT/UZS baribir keladi).","responses":{"200":{"description":"Jonli narxlar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveRatesResponse"}}}},"401":{"description":"API kalit noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/search":{"post":{"tags":["Search"],"operationId":"searchRecipient","summary":"Qabul qiluvchini qidirish (profil tekshiruvi)","description":"Telegram username bo'yicha profil (nik + rasm) qaytaradi. Pul yechilmaydi — buyurtmadan oldin tasdiqlash uchun.\n\n**Stars** (`product_type=stars`): nik + rasm.\n\n**Premium** (`product_type=premium`): nik + rasm + `premium` maydoni (profil allaqachon Premium'ga egami; aniqlab bo'lmasa `null`).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Recipient topildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Recipient topilmadi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Search API xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/stars":{"post":{"tags":["Stars"],"operationId":"buyStars","summary":"Stars yuborish (Fragment USDT TON)","description":"Telegram Stars yetkazadi. Balans atomik yechiladi, Fragment orqali yetkaziladi. Fragment xatosida balans avtomatik qaytariladi (`502`). Idempotency uchun `idempotency_key` bering.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarsRequest"}}}},"responses":{"200":{"description":"Muvaffaqiyat yoki idempotent javob","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Balans yetarli emas (pul yechilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsufficientResponse"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Fragment xatosi (balans qaytariladi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"503":{"description":"Fragment sozlanmagan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/premium":{"post":{"tags":["Premium"],"operationId":"buyPremium","summary":"Premium yuborish (Fragment USDT TON)","description":"Telegram Premium obunasini yetkazadi (3 / 6 / 12 oy). Stars bilan bir xil oqim: atomik balans, avtomatik refund, idempotency.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PremiumRequest"}}}},"responses":{"200":{"description":"Muvaffaqiyat","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Balans yetarli emas (pul yechilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsufficientResponse"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Fragment xatosi (balans qaytariladi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Fragment sozlanmagan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/steam/pricing":{"get":{"tags":["Steam"],"operationId":"getSteamPricing","summary":"Steam narxi va chegaralari","description":"Chegaralar, sizning ustama foizingiz va (`amount_usd` berilsa) **aniq yakuniy narx**.\n\nBuyurtmadan oldin shu endpointdan foydalaning — hisobni o'zingizda takrorlamang, yaxlitlash farqi bo'lmaydi.\n\nChegaralar provayderdan **jonli** olinadi, shuning uchun ular o'zgarsa javob o'zi yangilanadi.","parameters":[{"name":"amount_usd","in":"query","required":false,"description":"Berilsa — aynan shu summa uchun `quote` qaytadi","schema":{"type":"number","format":"double","example":10}}],"responses":{"200":{"description":"Narxlar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamPricingResponse"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Steam o'chirilgan yoki provayder mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/steam":{"post":{"tags":["Steam"],"operationId":"topUpSteam","summary":"Steam hamyonini to'ldirish","description":"Steam login bo'yicha hamyonni USD nominalda to'ldiradi.\n\n**Balansdan yechiladigan summa** = `amount_usd` + ustama. Aniq qiymatni oldindan `GET /v1/steam/pricing?amount_usd=...` beradi.\n\n### Javob kodlari — muhim farq\n| Kod | Ma'nosi | Nima qilish |\n|---|---|---|\n| `200` | `completed` — Steam to'ldirildi | tugadi |\n| `202` | `processing` — provayder navbatida | `GET /v1/steam/{order_id}` bilan kuzating |\n| `402` | balans yetarli emas | **pul yechilmagan** |\n| `502` | provayder rad etdi | **pul qaytarildi** (`refunded: true`) |\n| `503` | vaqtincha mavjud emas | keyinroq qayta urining |\n\n⚠️ **`202` ni xato deb hisoblamang** — buyurtma qabul qilingan va bajarilmoqda.\n\n### Idempotentlik\n`idempotency_key` bering. Tarmoq uzilib, javobni olmasangiz — **aynan o'sha kalit bilan** qayta yuboring: ikkinchi marta pul yechilmaydi, avvalgi buyurtma qaytadi.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamRequest"}}}},"responses":{"200":{"description":"To'ldirildi (yoki idempotent takror)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamOrderResponse"}}}},"202":{"description":"Qabul qilindi — bajarilmoqda (`status: processing`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamOrderResponse"}}}},"400":{"description":"Login yoki summa noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Balans yetarli emas (pul yechilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsufficientResponse"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Provayder rad etdi — balans qaytarildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamOrderResponse"}}}},"503":{"description":"Steam vaqtincha mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/steam/{order_id}":{"get":{"tags":["Steam"],"operationId":"getSteamOrder","summary":"Steam buyurtmasi holati","description":"Buyurtma holati. Hali `processing` bo'lsa, provayderdan **jonli** holat so'raladi — ya'ni javob har doim eng yangi.\n\nTavsiya: 3–5 soniyada bir marta, 15 daqiqagacha. `completed` yoki `failed` — terminal holat, undan keyin so'rash shart emas.","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Buyurtma holati","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamOrderResponse"}}}},"400":{"description":"order_id noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topilmadi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/games":{"get":{"tags":["Games"],"operationId":"listGames","summary":"Sotuvdagi o'yinlar","description":"Qo'llab-quvvatlanadigan o'yinlar va **har biri qanday maydon talab qilishi**.\n\n`required_fields` ni o'qing va formani shunga qarab chizing: `server_id` ba'zi o'yinlarda majburiy (Mobile Legends), ba'zilarida umuman ishlatilmaydi (PUBG Mobile).","responses":{"200":{"description":"O'yinlar ro'yxati","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GamesListResponse"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"O'yin to'ldirish o'chirilgan yoki provayder mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/games/{code}/catalogue":{"get":{"tags":["Games"],"operationId":"getGameCatalogue","summary":"Nominallar va narxlar","description":"Nominallar va **siz to'laydigan yakuniy narx** (`price_usdt`). Hisobni o'zingizda takrorlamang — ustama va yaxlitlash shu yerda qo'llanadi.\n\n⚠️ **Narx valyuta kursi bilan o'zgaradi.** Buyurtmadan oldin qayta o'qing: eskirgan narx bo'yicha xaridorga aytilgan summa haqiqiy yechilgan summadan farq qilishi mumkin.\n\n⚠️ **`name` ni aynan uzating.** Katalogda o'xshash nomlar yonma-yon turadi — PUBG'da `\"60\"` (haqiqiy UC) va `\"60 WOW Coins\"` (boshqa mahsulot). Prefiks bo'yicha moslashtirish xato mahsulot sotishga olib keladi.","parameters":[{"name":"code","in":"path","required":true,"description":"O'yin kodi — `GET /v1/games` dan oling (`pubgm`, `mlbb_global`)","schema":{"type":"string","example":"pubgm"}},{"name":"eta","in":"query","required":false,"description":"`1` bo'lsa har nominal uchun yetkazish vaqti bashorati ham qo'shiladi (sekinroq)","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"Katalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameCatalogueResponse"}}}},"400":{"description":"O'yin qo'llab-quvvatlanmaydi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Provayder vaqtincha mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/games/{code}/check-player":{"post":{"tags":["Games"],"operationId":"checkGamePlayer","summary":"O'yinchi ID sini tekshirish (bepul)","description":"O'yinchi ID sini tekshiradi va **in-game nikni** qaytaradi. Pul yechilmaydi.\n\n### Buni har doim buyurtmadan oldin chaqiring\nNoto'g'ri ID ga yuborilgan UC yoki olmosni **qaytarib bo'lmaydi** — na biz, na provayder, na o'yin ishlab chiqaruvchisi uni bekor qila oladi. Nikni xaridorga ko'rsatib tasdiqlating: bir qadamlik tekshiruv eng qimmat xatoning oldini oladi.","parameters":[{"name":"code","in":"path","required":true,"description":"O'yin kodi — `GET /v1/games` dan oling (`pubgm`, `mlbb_global`)","schema":{"type":"string","example":"pubgm"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameCheckPlayerRequest"}}}},"responses":{"200":{"description":"O'yinchi topildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameCheckPlayerResponse"}}}},"400":{"description":"ID noto'g'ri yoki `server_id` yetishmayapti","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Provayder vaqtincha mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/games/{code}/order":{"post":{"tags":["Games"],"operationId":"createGameOrder","summary":"O'yin akkauntini to'ldirish","description":"Kreditni o'yinchi akkauntiga to'g'ridan-to'g'ri yozadi.\n\n**Balansdan yechiladigan summa** = katalogdagi `price_usdt`.\n\n### Javob kodlari — muhim farq\n| Kod | Ma'nosi | Nima qilish |\n|---|---|---|\n| `200` | `completed` — akkauntga tushdi | tugadi |\n| `202` | `processing` — bajarilmoqda | `GET /v1/games/orders/{order_id}` bilan kuzating |\n| `400` | ID/nominal noto'g'ri | **pul yechilmagan** |\n| `402` | balans yetarli emas | **pul yechilmagan** |\n| `502` | provayder rad etdi | **pul qaytarildi** (`refunded: true`) |\n| `503` | vaqtincha mavjud emas | keyinroq qayta urining |\n\n⚠️ **`202` ni xato deb hisoblamang** — buyurtma qabul qilingan. O'lchangan yetkazish vaqti: PUBG Mobile ~2 daqiqa, Mobile Legends ~1 daqiqa.\n\n### Idempotentlik\n`idempotency_key` bering. Tarmoq uzilib javobni olmasangiz — **aynan o'sha kalit bilan** qayta yuboring: ikkinchi marta pul yechilmaydi va ikkinchi buyurtma yaratilmaydi.","parameters":[{"name":"code","in":"path","required":true,"description":"O'yin kodi — `GET /v1/games` dan oling (`pubgm`, `mlbb_global`)","schema":{"type":"string","example":"pubgm"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameOrderRequest"}}}},"responses":{"200":{"description":"Yetkazildi (yoki idempotent takror)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameOrderResponse"}}}},"202":{"description":"Qabul qilindi — bajarilmoqda (`status: processing`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameOrderResponse"}}}},"400":{"description":"O'yinchi ID, nominal yoki `server_id` noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Balans yetarli emas (pul yechilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsufficientResponse"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Provayder rad etdi — balans qaytarildi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameOrderResponse"}}}},"503":{"description":"O'yin to'ldirish vaqtincha mavjud emas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/games/orders/{order_id}":{"get":{"tags":["Games"],"operationId":"getGameOrder","summary":"O'yin buyurtmasi holati","description":"Buyurtma holati. Hali `processing` bo'lsa provayderdan **jonli** holat so'raladi — javob har doim eng yangi.\n\nTavsiya: 3–5 soniyada bir marta. `completed` yoki `failed` — terminal holat, undan keyin so'rash shart emas.\n\n`failed` bo'lsa mablag' **avtomatik qaytarilgan** (`refunded: true`) — qo'shimcha hech narsa qilish shart emas.","parameters":[{"name":"order_id","in":"path","required":true,"description":"BIZNING buyurtma id (`order_id`), provayderniki emas","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Buyurtma holati","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameOrderResponse"}}}},"400":{"description":"order_id noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topilmadi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/orders":{"get":{"tags":["Orders"],"operationId":"listOrders","summary":"So'nggi buyurtmalar ro'yxati","description":"API kalitiga tegishli oxirgi buyurtmalar (eng yangisi birinchi).","parameters":[{"name":"limit","in":"query","required":false,"description":"Nechta buyurtma qaytsin (1–100, default 20)","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Buyurtmalar ro'yxati","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrdersListResponse"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/orders/{order_id}":{"get":{"tags":["Orders"],"operationId":"getOrder","summary":"Bitta buyurtma holati","description":"ID bo'yicha buyurtma (faqat o'z buyurtmalaringiz).","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Buyurtma","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"400":{"description":"order_id noto'g'ri","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Topilmadi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/test/v1/stars":{"post":{"tags":["Sandbox"],"operationId":"sandboxBuyStars","summary":"[TEST] Stars yuborish — sandbox","description":"Real `/v1/stars` bilan bir xil so'rov formati. Balans yechilmaydi, Fragment chaqirilmaydi.\n\nJavobda `\"test\": true` va `\"transaction_id\": \"test_...\"` bo'ladi.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StarsRequest"}}}},"responses":{"200":{"description":"Sandbox muvaffaqiyat (real yetkazilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxPurchaseResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/test/v1/premium":{"post":{"tags":["Sandbox"],"operationId":"sandboxBuyPremium","summary":"[TEST] Premium yuborish — sandbox","description":"Real `/v1/premium` bilan bir xil so'rov formati. Balans yechilmaydi, Fragment chaqirilmaydi.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PremiumRequest"}}}},"responses":{"200":{"description":"Sandbox muvaffaqiyat (real yetkazilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxPurchaseResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/test/v1/steam":{"post":{"tags":["Sandbox"],"operationId":"sandboxTopUpSteam","summary":"[TEST] Steam to'ldirish — sandbox","description":"Real `/v1/steam` bilan bir xil so'rov va javob formati. Balans yechilmaydi, provayder chaqirilmaydi, hech qanday Steam akkaunt to'ldirilmaydi.\n\nJavobda `\"test\": true` va `transaction_id` `test_...` bilan boshlanadi.\n\n⚠️ Sandbox har doim **darhol `completed`** qaytaradi. Realda buyurtma avval `processing` (202) bo'lishi mumkin — integratsiyangiz ikkala yo'lni ham qo'llab-quvvatlasin.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamRequest"}}}},"responses":{"200":{"description":"Sandbox muvaffaqiyat (real to'ldirilmaydi)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SteamOrderResponse"}}}},"400":{"description":"Validatsiya xatosi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"API kalit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}