Dasturchilar uchun hujjatlar

TapTime REST API

Stol bronlari va qabullarni oʻqing va yangilang, buyurtmalar va sodiqlik kartalarini oʻqing, tartiblangan hodisalar oqimini soʻrang va imzolangan webhooklarni qabul qiling — oʻz CRM, POS tizimingiz, maʼlumotlar omboringiz yoki avtomatlashtirish platformasidan. Bu sahifa — toʻliq maʼlumotnoma; undan nima uchun foydalanish kerakligini konversiya kuzatuvi boʻyicha qoʻllanma tushuntiradi.

Asosiy URLhttps://api.tapti.me AvtorizatsiyaBearer token FormatJSON Nima uchun kerak

Har bir soʻrovga Authorization: Bearer tt_live_… koʻrinishida kompaniya API kaliti (paneldagi Integratsiyalar → Webhooklar va API) kerak. Javoblar va xatolar JSON formatida.

Maʼlum sanadan beri oʻzgargan tasdiqlangan stol bronlari
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer tt_live_…"

Autentifikatsiya

Har bir soʻrov kompaniya API kalitini bearer token sifatida yuboradi. Kalitni paneldagi Integratsiyalar → Webhooklar va API → REST API kalitlari boʻlimida yarating: u faqat bir marta koʻrsatiladi va serverda faqat SHA-256 xeshi sifatida saqlanadi; yoʻqolgan kalit tiklanmaydi — u bekor qilinib, yangisi bilan almashtiriladi. Kompaniyada 10 tagacha faol kalit boʻlishi mumkin.

  • Faqat oʻqish kalitlari barcha GET endpointlarini chaqira oladi, shuningdek webhooklarga obuna boʻlishi va obunani bekor qilishi mumkin — obuna kalit oʻzi oʻqiy olmaydigan hech narsani yubormaydi.
  • Oʻqish-yozish kalitlari bundan tashqari bron holatini POST orqali oʻzgartira oladi; faqat oʻqish kaliti bu yoʻllarda 403 Forbidden javobini oladi.
  • Kalit bitta kompaniyaga tegishli — har bir roʻyxat va soʻrov allaqachon shu kompaniya bilan cheklangan, companyId parametri yoʻq.

Soʻrovlar chegarasi

Har bir kalit uchun daqiqasiga 50 ta soʻrov, siljuvchi oyna boʻyicha, barcha endpointlar uchun umumiy. Chegaradan oshsa, 429 Too Many Requests qaytadi; tezroq soʻrash oʻrniga biroz kutib, qayta urinib koʻring — yoki webhookka obuna boʻlib, soʻrashni butunlay toʻxtating.

Endpointlar

GET /v1/company Faqat oʻqish yoki oʻqish va yozish

Joriy kompaniyani olish

Kalit tegishli boʻlgan kompaniya va kalitning oʻzi nima qila olishi.

GET /v1/company/reservations Faqat oʻqish yoki oʻqish va yozish

Stol bronlari roʻyxati

Kompaniyaning stol bronlari, eng erta boshlanadiganidan boshlab — updatedSince berilgan boʻlsa, eng avval yangilanganidan boshlab.

ParametrTuriMaʼnosi
status string Vergul bilan ajratilgan: pending, confirmed, seated, completed, no_show, cancelled. cancelled bekor qilishning ikkala sababini ham qamrab oladi.
branchId integer Faqat bitta filial.
from ISO 8601 datetime Faqat shu vaqtda yoki undan keyin boshlanadigan bronlar (siljish koʻrsatilmasa, UTC).
to ISO 8601 datetime Faqat shu vaqtdan oldin boshlanadigan bronlar.
updatedSince ISO 8601 datetime Faqat shu vaqtdan beri oʻzgargan bronlar; sinxronlash uchun saralashni updatedAt boʻyicha oʻsish tartibiga oʻtkazadi.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
page integer Sahifa raqami, 1 dan boshlanadi. Standart qiymat 1.
GET /v1/company/appointments Faqat oʻqish yoki oʻqish va yozish

Qabullar roʻyxati

Qabullar moduli uchun — stol bronlari bilan bir xil shakl va filtrlar.

ParametrTuriMaʼnosi
status string Vergul bilan ajratilgan: pending, confirmed, completed, no_show, cancelled.
branchId integer Faqat bitta filial.
from ISO 8601 datetime Faqat shu vaqtda yoki undan keyin boshlanadigan bronlar.
to ISO 8601 datetime Faqat shu vaqtdan oldin boshlanadigan bronlar.
updatedSince ISO 8601 datetime Faqat shu vaqtdan beri oʻzgargan bronlar; updatedAt boʻyicha oʻsish tartibida saralanadi.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
page integer Sahifa raqami, 1 dan boshlanadi. Standart qiymat 1.
GET /v1/company/reservations/{id} Faqat oʻqish yoki oʻqish va yozish

Bitta stol bronini olish

Bitta stol broni — webhooklar yetkazadigan shaklda, atributsiyasi bilan. Agar id kalit kompaniyasiga tegishli boʻlmasa, 404.

GET /v1/company/appointments/{id} Faqat oʻqish yoki oʻqish va yozish

Bitta qabulni olish

Bitta qabul — stol broni kabi shakl va qoidalar bilan.

POST /v1/company/reservations/{id}/status Faqat oʻqish va yozish

Stol broni holatini oʻzgartirish

Tasdiqlash, stolga oʻtqazish, yakunlash, «kelmadi» deb belgilash, bekor qilish yoki qayta ochish — doskada oʻzgartirgandagi kabi webhooklar va konversiyalarni ishga tushiradi. JSON tanasi: {"status": "..."}.

ParametrTuriMaʼnosi
status string, required Quyidagilardan biri: pending, confirmed, seated, completed, no_show, cancelled (canceled va canceled_by_venue ham qabul qilinadi).
POST /v1/company/appointments/{id}/status Faqat oʻqish va yozish

Qabul holatini oʻzgartirish

Stol broni endpointi bilan bir xil, faqat seated holatisiz.

ParametrTuriMaʼnosi
status string, required Quyidagilardan biri: pending, confirmed, completed, no_show, cancelled (canceled va canceled_by_venue ham qabul qilinadi).
GET /v1/company/events Faqat oʻqish yoki oʻqish va yozish

Hodisalar oqimini soʻrash

Barcha bron, buyurtma va sodiqlik hodisalari, eng eskisidan boshlab — webhooklar ham aynan shu oqimdan olinadi. Faqat yangilarini olish uchun oxirgi koʻrgan kursoringizni after sifatida, faqat ayrim turlarni olish uchun esa type parametrini yuboring.

ParametrTuriMaʼnosi
after integer cursor Oxirgi qayta ishlagan hodisangiz kursori. Boshidan boshlash uchun koʻrsatmang.
type string Vergul bilan ajratilgan hodisa turlari yoki oilalari: booking.confirmed,order.placed yoki order, loyalty.*. Barcha hodisalar uchun koʻrsatmang.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
GET /v1/company/orders Faqat oʻqish yoki oʻqish va yozish

Buyurtmalar roʻyxati

Mehmonlarning stoldan, olib ketish va yetkazib berish uchun bergan buyurtmalari hamda kassada urilgan barcha savdolar, eng eskisidan boshlab — paidSince berilgan boʻlsa, toʻlangan tartibida. Oldindan toʻlovini kutayotgan buyurtma roʻyxatga kirmaydi.

ParametrTuriMaʼnosi
status string Vergul bilan ajratilgan: open, paid.
source string customer (mehmon bergan) yoki staff (xodim urgan).
fulfilment string Vergul bilan ajratilgan: dine_in, takeaway, delivery.
branchId integer Faqat bitta filial.
from ISO 8601 datetime Faqat shu vaqtda yoki undan keyin yaratilgan buyurtmalar.
to ISO 8601 datetime Faqat shu vaqtdan oldin yaratilgan buyurtmalar.
paidSince ISO 8601 datetime Faqat shu vaqtdan beri toʻlangan buyurtmalar; savdolarni sinxronlash uchun paidAt boʻyicha oʻsish tartibida saralanadi.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
page integer Sahifa raqami, 1 dan boshlanadi. Standart qiymat 1.
GET /v1/company/orders/{id} Faqat oʻqish yoki oʻqish va yozish

Bitta buyurtmani olish

Bitta buyurtma — pozitsiyalari, summalari va atributsiyasi bilan, buyurtma webhooklari yetkazadigan shaklda.

GET /v1/company/loyalty/programs Faqat oʻqish yoki oʻqish va yozish

Sodiqlik dasturlari roʻyxati

Barcha muhr kartasi dasturlari: nomi, holati, kerakli muhrlar soni, mukofot va u qayerda amal qilishi.

GET /v1/company/loyalty/cards Faqat oʻqish yoki oʻqish va yozish

Sodiqlik kartalari roʻyxati

Aʼzolarning kartalari, sodiqlik obyekti shaklida. Kartasini toʻldirgan aʼzoda u completed holatida boʻladi va yoniga yangi active karta ochiladi; customer.id — bu aʼzo.

ParametrTuriMaʼnosi
programId integer Faqat bitta dastur.
customerId integer Faqat bitta aʼzo.
status string Vergul bilan ajratilgan: active, completed.
updatedSince ISO 8601 datetime Faqat shu vaqtdan beri muhr qoʻyilgan yoki yakunlangan kartalar; updatedAt boʻyicha oʻsish tartibida saralanadi.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
page integer Sahifa raqami, 1 dan boshlanadi. Standart qiymat 1.
GET /v1/company/loyalty/rewards Faqat oʻqish yoki oʻqish va yozish

Sodiqlik mukofotlari roʻyxati

Kartani toʻldirib qoʻlga kiritilgan mukofotlar — kodi, amal qilish muddati va berilgan-berilmagani bilan.

ParametrTuriMaʼnosi
programId integer Faqat bitta dastur.
customerId integer Faqat bitta aʼzo.
status string Vergul bilan ajratilgan: issued, redeemed, expired.
from ISO 8601 datetime Faqat shu vaqtda yoki undan keyin chiqarilgan mukofotlar.
to ISO 8601 datetime Faqat shu vaqtdan oldin chiqarilgan mukofotlar.
limit integer Sahifa hajmi, 1–100. Standart qiymat 50.
page integer Sahifa raqami, 1 dan boshlanadi. Standart qiymat 1.
GET /v1/company/webhooks Faqat oʻqish yoki oʻqish va yozish

Webhook obunalari roʻyxati

Shu kalit yaratgan obunalar. Panelda qoʻshilgan webhooklar bu yerda koʻrinmaydi.

POST /v1/company/webhooks Faqat oʻqish yoki oʻqish va yozish

Webhookka obuna qilish

URL manzilga hodisalarni yuborishni boshlaydi — foydalanuvchi trigger’ni yoqqanda avtomatlashtirish platformasi ilovasi aynan shuni chaqiradi. Obunani va uning imzo kalitini bir marta qaytaradi. JSON tanasi: {"url": "…", "events": ["order.placed"]}; Zapier’ning {"target_url": "…", "event": "…"} formati ham qabul qilinadi.

ParametrTuriMaʼnosi
url string, required Yuboriladigan https manzil (target_url ham qabul qilinadi).
events array of strings, required Hodisa turlari, order.* yoki loyalty kabi oilalar yoki hammasi uchun * (bitta hodisa uchun event ham qabul qilinadi).
description string Panelda koʻrinadigan nom. Standart boʻyicha platforma va kalit nomi.
DELETE /v1/company/webhooks/{id} Faqat oʻqish yoki oʻqish va yozish

Webhook obunasini bekor qilish

Shu kalit yaratgan obunaga yuborishni toʻxtatadi. 204 qaytaradi. Kalit bekor qilinsa, uning barcha obunalari ham oʻchiriladi.

Bron obyekti

Stol broni va qabul bitta umumiy shaklda qaytadi: kind, id, status, source, guestInitiated, startsAt/endsAt/timezone (filialning oʻz vaqt zonasi), currency, company, branch, guest, attribution, conversionId, createdAt/updatedAt — bundan tashqari stol broni uchun partySize va table, qabul uchun service va specialist. Bu aynan webhook yetkazadigan maʼlumot, shuning uchun bittasini qayta ishlaydigan qabul qiluvchi ikkalasini ham qayta ishlaydi.

GET /v1/company/reservations/4821 → data
{
  "data": {
    "kind": "reservation",
    "id": 4821,
    "status": "confirmed",
    "source": "online",
    "guestInitiated": true,
    "startsAt": "2026-09-12T20:00:00+03:00",
    "endsAt": "2026-09-12T21:30:00+03:00",
    "timezone": "Asia/Baku",
    "currency": "AZN",
    "company": { "id": 12, "name": "Cafe Aroma", "slug": "cafe-aroma", "country": "AZ" },
    "branch": { "id": 3, "name": "Nizami st." },
    "partySize": 4,
    "table": { "id": 9, "label": "T3" },
    "guest": { "name": "Maria K.", "phone": "…", "email": "…" },
    "locale": "en",
    "note": null,
    "conversionId": "tt3f9c…",
    "createdAt": "2026-09-10T08:12:04+00:00",
    "updatedAt": "2026-09-12T20:00:03+00:00",
    "attribution": { "channel": "widget", "utmSource": "instagram", "gclid": null, "fbclid": "IwAR2…" }
  }
}

Buyurtma obyekti

Buyurtma qayerda uchramasin — REST API, buyurtma webhooklari yoki hodisalar oqimi — bitta shaklda qaytadi: kind ("order"), id, number (xodimlar chaqiradigan chek raqami), status (open yoki paid), source (customer yoki staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (xodim aniqlagan boʻlsa, sodiqlik dasturi aʼzosi), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (choychaqasiz buyurtma qiymati — konversiyalarda yuboriladigan raqam), paymentMethod, servedBy, conversionId, createdAt, paidAt va attribution. Pul summalari doimo tiyinlarda (minor units) koʻrsatiladi.

GET /v1/company/orders/9170 → data
{
  "data": {
    "kind": "order",
    "id": 9170,
    "number": 42,
    "status": "paid",
    "source": "customer",
    "guestInitiated": true,
    "fulfilment": "takeaway",
    "table": null,
    "label": "Ana",
    "currency": "EUR",
    "branch": { "id": 3, "name": "Vitosha Blvd" },
    "customer": { "id": 311, "name": "Ana", "phone": "…" },
    "items": [
      { "menuItemId": 88, "name": "Flat white", "variant": "Large",
        "quantity": 2, "unitPriceCents": 450, "subtotalCents": 900 }
    ],
    "itemCount": 2,
    "subtotalCents": 900,
    "discountCents": 0,
    "deliveryFeeCents": 0,
    "tipCents": 100,
    "totalCents": 1000,
    "valueCents": 900,
    "paymentMethod": "online",
    "conversionId": "tt81ad…",
    "createdAt": "2026-09-12T12:04:10+03:00",
    "paidAt": "2026-09-12T12:05:02+03:00",
    "attribution": { "channel": "web", "utmSource": "google", "gclid": "Cj0K…" }
  }
}

Sodiqlik obyekti

Har bir sodiqlik hodisasi, kartasi va mukofoti bitta shaklga ega: kind ("loyalty"), id (karta), timezone, company, branch (hodisa sodir boʻlgan joy, agar boʻlsa), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (muhr uchun: source, issuedBy, createdAt) va reward (mukofot uchun: code, title, status, expiresAt, redeemedAt, redeemedBy), shuningdek conversionId — sodiqlikka qoʻshilish shu id bilan yuboriladi.

GET /v1/company/loyalty/cards → data[0]
{
  "kind": "loyalty",
  "id": 5120,
  "program": { "id": 4, "name": "Coffee card", "stampsRequired": 8, "rewardTitle": "Free coffee" },
  "customer": { "id": 311, "name": "Ana", "phone": "…", "locale": "bg" },
  "card": { "id": 5120, "status": "active", "stampsCount": 5,
            "stampsRequired": 8, "stampsToReward": 3 },
  "branch": { "id": 3, "name": "Vitosha Blvd" },
  "stamp": { "source": "qr_scan", "issuedBy": "Ivan", "createdAt": "…" },
  "reward": null,
  "conversionId": "tt5c02…"
}

Hodisalar oqimi

Har bir qator: { id, cursor, type, createdAt, previousStatus, data }. data hodisa prefiksi nomlagan kalit ostida obyektni saqlaydi: data.booking, data.order yoki data.loyalty. Qayta ishlagan eng katta kursoringizni saqlang va uni after sifatida qaytaring — u hech qachon qatorni oʻtkazib yubormaydi yoki takrorlamaydi, shuning uchun nosozlikdan keyin xavfsiz davom ettirish mumkin. Qayta ishlamaydigan turlaringizni eʼtiborsiz qoldiring: yangilari qoʻshilishi mumkin.

Hodisa turiMaʼnosi
booking.requestedMehmon tasdiqlashingizni kutadigan bron soʻradi.
booking.confirmedBron tasdiqlandi — darhol tasdiqlangan holda yaratildi yoki keyinroq xodim tasdiqladi.
booking.cancelledMehmon yoki muassasa bekor qildi; kim ekanini status koʻrsatadi.
booking.no_showMehmon kelmadi.
booking.completedTashrif yakunlandi.
order.placedMehmonning buyurtmasi muassasaga yetib keldi — sahifadan, stoldagi QR koddan, olib ketish yoki yetkazib berish uchun; muassasa oldindan toʻlov olsa, toʻlovdan keyin.
order.paidIstalgan buyurtma toʻlandi, jumladan kassada urilgan savdolar ham.
loyalty.member_joinedMijoz dasturda birinchi muhrini oldi.
loyalty.stamp_addedKartaga muhr qoʻshildi.
loyalty.reward_issuedKarta toʻldi va mukofot chiqarildi.
loyalty.reward_redeemedMukofot topshirildi.
Hodisalar oqimi bilan sinxron turing
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
  -H "Authorization: Bearer tt_live_…"

Webhooklar

Integratsiyalar → Webhooklar va API boʻlimida endpoint yarating — yoki Integratsiyalar → Avtomatlashtirish boʻlimida Zapier, Make, n8n yoki Pipedream’ni ulang — shunda bron, buyurtma yoki sodiqlik kartasi oʻzgargan zahoti TapTime imzolangan JSON hodisasini POST qiladi. Hodisalarni har bir endpoint uchun alohida tanlaysiz. Kompaniyada jami 50 tagacha webhook, postback, chat va avtomatlashtirish ulanishi boʻlishi mumkin.

SarlavhaMaʼnosi
TapTime-EventHodisa turi, masalan booking.confirmed.
TapTime-Event-IdHodisaning oʻzgarmas id’si — qayta yuborilgan yetkazishni takrorlanishdan tozalash uchun foydalaning.
TapTime-DeliveryAynan shu yetkazish urinishining id’si.
TapTime-Signaturet=<unix vaqt>,v1=<"t.rawBody" ning hex HMAC-SHA256 qiymati>, endpointning oʻz maxfiy kaliti bilan imzolangan.
  • Istalgan 2xx javob yetkazilgan deb hisoblanadi; 2xx boʻlmagan javob yoki timeout oraliqni oshirib (1 daq, 5 daq, 15 daq, 1 soat, 3 soat, 6 soat, 12 soat) 8 martagacha qayta yuboriladi — 410 qayta urinishlarni toʻxtatadi.
  • Qayta yoʻnaltirishlarga amal qilinmaydi.
  • Production muhitida URL HTTPS boʻlishi kerak va xususiy yoki loopback manzilga yoʻnaltirilmasligi kerak.
  • Yetkazish kamida bir marta kafolatlanadi: imzoni doimo tekshiring va takrorlarni TapTime-Event-Id boʻyicha tozalang.
POST · application/json · booking.confirmed
{
  "id": "evt_9f3c2a7e1b",
  "type": "booking.confirmed",
  "createdAt": "2026-09-12T19:02:11+03:00",
  "test": false,
  "data": { "booking": { "kind": "reservation", "id": 4821, "status": "confirmed", "…": "…" } }
}
Imzoni tekshirish (Node.js)
const [t, v1] = req.headers["taptime-signature"]
  .split(",").map(part => part.split("=")[1]);
const expected = crypto
  .createHmac("sha256", process.env.TAPTIME_WEBHOOK_SECRET)
  .update(`${t}.${rawBody}`)
  .digest("hex");
const valid = crypto.timingSafeEqual(
  Buffer.from(expected), Buffer.from(v1));

Webhook obunalari

Avtomatlashtirish platformalari foydalanuvchidan URL qoʻyishni soʻrash oʻrniga trigger’larni API orqali yoqib-oʻchiradi («REST hooks»): platformaning oʻz URL manzilini kerakli hodisalar bilan POST qiling, qaytgan id’ni saqlang va trigger oʻchirilganda uni DELETE qiling. Obuna — oddiy imzolangan webhook: u panelda uni yaratgan kalit belgisi bilan koʻrinadi.

  • Kalit faqat oʻzi yaratgan obunalarni koʻradi va oʻchiradi; kalit bekor qilinsa, ularning hammasi oʻchiriladi.
  • hooks.zapier.com, make.com va pipedream.net manzillari taniladi va platforma nomi bilan koʻrsatiladi; boshqa har qanday https manzil oddiy webhook hisoblanadi.
  • Imzo kaliti bir marta, POST javobida qaytariladi; egasi uni panelda yana koʻrishi mumkin.
URL manzilni yangi buyurtmalarga obuna qilish
curl -X POST "https://api.tapti.me/v1/company/webhooks" \
  -H "Authorization: Bearer tt_live_…" -H "Content-Type: application/json" \
  -d '{"url": "https://hooks.zapier.com/hooks/catch/123/abc/", "events": ["order.placed"]}'

Postbacklar

JSON webhooklar oʻrniga query-string postbacklar bilan ishlaydigan platformalar uchun trekeringizning oʻz URL manziliga makroslar toʻldirilgan GET yoki POST soʻrovi. Buyurtma uchun {value} — choychaqasiz buyurtma qiymati, {order_id} esa uning id’si.

Oʻzgaruvchilar bilan postback URL · GET yoki POST
https://tracker.example/postback
  ?cid={click_id}&event={event}&status={status}
  &payout={value}&cur={currency}

Mavjud oʻzgaruvchilar

  • {event}
  • {event_id}
  • {status}
  • {booking_id}
  • {booking_type}
  • {order_id}
  • {customer_id}
  • {conversion_id}
  • {value}
  • {currency}
  • {party_size}
  • {branch_id}
  • {timestamp}
  • {utm_source}
  • {utm_medium}
  • {utm_campaign}
  • {utm_term}
  • {utm_content}
  • {gclid}
  • {fbclid}
  • {msclkid}
  • {ttclid}
  • {click_id}

Xatolar

Har bir xato JSON koʻrinishida: { "error": "<code>", "message": "<human-readable>" }.

HolatxatoMaʼnosi
401 unauthorized Authorization sarlavhasi yoʻq yoki kalit yaroqsiz yoxud bekor qilingan.
403 forbidden Faqat oʻqish kaliti yozish endpointini chaqirdi (holatni oʻzgartirish).
404 not_found Kalit kompaniyasida bunday id’li bron yoʻq.
409 conflict Holatni oʻzgartirish stol yoki slotni ikki marta band qilib qoʻyardi; hech narsa oʻzgartirilmadi.
422 invalid_status Tanadagi status qiymati bu bron turi uchun ruxsat etilgan qiymatlardan biri emas.
422 invalid_type Hodisalar oqimidagi type hech bir hodisa turi yoki oilasiga mos kelmaydi.
422 invalid_url Obuna URL manzili ochiq https manzil emas.
429 rate_limited Bu kalit bilan bir daqiqada 50 tadan ortiq soʻrov yuborildi. Sekinlashing va qayta urinib koʻring.
Kalit kerakmi?

API, webhooklar, avtomatlashtirish va chat integratsiyalari har bir modulga kiritilgan — qoʻshimcha toʻlovsiz va alohida dasturchi tarifisiz.

Bepul sinovni boshlash