Asosiy kontentga o'tish
MilliySavdo

Tezkor start

5 daqiqada: test kalit oling, davlatlar ro'yxatini ko'ring, birinchi virtual raqamni oling va SMS kodni qabul qiling.

1. Test kalit oling#

Kabinet → API kalitlar sahifasida Test rejimidagi kalit yarating. Kalit ms_test_ bilan boshlanadi va faqat bir marta ko'rsatiladi. Uni muhit o'zgaruvchisiga saqlang:

Terminal
export MILLIYSAVDO_API_KEY="ms_test_…"

Maslahat

Test kalitlar sandboxda ishlaydi: raqamlar simulyatsiya qilinadi, pul yechilmaydi, SMS ~8 soniyada keladi.

2. Kalitni tekshiring#

GET /v1/me kalit qaysi rejimda ekani, ruxsatlari va limitlarini qaytaradi.

curl 'https://api.milliysavdo.uz/v1/me' \
  -H "Authorization: Bearer $MILLIYSAVDO_API_KEY"
{
  "object": "api_key_info",
  "mode": "test",
  "key": {
    "name": "Backend server",
    "prefix": "ms_test_TeqriX…nZa9",
    "mode": "test",
    "scopes": [
      "catalog:read",
      "balance:read",
      "orders:read",
      "orders:write"
    ],
    "expires_at": "2027-10-16T02:13:52.090617Z"
  },
  "account": {
    "tier": "production",
    "company_name": "Acme LLC"
  },
  "limits": {
    "rate_limit_per_minute": 600,
    "daily_request_quota": 500000,
    "monthly_request_quota": 10000000,
    "daily_order_limit": 5000,
    "max_active_orders": 100,
    "discount_percent": "10.00"
  }
}

3. Davlat va xizmatni tanlang#

Davlatlar ro'yxatidan id ni, keyin narxlardan kerakli xizmat code ini oling. Masalan, Telegram uchun service_code=907:

curl 'https://api.milliysavdo.uz/v1/prices?service_code=907&limit=3' \
  -H "Authorization: Bearer $MILLIYSAVDO_API_KEY"
{
  "object": "list",
  "data": [
    {
      "country": {
        "id": 6,
        "name": "United States",
        "iso_code": "US"
      },
      "service": {
        "code": "907",
        "title": "Telegram"
      },
      "in_stock": 1239,
      "available": true,
      "price": {
        "amount": "3842.44",
        "amount_cents": 384244,
        "retail_amount": "4269.38",
        "retail_amount_cents": 426938,
        "discount_percent": "10.00",
        "currency": "UZS"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

4. Raqam oling#

POST /v1/orders raqam ajratadi. Idempotency-Key yuboring — tarmoq uzilib qayta yuborsangiz, ikkinchi raqam olinmaydi (batafsil).

curl -X POST 'https://api.milliysavdo.uz/v1/orders' \
  -H "Authorization: Bearer $MILLIYSAVDO_API_KEY" \
  -H 'Idempotency-Key: 8f14e45f-ceea-4e1a-9b2c-0d3c5e7a1b20' \
  -H "Content-Type: application/json" \
  -d '{"country_id":6,"service_code":"907"}'
{
  "id": "ord_test_14",
  "object": "order",
  "mode": "test",
  "status": "waiting_sms",
  "phone": "+1888582997",
  "sms_code": null,
  "country": {
    "id": 6,
    "name": "United States",
    "iso_code": null
  },
  "service": {
    "code": "907",
    "title": "Telegram"
  },
  "price": {
    "amount": "3842.44",
    "amount_cents": 384244,
    "retail_amount": "4269.38",
    "retail_amount_cents": 426938,
    "discount_percent": "10.00",
    "currency": "UZS"
  },
  "created_at": "2026-10-16T02:13:52.251868Z",
  "expires_at": "2026-10-16T02:33:52.251868Z",
  "completed_at": null
}

5. SMS kodni oling#

Ikki usul bor:

  • Webhook (tavsiya): order.sms_received hodisasi serveringizga keladi — sozlash.
  • Polling: har 3–5 soniyada GET /v1/orders/{id} ni chaqiring, status waiting_sms dan o'zgarguncha.
curl 'https://api.milliysavdo.uz/v1/orders/ord_test_14' \
  -H "Authorization: Bearer $MILLIYSAVDO_API_KEY"
{
  "id": "ord_test_14",
  "object": "order",
  "mode": "test",
  "status": "sms_received",
  "phone": "+1888582997",
  "sms_code": "636841",
  "country": {
    "id": 6,
    "name": "United States",
    "iso_code": null
  },
  "service": {
    "code": "907",
    "title": "Telegram"
  },
  "price": {
    "amount": "3842.44",
    "amount_cents": 384244,
    "retail_amount": "4269.38",
    "retail_amount_cents": 426938,
    "discount_percent": "10.00",
    "currency": "UZS"
  },
  "created_at": "2026-10-16T02:13:52.251868Z",
  "expires_at": "2026-10-16T02:33:52.251868Z",
  "completed_at": "2026-10-16T02:13:52.301158Z"
}

Polling misoli (Python):

Python
import os, time, requests

API = "https://api.milliysavdo.uz/v1"
H = {"Authorization": f"Bearer {os.environ['MILLIYSAVDO_API_KEY']}"}

def wait_for_sms(order_id: str, timeout: int = 20 * 60) -> str | None:
    deadline = time.time() + timeout
    while time.time() < deadline:
        order = requests.get(f"{API}/orders/{order_id}", headers=H, timeout=30).json()
        if order["status"] == "sms_received":
            return order["sms_code"]
        if order["status"] in ("cancelled", "expired", "failed"):
            return None  # pul avtomatik qaytarilgan
        time.sleep(4)
    return None

6. Live ga o'ting#

Integratsiya tayyor bo'lgach, production ruxsatiga ariza bering. Tasdiqlangach, ms_live_ kalit yarating va faqat kalitni almashtiring — so'rov va javob formatlari bir xil. Live buyurtmalar MilliySavdo balansingizdan yechiladi; SMS 20 daqiqada kelmasa pul avtomatik qaytadi.