TEZT Savollar API v1.0.0 openapi.json

Savollar API

YHQ (yo'l harakati qoidalari) imtihon savollari, biletlari va rasmlariga ochiq, faqat o'qish uchun API. Har so'rov X-API-Key sarlavhasi bilan.

Kalit faqat brauzeringizda (shu varaq yopilguncha) saqlanadi va "Yuborish" tugmalari uchun ishlatiladi. Kalitni administratordan oling: Admin panel → API kalitlar.

Kalit va so'rov

Barcha so'rovlar https://prava.tezt.uz/api/v1 ga yuboriladi va X-API-Key sarlavhasini talab qiladi. Kalitni brauzer/ilova kodiga qattiq yozmang: mobil ilovada uni serveringiz orqali o'tkazing yoki kalitni domen/IP ro'yxati bilan cheklang. Rasmlar uchun alohida imzolangan havolalar beriladi (<img src> da ishlaydi).

curl -H "X-API-Key: YOUR_API_KEY" "https://prava.tezt.uz/api/v1/public/meta"

Kalit ruxsatlari (scope): questions:read · tickets:read · images:read · answers:read. Har endpoint o'ziga kerak ruxsatni ko'rsatadi.

Javob formati

Barcha javoblar JSON. Muvaffaqiyat: {"ok":true,"data":{…},"request_id":"…"}. Xato: {"ok":false,"error":{"code":"…","message":"…"},"request_id":"…"} (+ mos HTTP kod). request_id (va X-Request-Id sarlavhasi) — muammo haqida yozganda shuni ko'rsating.

Limit va kesh

Har kalitning daqiqalik va kunlik limiti bor. Har javobda: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (UNIX vaqt) va X-RateLimit-Daily-Limit/Remaining. Oshsa — 429 va Retry-After.

Javoblar ETag bilan keladi: keyingi safar If-None-Match: <ETag> yuboring — o'zgarmagan bo'lsa 304 (tanasiz, tez) olasiz. Javoblar gzip bilan siqiladi (Accept-Encoding: gzip). Rasmlar immutable kesh bilan, kichraytirilgan WebP variantlari bilan beriladi.

Delta-sinxron (oflayn nusxa yuritish)

  1. GET /public/meta → content_version. Saqlangan versiya bilan bir xil bo'lsa, hech narsa qilmang.
  2. Birinchi marta: GET /public/questions?limit=100, next_cursor bo'sh bo'lguncha cursor= bilan davom eting. Birinchi sahifadagi server_time ni saqlang.
  3. Keyingi safar: GET /public/questions?updated_since=<saqlangan server_time>&limit=100 → faqat yangi/o'zgargan savollar items da; removed dagi ID larni mahalliy nusxadan o'chiring. Yangi server_time ni saqlang.
  4. Rasm havolasidagi v o'zgarmaguncha rasm keshdan olinadi.

Til, aralashtirish, to'g'ri javoblar

Umumiy

GET/public/metaistalgan kalit

Meta ma'lumot

Jami savollar/biletlar/mavzular soni, kontent versiyasi va oxirgi yangilanish vaqti. Mahalliy keshingiz yangimi, shuni bilish uchun content_version ni saqlang: o'zgarmagan bo'lsa, boshqa so'rov kerak emas. Kalitning o'z ruxsatlari va limitlari ham qaytadi.

curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/meta"
Namunali javob
{
    "ok": true,
    "data": {
        "api_version": 1,
        "content_version": "a91c0e44b2d7",
        "totals": {
            "questions": 1235,
            "tickets": 62,
            "topics": 15
        },
        "last_updated_ts": 1790000000,
        "last_updated_at": "2026-10-25T10:13:20+05:00",
        "server_time": 1790001234,
        "languages": [
            "uz_latn",
            "uz_cyrl"
        ],
        "difficulties": [
            "easy",
            "medium",
            "hard"
        ],
        "key": {
            "name": "Mening ilovam",
            "scopes": [
                "questions:read",
                "tickets:read"
            ],
            "rate_per_min": 60,
            "rate_per_day": 10000
        }
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/meta

Mavzular va biletlar

GET/public/topicsquestions:read

Mavzular (kategoriyalar)

Mavzular va ulardagi savollar soni. key ni boshqa endpointlarda topic= sifatida ishlating.

ParametrTurTavsif
lang
query
string
=uz_latn
Javob yozuvi: uz_latn (lotin) yoki uz_cyrl (kirill). Kirillcha matn kiritilmagan joylar lotindan avtomatik o'giriladi.
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/topics?lang=uz_latn"
Namunali javob
{
    "ok": true,
    "data": {
        "items": [
            {
                "key": "chorraha",
                "name": "Chorrahalardan o'tish va navbat",
                "questions": 138
            },
            {
                "key": "svetofor",
                "name": "Svetofor va tartibga soluvchi",
                "questions": 74
            }
        ],
        "count": 15
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/topics
GET/public/ticketstickets:read

Biletlar ro'yxati

id — barqaror ichki ID (bilet o'chirilsa ham boshqa bilet bu raqamni olmaydi), number — foydalanuvchiga ko'rsatiladigan ketma-ket raqam (1..N). Ko'rsatish uchun number, so'rovlarda id ishlating.

ParametrTurTavsif
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/tickets"
Namunali javob
{
    "ok": true,
    "data": {
        "items": [
            {
                "id": 1,
                "number": 1,
                "questions": 20,
                "updated_ts": 1790000000
            },
            {
                "id": 2,
                "number": 2,
                "questions": 20,
                "updated_ts": 1789000000
            }
        ],
        "count": 62
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/tickets
GET/public/tickets/{id}tickets:read

Bitta bilet va uning savollari

Bilet savollari position tartibida.

ParametrTurTavsif
id *
yo'l
integer Bilet ID si (/public/tickets dagi id).
lang
query
string
=uz_latn
Javob yozuvi: uz_latn (lotin) yoki uz_cyrl (kirill). Kirillcha matn kiritilmagan joylar lotindan avtomatik o'giriladi.
shuffle
query
boolean
=0
1 — javob variantlari tartibi aralashtiriladi. Har variantning key qiymati o'zgarmaydi (u variantning ID si; harfni o'zingiz ko'rsating).
seed
query
string shuffle=1 bilan: bir xil seed — har safar bir xil tartib (testni qayta ochganda).
include_answers
query
boolean
=0
1 — correct (to'g'ri variant kalitlari) va explanation qo'shiladi. Kalitda answers:read ruxsati kerak, aks holda 403.
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/tickets/1?lang=uz_latn&shuffle=1&seed=test1"
Namunali javob
{
    "ok": true,
    "data": {
        "ticket": {
            "id": 1,
            "number": 1,
            "questions": 20
        },
        "items": [
            {
                "id": 1672,
                "ticket_id": 1,
                "ticket_number": 1,
                "position": 6,
                "topic": "chorraha",
                "topic_name": "Chorrahalardan o'tish va navbat",
                "difficulty": "medium",
                "type": "single",
                "text": "Qaysi transport vositasining haydovchisi chorrahadan birinchi bo'lib o'tadi?",
                "options": [
                    {
                        "key": "A",
                        "text": "Avtomobil va avtobus haydovchisi"
                    },
                    {
                        "key": "B",
                        "text": "Tramvay haydovchisi"
                    },
                    {
                        "key": "C",
                        "text": "Har ikkalasi"
                    }
                ],
                "image": {
                    "url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711",
                    "thumb_url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711&w=480&fmt=webp",
                    "source": "own"
                },
                "version": 2,
                "updated_ts": 1790000000
            }
        ],
        "count": 20,
        "content_version": "a91c0e44b2d7"
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/tickets/{id}

Savollar

GET/public/questionsquestions:read

Savollar ro'yxati (filtr, sahifalash, delta-sinxron)

id bo'yicha tartiblangan, cursor bilan sahifalanadi. Delta-sinxron: birinchi marta to'liq yuklab oling va javobdagi server_time ni saqlang; keyingi safar updated_since=<saqlangan server_time> yuboring — faqat o'zgargan/yangi savollar items da, o'chirilgan yoki nofaol bo'lganlar removed da keladi (removed oxirgi sahifada to'liq bo'ladi).

ParametrTurTavsif
lang
query
string
=uz_latn
Javob yozuvi: uz_latn (lotin) yoki uz_cyrl (kirill). Kirillcha matn kiritilmagan joylar lotindan avtomatik o'giriladi.
topic
query
string Mavzu kaliti (/public/topics dan), masalan chorraha.
difficulty
query
string Qiyinlik: easy, medium, hard.
ticket
query
integer Bilet ID si (/public/tickets dagi id).
limit
query
integer
=50
Sahifadagi elementlar soni (1–100).
cursor
query
string Oldingi javobdagi next_cursor. Bo'sh = birinchi sahifa.
updated_since
query
integer UNIX vaqt (soniya). Shundan keyin o'zgargan savollar.
ids
query
string Vergul bilan ID lar (≤100): ids=1,2,3.
shuffle
query
boolean
=0
1 — javob variantlari tartibi aralashtiriladi. Har variantning key qiymati o'zgarmaydi (u variantning ID si; harfni o'zingiz ko'rsating).
seed
query
string shuffle=1 bilan: bir xil seed — har safar bir xil tartib (testni qayta ochganda).
include_answers
query
boolean
=0
1 — correct (to'g'ri variant kalitlari) va explanation qo'shiladi. Kalitda answers:read ruxsati kerak, aks holda 403.
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/questions?topic=chorraha&limit=2&lang=uz_latn"
Namunali javob
{
    "ok": true,
    "data": {
        "items": [
            {
                "id": 1672,
                "ticket_id": 1,
                "ticket_number": 1,
                "position": 6,
                "topic": "chorraha",
                "topic_name": "Chorrahalardan o'tish va navbat",
                "difficulty": "medium",
                "type": "single",
                "text": "Qaysi transport vositasining haydovchisi chorrahadan birinchi bo'lib o'tadi?",
                "options": [
                    {
                        "key": "A",
                        "text": "Avtomobil va avtobus haydovchisi"
                    },
                    {
                        "key": "B",
                        "text": "Tramvay haydovchisi"
                    },
                    {
                        "key": "C",
                        "text": "Har ikkalasi"
                    }
                ],
                "image": {
                    "url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711",
                    "thumb_url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711&w=480&fmt=webp",
                    "source": "own"
                },
                "version": 2,
                "updated_ts": 1790000000
            }
        ],
        "count": 1,
        "next_cursor": "cNjQ5",
        "content_version": "a91c0e44b2d7",
        "server_time": 1790001234
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/questions
GET/public/questions/{id}questions:read

Bitta savol

To'g'ri javob bilan olish uchun kalitda answers:read va include_answers=1 kerak.

ParametrTurTavsif
id *
yo'l
integer Savol ID si.
lang
query
string
=uz_latn
Javob yozuvi: uz_latn (lotin) yoki uz_cyrl (kirill). Kirillcha matn kiritilmagan joylar lotindan avtomatik o'giriladi.
shuffle
query
boolean
=0
1 — javob variantlari tartibi aralashtiriladi. Har variantning key qiymati o'zgarmaydi (u variantning ID si; harfni o'zingiz ko'rsating).
seed
query
string shuffle=1 bilan: bir xil seed — har safar bir xil tartib (testni qayta ochganda).
include_answers
query
boolean
=0
1 — correct (to'g'ri variant kalitlari) va explanation qo'shiladi. Kalitda answers:read ruxsati kerak, aks holda 403.
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/questions/1672?include_answers=1"
Namunali javob
{
    "ok": true,
    "data": {
        "question": {
            "id": 1672,
            "ticket_id": 1,
            "ticket_number": 1,
            "position": 6,
            "topic": "chorraha",
            "topic_name": "Chorrahalardan o'tish va navbat",
            "difficulty": "medium",
            "type": "single",
            "text": "Qaysi transport vositasining haydovchisi chorrahadan birinchi bo'lib o'tadi?",
            "options": [
                {
                    "key": "A",
                    "text": "Avtomobil va avtobus haydovchisi"
                },
                {
                    "key": "B",
                    "text": "Tramvay haydovchisi"
                },
                {
                    "key": "C",
                    "text": "Har ikkalasi"
                }
            ],
            "image": {
                "url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711",
                "thumb_url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711&w=480&fmt=webp",
                "source": "own"
            },
            "version": 2,
            "updated_ts": 1790000000,
            "correct": [
                "B"
            ],
            "explanation": "Tramvay teng ahamiyatli chorrahada afzallikka ega."
        }
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/questions/{id}
GET/public/questions/randomquestions:read

Tasodifiy savollar

Filtrga mos savollardan tasodifiy tanlaydi (takrorlanmaydi). exclude=1,2,3 — avval ko'rsatilganlarni chiqarib tashlaydi. Javob keshlanmaydi. seed bilan natija takrorlanadi.

ParametrTurTavsif
count
query
integer Savollar soni (1–50, standart 10).
topic
query
string Mavzu kaliti (/public/topics dan), masalan chorraha.
difficulty
query
string Qiyinlik: easy, medium, hard.
ticket
query
integer Bilet ID si (/public/tickets dagi id).
exclude
query
string Chiqarib tashlanadigan ID lar (≤200).
lang
query
string
=uz_latn
Javob yozuvi: uz_latn (lotin) yoki uz_cyrl (kirill). Kirillcha matn kiritilmagan joylar lotindan avtomatik o'giriladi.
shuffle
query
boolean
=0
1 — javob variantlari tartibi aralashtiriladi. Har variantning key qiymati o'zgarmaydi (u variantning ID si; harfni o'zingiz ko'rsating).
seed
query
string shuffle=1 bilan: bir xil seed — har safar bir xil tartib (testni qayta ochganda).
include_answers
query
boolean
=0
1 — correct (to'g'ri variant kalitlari) va explanation qo'shiladi. Kalitda answers:read ruxsati kerak, aks holda 403.
fields
query
string Faqat kerakli maydonlar, vergul bilan: fields=id,text,options. Javob hajmini kamaytiradi.
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/questions/random?count=10&topic=svetofor&difficulty=medium&shuffle=1"
Namunali javob
{
    "ok": true,
    "data": {
        "items": [
            {
                "id": 1672,
                "ticket_id": 1,
                "ticket_number": 1,
                "position": 6,
                "topic": "chorraha",
                "topic_name": "Chorrahalardan o'tish va navbat",
                "difficulty": "medium",
                "type": "single",
                "text": "Qaysi transport vositasining haydovchisi chorrahadan birinchi bo'lib o'tadi?",
                "options": [
                    {
                        "key": "A",
                        "text": "Avtomobil va avtobus haydovchisi"
                    },
                    {
                        "key": "B",
                        "text": "Tramvay haydovchisi"
                    },
                    {
                        "key": "C",
                        "text": "Har ikkalasi"
                    }
                ],
                "image": {
                    "url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711",
                    "thumb_url": "https://DOMEN/api/v1/public/images/1672?v=01b03c9a1f&sig=4be0f3a1c2d9e711&w=480&fmt=webp",
                    "source": "own"
                },
                "version": 2,
                "updated_ts": 1790000000
            }
        ],
        "count": 1,
        "pool": 74,
        "content_version": "a91c0e44b2d7"
    },
    "request_id": "req_9f2c41d07a3b55e0"
}
/public/questions/random

Rasmlar

GET/public/images/{id}images:read

Savol rasmi

Savol obyektidagi image.url imzolangan havola — uni to'g'ridan-to'g'ri <img src> ga qo'yish mumkin (kalit sarlavhasi kerak emas, sig o'zi ruxsat). Rasmlar Cache-Control: public, max-age=31536000, immutable bilan keladi; havoladagi v rasm o'zgarsa yangilanadi. Kichraytirish: w (160, 240, 320, 480, 640, 800, 960, 1280), format: fmt (webp, jpeg, png, orig). Rasmi yo'q savol — 404.

ParametrTurTavsif
id *
yo'l
integer Savol ID si.
v
query
string Rasm versiyasi (havoladan).
sig
query
string Imzo (havoladan).
w
query
integer Kenglik (px), ro'yxatdagi qiymatlardan.
fmt
query
string webp | jpeg | png | orig
curl -H "X-API-Key: YOUR_API_KEY" \
     "https://prava.tezt.uz/api/v1/public/images/1672"
/public/images/{id}

Xato kodlari

HTTPKodSabab
401api_key_requiredX-API-Key sarlavhasi yo'q
401invalid_api_keyKalit noto'g'ri (ko'p marta xato yuborilsa IP vaqtincha bloklanadi)
401api_key_revoked / api_key_expiredKalit bekor qilingan yoki muddati tugagan
403insufficient_scopeKalitda kerakli ruxsat yo'q (required_scope maydoni qaytadi)
403ip_not_allowed / origin_not_allowedKalit boshqa IP/domendan ishlatilmoqda
404not_foundSavol/bilet/rasm topilmadi
422bad_lang / bad_difficulty / bad_query ...Parametr noto'g'ri
429rate_limited / daily_limit_exceededLimit oshdi. Retry-After sarlavhasi va error.retry_after kutish soniyalarini beradi
503maintenance / api_disabledTexnik ishlar yoki API vaqtincha o'chirilgan

Savol bo'lsa: aloqa. Mashina o'qiydigan tavsif: openapi.json.