Иштеп чыгуучулар үчүн документация

TapTime REST API

Стол брондоолорун жана жазылууларды окуп, жаңыртыңыз, буйрутмаларды жана ишенимдүүлүк карталарын окуңуз, иреттелген окуялар агымын сураңыз жана кол тамгалуу вебхуктарды алыңыз — өз CRM, POS системаңыздан, маалымат кампаңыздан же автоматташтыруу платформасынан. Бул барак — толук маалымдама; аны эмне үчүн колдонуу керектигин конверсияны көзөмөлдөө боюнча колдонмо түшүндүрөт.

Негизги URLhttps://api.tapti.me AuthBearer token ФорматJSON Эмне үчүн аны колдонуу керек

Ар бир сурам компаниянын API ачкычын (панелдеги Интеграциялар → Webhooks & API) Authorization: Bearer tt_live_…. катары жөнөтүүсү керек. Жооптор жана каталар JSON форматында болот.

Тастыкталган брондоолор датадан бери өзгөрдү
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer tt_live_…"

Аутентификация

Ар бир сурам компаниянын API ачкычын bearer токени катары камтыйт. Панелден — Интеграциялар → Webhooks & API → REST API ачкычтары — бөлүмүнөн ачкыч түзүңүз; ал бир гана жолу көрсөтүлүп, сервер тарапта гана SHA-256 хэши түрүндө сакталат; жоголгон ачкыч жокко чыгарылып, жаңысы менен алмаштырылат, калыбына келтирилбейт. Компания 10го чейин активдүү ачкычтарды кармап тура алат.

  • Окуу үчүн гана ачкычтар бардык GET эндпоинттерин чакырып, вебхуктарга жазылып жана жазылууну жокко чыгара алат — жазылуу ачкыч мурунтан эле окуй албаган эч нерсени жөнөтпөйт.
  • Окуу-жазуу ачкычтары брондоонун абалын POST аркылуу да өзгөртө алат; окуу үчүн гана ачкыч ал маршруттарда 403 Forbidden алат.
  • Ачкыч бир компанияга таандык — ар бир тизме жана издөө ага мурунтан эле чектелген, companyId параметри жок.

Квота чектөөлөрү

Ар бир ачкычка мүнөтүнө 50 сурам, жылма терезе менен, бардык эндпоинттерге жалпы. Чектен ашканда 429 Too Many Requests кайтарылат; тезирээк сурабай, бир аз күтүп кайра аракет кылыңыз — же вебхукка жазылып, сурамжылоону таптакыр токтотуңуз.

Аяк чекиттери

GET /v1/company Окуу гана же окуу жана жазуу

Учурдагы компанияны алыңыз

Ачкыч кайсы компанияга таандык жана ачкыч өзү эмнени жасай алат.

GET /v1/company/reservations Окуу гана же окуу жана жазуу

Заказдарды тизмелөө

Компания үчүн стол брондоолору эң эрте башталыш убактысынан баштап тизмектелет — же updatedSince орнотулганда, эң акыркы жаңыртылгандан баштап.

ПараметрTypeМааниси
status string Үтүк менен ажыратылган: күтүлүүдө, тастыкталган, отурган, аяктаган, келбеген, жокко чыгарылган. «жокко чыгарылган» себептердин экөөн тең жокко чыгарат.
branchId integer Бир гана бөлүм менен чектөө.
from ISO 8601 datetime Бул убакыттан (эгер офсет көрсөтүлбөсө, UTC боюнча) же андан кийин башталуучу брондоолор гана.
to ISO 8601 datetime Бул убакытка чейин гана брондоолор кабыл алынат.
updatedSince ISO 8601 datetime Бул убакыттан бери гана брондоолор өзгөрдү; синхрондоштуруу үчүн сорттоону updatedAt өсүүчү тартипке өзгөртөт.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
page integer 1ге негизделген барак номери. Демейки 1.
GET /v1/company/appointments Окуу гана же окуу жана жазуу

Жолугушууларды тизмеле

Жолугушуулар модулу үчүн брондоолордогу сыяктуу формат жана фильтрлер.

ПараметрTypeМааниси
status string Үтүк менен ажыратылган: каралууда, тастыкталган, аяктаган, көрүнбөгөн, жокко чыгарылган.
branchId integer Бир гана тармакка чектөө.
from ISO 8601 datetime Бул убакыттан тартып гана брондоолор кабыл алынат.
to ISO 8601 datetime Бул убакытка чейин гана брондоолор кабыл алынат.
updatedSince ISO 8601 datetime Бул убакыттан бери гана брондоолор өзгөрдү; updatedAt боюнча өсүүчү тартипте сорттолгон.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
page integer 1ге негизделген барак номери. Демейки 1.
GET /v1/company/reservations/{id} Окуу гана же окуу жана жазуу

Брондоо алыңыз

Бир эскертүү, вебхуктар аны ошол эле абалда жана анын тиешелүүлүгү менен өткөрөт. ID ачкычтын компаниясына таандык болбосо, 404.

GET /v1/company/appointments/{id} Окуу гана же окуу жана жазуу

Жолугушууга жазылыңыз

Бир гана дайындоо, брондоону издөө сыяктуу эле форма жана эрежелер менен.

POST /v1/company/reservations/{id}/status Окуу жана жазуу гана

Броньдун абалын өзгөртүңүз

Тастыктоо, орунга отургузуу, бүтүрүү, келбегендиги тууралуу белгилөө, жокко чыгаруу же кайра ачуу — тактада өзгөртүү киргизгендеги сыяктуу эле вебхуктарды жана конверсияларды ишке киргизет. JSON денеси: {"status": "..."}.

ПараметрTypeМааниси
status string, required Төмөнкүлөрдүн бири: күтүлүүдө, тастыкталган, отурган, аяктаган, келбеген, жокко чыгарылган (canceled жана canceled_by_venue да кабыл алынат).
POST /v1/company/appointments/{id}/status Окуу жана жазуу гана

Жолугушуунун абалын өзгөртүңүз

Брондоо чекити сыяктуу эле, отуруу абалы жок.

ПараметрTypeМааниси
status string, required Төмөнкүлөрдүн бири: күтүлүүдө, тастыкталган, аяктаган, келбеген, жокко чыгарылган (canceled жана canceled_by_venue да кабыл алынат).
GET /v1/company/events Окуу гана же окуу жана жазуу

Окуялар агымын суроо

Ар бир брондоо, буйрутма жана ишенимдүүлүк окуясы, эң эскисинен баштап — вебхуктар жөнөтүлгөн ошол эле агым. Жаңысын гана алуу үчүн акыркы көргөн курсоруңузду after катары, айрым түрлөрүн гана алуу үчүн type өткөрүңүз.

ПараметрTypeМааниси
after integer cursor Акыркы иштетилген окуянын курсору. Башынан баштоо үчүн көрсөтпөңүз.
type string Үтүр менен бөлүнгөн окуя түрлөрү же үй-бүлөлөрү: booking.confirmed,order.placed же order, loyalty.*. Бардык окуялар үчүн көрсөтпөңүз.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
GET /v1/company/orders Окуу гана же окуу жана жазуу

Буйрутмаларды тизмелөө

Коноктордун столдон, алып кетүүгө жана жеткирүүгө берген буйрутмалары жана кассада катталган ар бир сатуу, эң эскисинен баштап — же paidSince көрсөтүлсө, төлөнгөн тартибинде. Алдын ала төлөмүн күтүп жаткан буйрутма тизмеге кирбейт.

ПараметрTypeМааниси
status string Үтүр менен бөлүнгөн: open, paid.
source string customer (конок берген) же staff (кызматкер каттаган).
fulfilment string Үтүр менен бөлүнгөн: dine_in, takeaway, delivery.
branchId integer Бир филиал менен чектөө.
from ISO 8601 datetime Ушул убакытта же андан кийин түзүлгөн буйрутмалар гана.
to ISO 8601 datetime Ушул убакытка чейин түзүлгөн буйрутмалар гана.
paidSince ISO 8601 datetime Ушул убакыттан бери төлөнгөн буйрутмалар гана; сатууларды шайкештирүү үчүн paidAt боюнча өсүү тартибинде иреттейт.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
page integer 1ден башталган барак номери. Демейки 1.
GET /v1/company/orders/{id} Окуу гана же окуу жана жазуу

Буйрутманы алуу

Позициялары, суммалары жана атрибуциясы менен бир буйрутма — буйрутма вебхуктары жеткирген формада.

GET /v1/company/loyalty/programs Окуу гана же окуу жана жазуу

Ишенимдүүлүк программаларын тизмелөө

Мөөр картасынын ар бир программасы: аталышы, абалы, керектүү мөөрлөр, сыйлык жана ал кайда колдонулат.

GET /v1/company/loyalty/cards Окуу гана же окуу жана жазуу

Ишенимдүүлүк карталарын тизмелөө

Мүчөлөрдүн карталары, ишенимдүүлүк объектинин формасында. Картаны толтурган мүчөдө ал completed абалында болуп, жанында жаңы активдүү карта ачылат; customer.id — мүчө.

ПараметрTypeМааниси
programId integer Бир программа менен чектөө.
customerId integer Бир мүчө менен чектөө.
status string Үтүр менен бөлүнгөн: active, completed.
updatedSince ISO 8601 datetime Ушул убакыттан бери мөөр басылган же толтурулган карталар гана; updatedAt боюнча өсүү тартибинде иреттейт.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
page integer 1ден башталган барак номери. Демейки 1.
GET /v1/company/loyalty/rewards Окуу гана же окуу жана жазуу

Ишенимдүүлүк сыйлыктарын тизмелөө

Картаны толтуруп алынган сыйлыктар — коду, жарактуулук мөөнөтү жана колдонулган-колдонулбаганы менен.

ПараметрTypeМааниси
programId integer Бир программа менен чектөө.
customerId integer Бир мүчө менен чектөө.
status string Үтүр менен бөлүнгөн: issued, redeemed, expired.
from ISO 8601 datetime Ушул убакытта же андан кийин берилген сыйлыктар гана.
to ISO 8601 datetime Ушул убакытка чейин берилген сыйлыктар гана.
limit integer Беттин өлчөмү, 1–100. Демейки 50.
page integer 1ден башталган барак номери. Демейки 1.
GET /v1/company/webhooks Окуу гана же окуу жана жазуу

Вебхук жазылууларын тизмелөө

Ушул ачкыч түзгөн жазылуулар. Панелде кошулган вебхуктар бул жерде көрсөтүлбөйт.

POST /v1/company/webhooks Окуу гана же окуу жана жазуу

Вебхукка жазылуу

URL дарегине окуяларды жөнөтүүнү баштайт — колдонуучу триггерди күйгүзгөндө автоматташтыруу платформасынын колдонмосу ушуну чакырат. Жазылууну жана анын кол тамга ачкычын бир жолу кайтарат. JSON денеси: {"url": "…", "events": ["order.placed"]}; Zapier’дин {"target_url": "…", "event": "…"} форматы да кабыл алынат.

ПараметрTypeМааниси
url string, required Жөнөтүлө турган https дарек (target_url да кабыл алынат).
events array of strings, required Окуя түрлөрү, order.* же loyalty сыяктуу үй-бүлөлөр, же баары үчүн * (бир окуя үчүн event да кабыл алынат).
description string Панелде көрсөтүлүүчү аталыш. Демейки боюнча — платформа жана ачкычтын аталышы.
DELETE /v1/company/webhooks/{id} Окуу гана же окуу жана жазуу

Вебхук жазылуусун жокко чыгаруу

Ушул ачкыч түзгөн жазылууга жөнөтүүнү токтотот. 204 кайтарат. Ачкычты жокко чыгаруу анын бардык жазылууларын да өчүрөт.

Брондоо объектиси

Брондоо жана жолугушуу бирдиктүү жалпы форматта көрсөтүлөт: type, id, status, source, guestInitiated, startsAt/endsAt/убакыт зонасы (бөлүмдүн өзүнүн зонасы), валюта, компания, бөлүм, конок, attribution, conversionId, createdAt/updatedAt — ошондой эле резервация үчүн partySize жана таблица, ал эми жолугушуу үчүн кызмат жана адис. Бул так webhook жеткирген нерсе, ошондуктан бирин иштете алган кабыл алуучу экөөнү тең иштете алат.

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…" }
  }
}

Буйрутма объекти

Буйрутма кайсы жерде кездешпесин бир формада келет — REST API, буйрутма вебхуктары, окуялар агымы: kind ("order"), id, number (кызматкерлер чакырган номер), status (open же paid), source (customer же staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (кызматкер аныктаган ишенимдүүлүк мүчөсү), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (чайпулсуз буйрутманын наркы — конверсияларга ушул сан жөнөтүлөт), paymentMethod, servedBy, conversionId, createdAt, paidAt жана attribution. Акча ар дайым майда бирдиктерде (тыйын, цент).

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…" }
  }
}

Ишенимдүүлүк объекти

Ар бир ишенимдүүлүк окуясы, картасы жана сыйлыгы бир формада: kind ("loyalty"), id (карта), timezone, company, branch (окуя болгон жер, эгер бар болсо), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (мөөр үчүн: source, issuedBy, createdAt) жана reward (сыйлык үчүн: code, title, status, expiresAt, redeemedAt, redeemedBy), ошондой эле conversionId — ишенимдүүлүккө катталуу ушул ID менен жөнөтүлөт.

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…"
}

Иш-чаралардын агымы

Ар бир сап: { id, cursor, type, createdAt, previousStatus, data }. data окуянын префикси атаган ачкычтын астында объектти камтыйт: data.booking, data.order же data.loyalty. Иштетилген эң чоң cursor маанисин сактап, аны after катары кайра өткөрүңүз — ал эч качан сапты өткөрүп жибербейт жана кайталабайт, ошондуктан бузулуудан кийин улантуу коопсуз. Иштетпеген түрлөрдү этибарга албаңыз: жаңылары кошулушу мүмкүн.

Окуянын түрүМааниси
booking.requestedКонок сиздин ырастооңузду күткөн брондоону сурады.
booking.confirmedБрондоо ырасталды — дароо ырасталган болуп түзүлгөн же кийин кызматкер ырастаган.
booking.cancelledКонок же мекеме жокко чыгарды; кимиси экенин status көрсөтөт.
booking.no_showКонок келген жок.
booking.completedВизит аяктады.
order.placedКоноктун буйрутмасы мекемеге жетти — барактан, столдун QR кодунан, алып кетүүгө же жеткирүүгө; мекеме алдын ала төлөм алса — төлөмдөн кийин.
order.paidКаалаган буйрутма төлөндү, кассада катталган сатууларды кошо алганда.
loyalty.member_joinedКардар программада биринчи мөөрүн алды.
loyalty.stamp_addedКартага мөөр кошулду.
loyalty.reward_issuedКарта толуп, сыйлык берилди.
loyalty.reward_redeemedСыйлык коногко тапшырылды.
Иш-чаралардын жаңыртууларынан кабардар болуп туруңуз
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
  -H "Authorization: Bearer tt_live_…"

Вебхуктар

Интеграциялар → Webhooks & API бөлүмүндө эндпоинт түзүңүз — же Интеграциялар → Автоматташтыруу бөлүмүндө Zapier, Make, n8n же Pipedream туташтырыңыз — ошондо брондоо, буйрутма же ишенимдүүлүк картасы өзгөргөн замат TapTime кол тамгалуу JSON окуяны POST аркылуу жөнөтөт. Окуяларды ар бир эндпоинт үчүн өзүңүз тандайсыз. Компанияда жалпысынан 50гө чейин вебхук, постбэк, чат жана автоматташтыруу туташуусу болушу мүмкүн.

БашМааниси
TapTime-EventИш-чаранын түрү, мисалы booking.confirmed.
TapTime-Event-IdОкуя үчүн туруктуу идентификатор — кайра аракеттелген жеткирүүнү кайталоодон ажыратуу үчүн колдонуңуз.
TapTime-DeliveryБул конкреттүү жеткирүү аракеттин идентификатору.
TapTime-Signaturet=<unix убактысы>,v1=<hex HMAC-SHA256 of "t.rawBody">, пункттун өзүнүн сырдуу ачкычы менен кол коюлган.
  • Ар бир 2xx жооп жеткирилген деп эсептелет; 2xx эмес жооп же убакыт аягы (timeout) болгондо интервалды узартып (1 мүнөт, 5 мүнөт, 15 мүнөт, 1 саат, 3 саат, 6 саат, 12 саат) 8 жолу кайра аракет кылынат — 410 статусунда кайра аракеттенүү токтойт.
  • Жөнөтүүлөр ээрчитилбейт.
  • Өндүрүш чөйрөсүндө URL HTTPS болушу керек жана жеке же loopback дарекке багытталышына болбойт.
  • Жеткирүү жок дегенде бир жолу жүргүзүлөт: кол тамганы ар дайым текшерип, TapTime-Event-Id боюнча кайталанууларды жок кылыңыз.
Жарыялоо · 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", "…": "…" } }
}
Кол тамганы текшерүү (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));

Вебхукка жазылуулар

Автоматташтыруу платформалары колдонуучудан URL коюуну суранбастан, триггерлерди API аркылуу күйгүзүп-өчүрөт («REST hooks»): платформанын өз URL дарегин керектүү окуялар менен POST кылыңыз, кайтарылган id маанисин сактаңыз жана триггер өчүрүлгөндө аны DELETE кылыңыз. Жазылуу — кадимки кол тамгалуу вебхук: ал панелде аны түзгөн ачкыч менен белгиленип көрүнөт.

  • Ачкыч өзү түзгөн жазылууларды гана көрөт жана өчүрөт; ачкычты жокко чыгаруу алардын баарын өчүрөт.
  • hooks.zapier.com, make.com жана pipedream.net даректери таанылат жана платформанын аталышы менен көрсөтүлөт; башка ар кандай https дарек — жөнөкөй вебхук.
  • Кол тамга ачкычы бир жолу, POST сурамынын жообунда кайтарылат; ээси аны панелден кайра көрө алат.
URL дарегин жаңы буйрутмаларга жазуу
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"]}'

Постбэктер

Макростор толтурулган трекериңиздин өз URL дарегине GET же POST сурамы — JSON вебхуктардын ордуна query-string постбэктерин колдонгон платформалар үчүн. Буйрутма үчүн {value} — чайпулсуз буйрутманын наркы, {order_id} — анын id мааниси.

Орду толтуруучу белгилер менен постбек URL · GET же POST
https://tracker.example/postback
  ?cid={click_id}&event={event}&status={status}
  &payout={value}&cur={currency}

Колдонууга жеткиликтүү орун алмаштыргычтар

  • {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}

Катчылыктар

Ар бир ката JSON түрүндө: { "error": "<code>", "message": "<human-readable>" }.

StatusкатаМааниси
401 unauthorized Авторизация башы жок же ачкыч жараксыз же жокко чыгарылган.
403 forbidden Жазып коюу чекити (статусун өзгөртүү) деп аталган окуу гана ачкыч.
404 not_found Бул идентификатор менен катталган эч кандай брондоо ачкычтын компаниясына таандык эмес.
409 conflict Статус өзгөрүүсү столду же слотту эки жолу брондоп коер эле; эч нерсе өзгөргөн жок.
422 invalid_status Статус талаасынын мааниси бул брондоо түрү үчүн кабыл алынган маанилердин бири эмес.
422 invalid_type Окуялар агымындагы type эч бир окуя түрүн же үй-бүлөсүн атабайт.
422 invalid_url Жазылуунун URL дареги ачык https дарек эмес.
429 rate_limited Бул ачкыч үчүн бир мүнөттө 50дөн ашык сурам келип жатат. Жайлатыңыз жана кайра аракет кылыңыз.
Ачкыч керекпи?

API мүмкүнчүлүгү, вебхуктар жана автоматташтыруу менен чат интеграциялары ар бир модулга кирет — кошумча акысыз, өзүнчө иштеп чыгуучу тарифисиз.

Акысыз сыноону баштаңыз