FAMS / API V1

Сіздің үдерісіңіз.
Біздің API.

API жеке кабинеттегі сауалнамаларға, файлдарға, өтінімдерге және жарыстарға қолжетімділік береді. Әр сұрау дерек иесі және API кілтінің құқықтары бойынша шектеледі.

API кілтін құру ↗

Postman, код генераторлары және басқа құралдар үшін OpenAPI 3.1 JSON спецификациясын жүктеңіз.

1. Кілтті құру және сақтау

Жеке кабинет → API қолжетімділігі → Кілт құру бөліміне өтіңіз. Интеграция атауын, мерзімін және ең аз қажетті құқықтарды көрсетіңіз. Токен бір рет қана көрсетіледі. Оны сервердегі орта айнымалысында сақтаңыз және ашық JavaScript ішіне салмаңыз.

Authorization: Bearer YOUR_TOKEN
Accept: application/json

Bearer сұрауларына CSRF қажет емес. Браузер сессиясы алдымен GET /api/v1/session шақырып, өзгеріс енгізетін сұрауларға X-CSRF-Token жіберуі керек. Бөгде сайттан браузерлік CORS әдепкіде жабық, сондықтан интеграция API-ды өз серверінен шақырады.

Тіркелу, құпиясөзді қалпына келтіру сұрауы және байланыс нысаны бір реттік CAPTCHA талап етеді. Сол сессияда GET /captcha?purpose=register|forgot|contact шақырып, data.image ішіндегі PNG суретін көрсетіңіз, содан кейін captcha_id және суреттегі бес таңбаны captcha_answer ретінде жіберіңіз. Код 10 минут және бір әрекет үшін жарамды; жаңа код алдыңғысын жарамсыз етеді.

2. Алғашқы сұрау

curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://nw.fams.kz/api/v1/profiles
{
  "data": [{"id": 123, "kind": "athlete", "name": "Спортшының аты"}],
  "meta": {},
  "request_id": "сұрау нөмірі"
}

3. Файл мен паспортты жүктеу

20 МБ-қа дейінгі JPG, PNG, WebP және PDF қабылданады. Файлдар жалпыға ашық бумадан тыс сақталады. Жауаптағы data.id мәнін сақтап, file_id немесе photo_id ретінде жіберіңіз.

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  -F "file=@passport.pdf" -F "purpose=identity" \
  https://nw.fams.kz/api/v1/files
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profile_id":123,"type":"passport","file_id":"FILE_UUID","number":"N1234567","country":"Kazakhstan","issued_at":"2025-01-15","expires_at":"2035-01-15"}' \
  https://nw.fams.kz/api/v1/documents

identity және passport жеке басты куәландыратын құжат талабына сай келеді. Басқа түрлер: driver, medical, consent, organization. Шетелдік паспорт нөмірінде әріптер болуы мүмкін, ЖСН міндетті емес.

Бас тарту себебі: review_note өрісі GET /profiles/{id} және GET /applications/{id} жауаптарында келеді. Мәртебе rejected немесе changes болса, оны пайдаланушыға көрсетіңіз. Әкімші құжатты қайтарғанда немесе қабылдамағанда 5–3000 таңбалық себепті міндетті түрде жазады.

Негізгі маршруттар

/api/v1 кейінгі әдіс пен жолМақсатыҚұқық
GET /catalog?kind=serviceҚызметтер мен тарифтерЖалпыға ашық
GET /services/pricesАғымдағы АЕК және барлық белсенді қызметтің теңгедегі нақты бағасыapplications:read
GET, POST /profilesСауалнамаларды алу немесе құруprofiles:read / profiles:write
GET /profiles/summaryҚұжат, өтінім, сертификат және жарыс есептегіштері бар спортшылардың ықшам тізіміprofiles:read
GET /profiles/{id}/portfolioБір спортшының сауалнамасы, құжаттары, сертификаттары, өтінімдері және жарыстарға қатысуыprofiles:read, тек иесі
PATCH /profiles/{id}Сауалнама деректерін немесе фотоны өзгертуprofiles:write
POST /profiles/{id}/submitСауалнаманы тексеруге жіберуprofiles:write
POST /documentsСауалнамаға құжат тіркеуprofiles:write
GET, POST /filesФайлдарды алу немесе жүктеуfiles:read / files:write
GET /applicationsӨз өтінімдеріңізді алуapplications:read
POST /applications/quoteСерверде бағаны есептеуapplications:write
POST /applicationsӨтінім жобасын құруapplications:write
POST /applications/{id}/submitӨтінімді тексеріп жіберуapplications:write
POST /applications/{id}/payҚайта есептен шығарудан қорғалған баланстық төлемwallet:write
GET /applications/{id}/certificateМақұлданған және төленген құжатты жүктеуapplications:read
PUT /applications/{id}/sharingХалықаралық лицензия құжаттарын QR арқылы ашу немесе жабуapplications:write, тек иесі
GET /applications/{id}/qrМақұлданған және төленген халықаралық лицензия QR-ын жүктеуapplications:read
GET /event-registrationsӨз жарысқа қатысу өтінімдерін алуapplications:read
GET /events/{id}/registration-optionsЖарысқа жарамды сертификаттарapplications:read
POST /events/{id}/registerСпортшының өтінімін беру; өтінім төлемсізapplications:write
GET /events/{id}/registrationsҰйымдастырушыға спортшы өтінімдерін алуevents:read
PATCH /events/{id}/registrations/{registration_id}Мақұлдау, себеппен қайтару немесе бас тартуevents:write
GET /messengerТек рұқсат етілген диалогтар: әкімшілік және байланысты жарыстарnotifications:read
GET /messenger/{perspective}/registrations/{id}Қатысу өтінімі бойынша диалогnotifications:read
POST /messenger/{perspective}/registrations/{id}/messagesСервер анықтаған рұқсат етілген тарапқа хабарлама жіберуnotifications:write
GET, POST /eventsЖарыстарды алу немесе жоба құруevents:read / events:write
GET /events/public/{id}Жарияланған жарыс, құжаттама күйі және бекітілген нәтижелер кестесіЖалпыға ашық
GET /events/public/{id}/documents/{regulations|results}Бекітілген регламент немесе қорытынды хаттама; жүктеу үшін ?download=1Бекітілгеннен кейін жалпыға ашық
PATCH /events/{id}Жарыс дерегін немесе кезең файлын өзгертуevents:write
GET, POST /events/{id}/participantsҚатысушыларды алу немесе сертификатпен қосуevents:read / events:write
PATCH, DELETE /events/{id}/participants/{application_id}Нәтижені өзгерту немесе жіберуге дейін қатысушыны жоюevents:write
GET /walletБаланс, шоттар және операциялар тарихыwallet:read
GET /notificationsХабарламаларnotifications:read
GET, POST, DELETE /telegramTelegram-бот күйі, бір реттік сілтеме жасау немесе ажыратуӨзгерту үшін браузер сессиясы және CSRF
GET /verify/{token}Жеке деректерсіз жалпы тексеруЖалпыға ашық
GET /verify/{token}/documentsИесі рұқсат берген жарамды халықаралық лицензия құжаттарыРұқсат берілген QR арқылы жалпыға ашық

Өтінімдер, сақтандыру және ақша

GET /services/prices — жүйеге кірген пайдаланушы немесе интеграция үшін ресми тарифтер тізімі. Жауапта ағымдағы АЕК mrp.amount_minor, әр қызмет коэффициенті services[].mrp, Қазақстан бағасы price_kz_minor және рұқсат етілген санаттар үшін ТМД-ның толық бағасы price_cis_minor беріледі. _minor өрістері бүтін тиынмен көрсетіледі. Интерфейсте осы мәндерді көрсетіңіз, бірақ өтінім құрылғанда сервер қайтарған соманы соңғы сома деп қабылдаңыз.

Telegram API-дегі сол тексеру ережелерін қолданады. Пайдаланушы оны Қауіпсіздік бетіндегі 10 минуттық бір реттік кодпен қосады; құпиясөз бен API кілті Telegram-ға жіберілмейді. Көлік webhook-ы тек Telegram үшін арналған және X-Telegram-Bot-Api-Secret-Token арқылы қорғалған. Серверді баптау docs/telegram-bot.md ішінде.

Ұлттық сертификатта сақтандыру үдерісі әрқашан бар. Жалғыз төлем — таңдалған санаттың сақтандыру жарнасы; бөлек сақтандыру қызметі немесе қосқыш жоқ. Бұрынғы формула сақталған: санат тарифі × АЕК, ал ТМД аумағы рұқсат етіліп таңдалса, санаттың ТМД үстемесі × АЕК қосылады. insurance_coverage_minor — сақтандыру төлемінің емес, қамту сомасының мәні. Жауап өрістерін сақтандыруды өшіру үшін қолданбаңыз.

Бағаны сервер есептеп, өтінімге сақтайды. Клиент есептеген бағаны жібермеңіз. _minor деп аяқталатын ақша өрістері бүтін тиынмен беріледі; шоттағы amount "15000.00" сияқты жол болуы керек. Таймауттан кейін шотты қайталағанда сол Idempotency-Key пен соманы қолданыңыз.

Ұйымдастырушының қадамдары

  1. kind: "organizer" сауалнамасын құрып, деректерді толтырыңыз және мақұлдауды күтіңіз.
  2. /events ішінде жарыс жобасын құрыңыз.
  3. /events/{id}/agreement жүктеп, қол қойыңыз; сканды жүктеп, agreement кезеңіне тіркеңіз.
  4. details кезеңін жіберіп, data.application_id арқылы берілген жарна өтінімін төлеңіз.
  5. Мақұлданғаннан кейін regulations файлын жіберіңіз.
  6. Жарыстан кейін әр спортшыны POST /events/{id}/participants арқылы қосыңыз. certificate өрісіне сертификат нөмірін, тексеру кодын немесе толық QR сілтемесін беруге болады. Сервер спортшыны өзі анықтап, сертификаттың мақұлдануын, төлемін және жарыс күндеріндегі жарамдылығын тексереді. category, start_number, result_status, place және result өрістерін толтырыңыз.
  7. Қорытынды PDF тіркеп, results кезеңін жіберіңіз. Тексеру кезінде қатысушылар тізімі жабылады.

Қателер, лимиттер және әкімші маршруттары

401 — кіру қатесі; 403 — құқық жеткіліксіз; 404 — жазба жоқ немесе басқа иеге тиесілі; 409 — мәртебе, баланс не идемпотенттік қайшылығы; 419 — CSRF; 422 — тексеру қатесі; 429 — сұрау лимиті; 503 — интеграция өшірілген. Қателерде error.code, error.message және кейде error.details болады. Қолдауға request_id беріңіз, API кілтін бермеңіз.

Тізім маршруттары 1–100 аралығындағы page және limit параметрлерін қабылдап, meta.total қайтарады. Күндер YYYY-MM-DD пішімінде, уақыт белдеуі — Қазақстан, UTC+5.

Әкімші маршруттарына әкімші рөлі және admin:read / admin:write қажет. GET /admin/athletes спортшылар сауалнамаларын береді және аты-жөні, ЖСН, телефон, қала, email немесе ID бойынша status, certificate (issued, not_issued, pending) және q сүзгілерін қолдайды. Жауапта сертификаттың берілу күйі, соңғы өтінім, нөмірі мен жарамдылық мерзімі, аккаунт иесі және құжаттар мен өтінімдер саны бар. CSV кестесі GET /admin/export?kind=athletes арқылы жүктеледі. Балансты қолмен түзету, кері жазба, құқық пен кілттерді өзгерту үшін браузер сессиясы мен құпиясөз растауы да керек. Банк callback-ы төлемді өздігінен растамайды; сервер шотты, соманы, валютаны және терминалды банкпен салыстырады.

PUT /admin/profiles/{id}/owner сауалнаманы басқа белсенді қатысушы аккаунтына ауыстырады. current_user_id, target_user_id, кемінде бес таңбалық себеп және әкімші құпиясөзін жіберіңіз. Байланысты құжаттар, өтінімдер, сертификаттар, ұйымдастырушы жарыстары, файлдар және жарыс чаттарының контексті бір транзакцияда көшеді. Берілген сертификат көшірмелері, төленген сомалар және бухгалтерлік өткізбелер өзгермейді. QR арқылы құжаттарға ашық қолжетімділік жаңа иесі келісім бергенге дейін жабылады. Екі иесіне де хабарлама жіберіліп, әрекет аудитке жазылады.

Ұлттық сертификаттар: үш тізім

GET /admin/national ұлттық сертификаттарды және ағымдағы әкімшінің бөлек review, insurance, print тізімдерін қайтарады. Сүзгілер: year, q, service_id, status, paid, insurance, print, page, limit.

POST /api/v1/admin/national/lists/insurance
{"operation":"add","ids":[123,124]}

POST /api/v1/admin/national/lists/insurance/export
{"ids":[123,124]}

Басқа операциялар: remove, clear және жылмен бірге auto. Бір тізімде 200 жазбаға дейін болады. Сақтандыру мен баспаға мақұлдау және төлем керек. Экспорт HTTP 201 және data.file.download_url қайтарады. Сақтандыру XLSX, баспа document.xlsx, foto/, qr/ бар ZIP жасайды. Экспорт белгісі файлдың дайындалғанын ғана білдіреді; сайт деректерді үшінші тарапқа жібермейді және полис рәсімдемейді.

Сертификатты тексеру және QR құжаттарына келісім

GET /verify/{token} үшін HTTP 200 жазбаның табылғанын білдіреді; жарамдылықты тек data.valid растайды. Негізгі жауапта аты-жөні, скандар және ішкі ескертулер жоқ. Халықаралық лицензия иесі PUT /applications/{id}/sharing сұрауымен {"enabled":true,"confirmed":true} жіберіп қолжетімділікті ашады, {"enabled":false} арқылы жабады. Әкімші иесінің орнына келісім бере алмайды.

GET /verify/{token}/documents лицензия мақұлданған, төленген, қазір жарамды және рұқсат ашық болғанда ғана жұмыс істейді. Жауапта рұқсат етілген өрістер мен мақұлданған скан сілтемелері ғана болады; ЖСН, телефон, мекенжай, ішкі UUID және сақтау жолдары қайтарылмайды. Әр файл сілтемесі мәртебе мен келісімді қайта тексереді, сондықтан рұқсатты жабу бірден күшіне енеді.

Әкімші анкета немесе құжат деректерін PATCH /admin/records/{profile|document}/{id} сұрауымен, admin:write құқығымен және алдыңғы GET қайтарған дәл updated_at мәнімен түзетеді. Тексеру мәртебесі мен жүктелген скан сақталады, иесіне хабарлама жіберіледі, өзгерген өрістер аудитке жазылады. Ескірген нұсқа 409 қайтарады. Белсенді өтінімге тіркелген құжаттың түрін өзгертуге болмайды, ал басқа деректерін түзетуге болады. Бұрын берілген сертификаттың бекітілген көшірмесі өзгермейді.

API арқылы федерациямен чат

Қатысушы хаттарды GET /chat арқылы алады, POST /chat/messages адресіне {"message":"Мәтін"} жібереді, жауаптарды POST /chat/read арқылы оқылған деп белгілейді және санақты GET /chat/unread арқылы алады. Бұл маршруттарға notifications:read және notifications:write қажет.

Әкімші GET /admin/chats, GET /admin/chats/{user_id}, POST /admin/chats/{user_id}/messages және POST /admin/chats/{user_id}/read маршруттарын admin:read/admin:write құқықтарымен қолданады. Хабарлама 1–3000 таңба, HTML орындалмайды, диалогтар аккаунт бойынша бөлінген, жіберу аудит журналында сақталады.

Жабық мессенджер GET /messenger арқылы алынады. Ол тек FAMS әкімшілігін, спортшының өз қатысу өтінімдерін және ұйымдастырушы иелік ететін жарыстардың өтінімдерін қайтарады. Өтінім диалогы: GET /messenger/{athlete|organizer}/registrations/{id}; жіберу үшін /messages, оқылған деп белгілеу үшін /read жалғанады. Еркін user_id немесе алушыны іздеу жоқ, бөгде өтінімге 404 қайтарылады.

Әкімшінің пайдаланушы атынан кіруі

POST /admin/impersonate сұрауына {"user_id":123,"password":"..."} жіберу әкімшінің браузер сессиясында белсенді қатысушы аккаунтын ашады. Bearer токені қабылданбайды. Сервер сессия ID мен CSRF токенін ауыстырады; POST /auth/impersonation/stop әкімші аккаунтына қайтарып, оларды қайта ауыстырады. Пайдаланушы режимінде құпиясөзді, API кілттерін және Telegram байланысын өзгертуге болмайды. Кіру, шығу және аудиттегі әрекеттер нақты әкімші ID-імен және impersonated_user_id мәнімен сақталады.