შიგთავსზე გადასვლა
დოკუმენტაცია · API v1

IDmatic API და Web SDK

ყველაფერი, რაც ინტეგრაციისთვის გჭირდებათ: ვინაობის დადასტურების შექმნა, შედეგის მიღება, ხელმოწერილი webhook-ები, Web SDK და უსაფრთხოების მოთხოვნები — მაგალითებით.

REST · JSON · UTF-8Bearer ავთენტიფიკაციაWebhook · HMAC-SHA256600 მოთხოვნა/წთTLS / HSTS

მიმოხილვა

IDmatic არის ვინაობის დისტანციური დადასტურების პლატფორმა. თქვენი სერვერი ქმნის ვინაობის დადასტურების სესიას, მომხმარებელი ტელეფონით გადაიღებს დოკუმენტს და სახის ფოტოს, ხოლო IDmatic ამოიცნობს დოკუმენტს, ამოწმებს მას და გიბრუნებთ სტრუქტურირებულ შედეგს და გადაწყვეტილებას.

1
შექმნა
POST /v1/verifications
2
მომხმარებელი
ბმული · SDK · ვიჯეტი
3
შეტყობინება
webhook (სტატუსი)
4
შედეგი
GET /v1/verifications/{id}
  • ბაზური მისამართი: https://idmatic.net (On-premise-ზე — თქვენი სერვერის მისამართი). ყველა მოთხოვნა და პასუხი — JSON, UTF-8.
  • მანქანით წაკითხვადი სპეციფიკაცია: /openapi.yaml (OpenAPI 3.1) — კლიენტის ბიბლიოთეკის გენერაციისთვის.
  • დროები — ISO 8601 / RFC 3339 ფორმატში, UTC-ში. ქვეყნის კოდები — ISO 3166-1 alpha-3 (მაგ. GEO).

სწრაფი დაწყება

ინტეგრაცია ხუთი ნაბიჯია. სატესტო რეჟიმში ყველაფერი უფასოა და რეალურ მომხმარებლებზე გავლენას არ ახდენს.

  1. 1დარეგისტრირდით და კაბინეტში შექმენით სატესტო API გასაღები (idm_test_…) — „დეველოპერები → API გასაღებები“.
  2. 2თქვენი სერვერიდან შექმენით ვინაობის დადასტურება: POST /v1/verifications.
  3. 3მიღებული url გაუგზავნეთ მომხმარებელს, გადაამისამართეთ ან გახსენით Web SDK-ით.
  4. 4დაარეგისტრირეთ webhook („დეველოპერები → Webhook-ები“) და შეამოწმეთ ხელმოწერა.
  5. 5webhook-ის მიღების შემდეგ წამოიღეთ სრული შედეგი: GET /v1/verifications/{id}.
curl -X POST https://idmatic.net/v1/verifications \
  -H "Authorization: Bearer $IDMATIC_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "CUST-1042",
    "redirect_url": "https://example.ge/kyc/done",
    "metadata": { "channel": "web", "plan": "gold" }
  }'
რჩევა
გამოიყენეთ reference თქვენი სისტემის იდენტიფიკატორისთვის (მაგ. კლიენტის ან განაცხადის ნომერი) — ის ბრუნდება შედეგში და webhook-ში, რაც აადვილებს მიბმას.

ავთენტიფიკაცია და გარემოები

API მოთხოვნები ავტორიზდება კაბინეტში შექმნილი გასაღებით, HTTP სათაურით:

HTTP
Authorization: Bearer idm_live_XXXXXXXXXXXXXXXXXXXXXXXX
პრეფიქსიგარემოაღწერა
idm_test_სატესტოუფასო; ვინაობის დადასტურებები აღინიშნება როგორც mode: "test" და არ ითვლება ბილინგში.
idm_live_საწარმოორეალური ვინაობის დადასტურებები; ითვლება პაკეტის მიხედვით.
  • გასაღები გამოიყენეთ მხოლოდ სერვერიდან. ბრაუზერსა და მობილურ აპლიკაციაში API გასაღები არასდროს მოათავსოთ — იქ მხოლოდ ვინაობის დადასტურების url გადაეცემა.
  • გასაღები შეგიძლიათ შეზღუდოთ თქვენი სერვერების IP მისამართებით; სხვა მისამართიდან მოთხოვნა დაბრუნდება 403 ip_not_allowed.
  • გასაღების გაჟონვის ეჭვისას — დაუყოვნებლივ გააუქმეთ კაბინეტში და შექმენით ახალი. გასაღებების შექმნა და გაუქმება აუდიტში ფიქსირდება.

ვინაობის დადასტურების შექმნა

POST/v1/verificationsახალი სესია
ველიტიპიაღწერა
referencestring ≤ 120თქვენი იდენტიფიკატორი (არასავალდებულო). ბრუნდება შედეგსა და webhook-ში.
redirect_urlURLსად დაბრუნდეს მომხმარებელი დასრულების შემდეგ (ბმულის/გადამისამართების რეჟიმში).
metadataobject ≤ 20თავისუფალი key → string წყვილები თქვენი საჭიროებისთვის.
send_toobjectბმულის გაგზავნა პირისთვის მაშინვე: email და/ან phone (SMS — საქართველოს ნომრებზე: 5XX… ან +995…), name — მიმართვისთვის. მიმღები არ ინახება — მხოლოდ დაფარული სახით; შედეგი — პასუხის sent ველში.

სხეულში უცნობი ველები არ მიიღება (400 invalid_json) — ეს იცავს შეცდომით გაგზავნილი მონაცემებისგან.

201 Created
HTTP/1.1 201 Created

{
  "id": "ver_…",
  "status": "created",
  "url": "https://idmatic.net/verify#vs_…",
  "sdk_token": "vs_…",
  "expires_at": "2026-10-08T12:00:00Z"
}
ველიაღწერა
idვინაობის დადასტურების იდენტიფიკატორი — შეინახეთ თქვენს ბაზაში.
urlვინაობის დადასტურების გვერდი. ტოკენი URL-ის ფრაგმენტშია (#), ამიტომ სერვერის ჟურნალებში და Referer-ში არ ხვდება.
sdk_tokenიგივე ტოკენი ცალკე — საკუთარი ინტეგრაციისთვის.
expires_atბმულის მოქმედების ვადა; ვადის გასვლის შემდეგ სტატუსი ხდება expired.
sentმხოლოდ send_to-ით: თითო არხის შედეგი (channel, დაფარული to, ok, error).

სტატუსები და გადაწყვეტილება

სტატუსიმნიშვნელობა
createdსესია შექმნილია, მომხმარებელს ჯერ არ დაუწყია.
in_progressმომხმარებელი გადის ნაბიჯებს (თანხმობა, დოკუმენტი, სახის ფოტო).
processingმასალა მიღებულია, მიმდინარეობს ამოცნობა და შემოწმება.
approvedყველა შემოწმება გავიდა — ავტომატურად ან ოპერატორის მიერ დადასტურებული.
declinedუარყოფილია; მიზეზები — decision.reasons-ში.
reviewსაჭიროებს ოპერატორის განხილვას (წაუკითხავი ან საეჭვო მონაცემი).
expiredბმულის ვადა გავიდა, ვინაობის დადასტურება არ დასრულებულა.
abandonedმომხმარებელმა პროცესი შეწყვიტა.

გადაწყვეტილების ობიექტი: decision.status, decision.reasons (მიზეზების კოდები) და decision.manual — true, თუ საბოლოო გადაწყვეტილება ოპერატორმა მიიღო.

Fail closed
ავტომატური დადასტურება ხდება მხოლოდ მაშინ, როცა ყველა შემოწმება წარმატებულია. თუ რომელიმე მონაცემი ვერ წაიკითხა ან საეჭვოა, ვინაობის დადასტურება გადადის review სტატუსში და არასდროს — ავტომატურ approved-ში.

შედეგის მიღება

GET/v1/verifications/{id}სრული შედეგი
GET/v1/verifications?status=reviewუახლესი 100 ვინაობის დადასტურება (არასავალდებულო ფილტრით)
200 OK
GET /v1/verifications/ver_…

{
  "id": "ver_…",
  "status": "approved",
  "mode": "live",
  "reference": "CUST-1042",
  "decision": { "status": "approved", "reasons": [], "manual": false },
  "document": {
    "doc_type": "…",
    "doc_name": "პირადობის მოწმობა",
    "kind": "id_card",
    "country": "GEO",
    "mrz_format": "TD1",
    "fields": [
      { "key": "surname", "label": "გვარი", "value": "…",
        "source": "mrz+viz", "confidence": 100, "review": false },
      { "key": "personal_number", "label": "პირადი ნომერი", "value": "…",
        "source": "mrz+viz", "confidence": 100, "review": false }
    ],
    "risk": "low"
  },
  "checks": [
    { "id": "mrz", "status": "passed", "message": "…" },
    { "id": "document_expiry", "status": "passed", "message": "…" },
    { "id": "data_consistency", "status": "passed", "message": "…" }
  ],
  "created_at": "2026-10-07T12:00:00Z",
  "completed_at": "2026-10-07T12:01:04Z",
  "erased": false
}
ველიაღწერა
document.fields[]ამოღებული ველები: key, label, value; source — mrz, viz ან mrz+viz; confidence (0–100); review — საჭიროებს თუ არა გადამოწმებას.
document.mrz_formatTD1 (ბარათი) ან TD3 (პასპორტი) — ICAO 9303.
checks[]შემოწმებები: id, status (passed · failed · warning · not_performed), message.
erasedtrue — პერსონალური მონაცემები და გამოსახულებები წაშლილია (გადაწყვეტილება რჩება).
შედეგი — მხოლოდ სერვერიდან
ბრაუზერში მიღებულ onComplete-ს ან redirect-ს გადაწყვეტილებისთვის ნუ ენდობით — საბოლოო სტატუსი წაიკითხეთ webhook-ით ან GET /v1/verifications/{id}-ით.

გამოსახულებები

GET/v1/verifications/{id}/images/{key}JPEG

დოკუმენტიდან ამოჭრილი პორტრეტი (photo) ან ხელმოწერა (signature). ყოველი ნახვა აუდიტში იწერება. მონაცემების წაშლის შემდეგ პასუხი — 404.

რეგისტრატურა და HL7 FHIR

GET/v1/verifications/{id}/deskJSON
GET/v1/verifications/{id}/fhirFHIR R4 Patient

რეგისტრატურის მოდულით (კლინიკა, ლაბორატორია, ოფისი) შექმნილი ვინაობის დადასტურების ველები — მხოლოდ ის ველები, რომლებიც კომპანიამ „რეგისტრატურის“ პარამეტრებში მონიშნა. /desk აბრუნებს subject-ს (key, label, value), წარმომადგენლით სცენარში — representative-ს და relation-ს; /fhir — HL7 FHIR R4 Patient რესურსს (application/fhir+json): პირადი ნომერი — identifier, ბავშვის შემთხვევაში წარმომადგენელი — contact, დოკუმენტის გარეშე რეგისტრაცია — meta.tag unverified.

Webhook — პერსონალური მონაცემის გარეშე
მოვლენაში მხოლოდ ID, სტატუსი და სცენარი მოდის; ველები წაიკითხეთ ამ endpoint-ებით API გასაღებით.

სინქრონული ამოცნობა

POST/v1/recognizeარაფერი ინახება

როცა გამოსახულება უკვე თქვენს სისტემაშია (მაგ. ოფისის სკანერი), შეგიძლიათ პირდაპირ გაგზავნოთ ამოსაცნობად: {"front": "<base64>", "back": "<base64>"}. პასუხში ბრუნდება ველები, შემოწმებები, შემოთავაზებული სტატუსი და ამოჭრილი გამოსახულებები. სერვერზე არაფერი ინახება.

კოდიროდის
front_requiredწინა მხარე არ არის გადმოცემული.
too_large / too_many_pixelsფაილი ან გარჩევადობა ზღვარს აჭარბებს.
unsupported_image / corrupted_imageფორმატი არ არის მხარდაჭერილი ან ფაილი დაზიანებულია.
low_resolution / image_rejectedფოტო სტანდარტს არ აკმაყოფილებს — მესიჯში მიზეზი და რჩევაა.
402 limit_reached / no_planlive გასაღებით ყოველი წარმატებული ამოცნობა პაკეტიდან ერთ ვინაობის დადასტურებად ითვლება; ლიმიტის ამოწურვისას — 402 (ვერ შესრულებული ამოცნობა არ ითვლება). სატესტო გასაღებით — სატესტო ლიმიტით.

მონაცემების წაშლა

DELETE/v1/verifications/{id}GDPR, მუხლი 17

შლის გამოსახულებებს და პერსონალურ მონაცემებს; გადაწყვეტილება, სტატუსი და აუდიტის ჩანაწერი რჩება. გარდა ამისა, კაბინეტში მითითებული შენახვის ვადის გასვლისას წაშლა ავტომატურად ხდება.

დოკუმენტის ტიპები

GET/v1/document-typesაქტიური ტიპები

აბრუნებს თქვენს ანგარიშზე აქტიურ დოკუმენტის ტიპებს. საქართველოს დოკუმენტები (პირადობის მოწმობა, პასპორტი, ბინადრობის და მართვის მოწმობა) ეფუძნება PRADO-ს რეესტრის ემისიებს.

შეცდომები და ლიმიტები

შეცდომა ყოველთვის ერთი ფორმისაა. request_id მიუთითეთ მხარდაჭერასთან მიმართვისას.

Error
{
  "error": {
    "code": "invalid_api_key",
    "message": "…",
    "request_id": "req_…"
  }
}
HTTPმაგალითირა ვქნა
400invalid_json, invalidშეამოწმეთ სხეული — უცნობი ან არასწორი ველი.
401invalid_api_keyგასაღები არასწორია ან გაუქმებულია.
402no_plan, limit_reached, past_due, payment_required, trial_over, test_limitპაკეტი არ არის, მისი ლიმიტი ამოიწურა (მომსახურება ჩერდება — დამატებითი პაკეტი ან უფრო დიდი ტარიფი), ინვოისი ვადაგადაცილებულია ან ჯერ გადასახდელია, საცდელი დასრულდა, სატესტო ზღვარი ამოიწურა. ეხება ვინაობის დადასტურებასაც და დოკუმენტის ამოცნობასაც (/v1/recognize).
403ip_not_allowed, org_suspendedIP შეზღუდვა ან ანგარიშის სტატუსი.
404not_foundობიექტი არ არსებობს ან სხვა კომპანიას ეკუთვნის.
409invalid_stateმოქმედება ამ სტატუსში შეუძლებელია.
413 / 415 / 422too_large, unsupported_media_type, image_rejectedფაილის ზომა, ტიპი ან ხარისხი.
429rate_limitedგადააჭარბეთ ლიმიტს — დაელოდეთ Retry-After წამს.
503busy, engine_unavailableდროებით გადატვირთულია — სცადეთ Retry-After-ის შემდეგ.
  • ლიმიტი: 600 მოთხოვნა წუთში თითო გასაღებზე.
  • გამეორებისას გამოიყენეთ ექსპონენციალური დაყოვნება და გაითვალისწინეთ Retry-After სათაური.

მოვლენები და მიწოდება

Webhook-ი გატყობინებთ ვინაობის დადასტურების სტატუსის ცვლილებას. მიმართულება და საიდუმლო გასაღები კაბინეტში იმართება. შეტყობინება პერსონალურ მონაცემებს არ შეიცავს — მხოლოდ სტატუსს და გადაწყვეტილებას.

მოვლენაროდის
verification.completedავტომატური გადაწყვეტილება მიღებულია (approved / declined).
verification.reviewვინაობის დადასტურება გადავიდა ხელით განხილვაზე.
verification.updatedოპერატორმა შეცვალა ან დაადგინა გადაწყვეტილება, ან დაუსრულებელი ვინაობის დადასტურება წაიშალა (status: abandoned).
verification.expiredბმულის ვადა გავიდა დასრულების გარეშე.
Event
POST https://example.ge/idmatic/webhook
Content-Type: application/json
IDmatic-Signature: t=1791400000,v1=5f2c9a…

{
  "id": "evt_…",
  "type": "verification.completed",
  "created": "2026-10-07T12:01:05Z",
  "data": {
    "id": "ver_…",
    "status": "approved",
    "mode": "live",
    "reference": "CUST-1042",
    "completed_at": "2026-10-07T12:01:04Z",
    "decision": { "status": "approved", "reasons": [], "manual": false }
  }
}
  • მიწოდება — ერთხელ მაინც: წარუმატებლობისას (არა-2xx პასუხი ან დროის ამოწურვა) შეტყობინება მეორდება 1 წუთიდან 24 საათამდე ინტერვალებით.
  • დუბლიკატების ასაცილებლად შეინახეთ მოვლენის id და განმეორებით მიღებული უგულებელყავით (იდემპოტენტობა).
  • უპასუხეთ სწრაფად 2xx-ით და დამუშავება გააგრძელეთ ფონურად.
  • Production-ში მიმართულება უნდა იყოს https:// და საჯარო მისამართი; გადამისამართება არ მიიღება (SSRF-ისგან დაცვა).

ხელმოწერის შემოწმება

ყოველ შეტყობინებას ახლავს სათაური IDmatic-Signature: t=<unix>,v1=<hex>, სადაც v1 = HMAC-SHA256(secret, "<t>.<body>"). შეამოწმეთ ხელმოწერა დაუმუშავებელ (raw) სხეულზე და უარყავით 5 წუთზე ძველი დროის ნიშნული.

import crypto from "node:crypto";

// Express: app.post("/idmatic/webhook", express.raw({ type: "application/json" }), handler)
export function verifyIDmatic(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false; // განმეორება
  const expected = crypto.createHmac("sha256", secret)
    .update(`${parts.t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
შედარებისთვის გამოიყენეთ მუდმივი დროის ფუნქცია (timingSafeEqual, compare_digest, hmac.Equal) — ჩვეულებრივი შედარება დროით შეტევას უშვებს.

Web SDK: ჩაშენება

SDK აჩენს ვინაობის დადასტურების მოდულს თქვენს გვერდზე iframe-ით — დამოკიდებულებების გარეშე. ორი რეჟიმია: modal (ფანჯარა; მობილურზე სრულ ეკრანზე) და inline (ბლოკი გვერდში; სიმაღლე ავტომატურად ერგება).

<script src="https://idmatic.net/sdk.js"></script>
<button id="kyc-btn">ვინაობის დადასტურება</button>
<script>
  document.getElementById("kyc-btn").onclick = async () => {
    // 1) ვინაობის დადასტურება იქმნება თქვენს სერვერზე (API გასაღები ბრაუზერში არასდროს!)
    const { url } = await fetch("/api/kyc/start", { method: "POST" }).then((r) => r.json());
    // 2) მოდული იხსნება ფანჯარაში (მობილურზე — სრულ ეკრანზე)
    const v = IDmatic.open({
      url,
      onComplete: (r) => console.log("status:", r.status), // ინფორმაციისთვის — არა გადაწყვეტილებისთვის
      onClose: () => console.log("closed"),
      onEvent: (e) => console.log(e.type, e.step),
    });
    // v.close() — პროგრამულად დახურვა
  };
</script>
ჩასმის დომენები
თქვენი საიტის დომენი (მაგ. https://shop.ge) დაამატეთ კაბინეტში: „პარამეტრები → ჩასმის დომენები“. სხვა დომენზე ბრაუზერი ჩასმას დაბლოკავს (CSP frame-ancestors).

მობილურ აპლიკაციებში (iOS, Android) ვინაობის დადასტურების url გახსენით აპლიკაციის ბრაუზერში (SFSafariViewController, Custom Tabs) — კამერაზე წვდომა და უსაფრთხოება ბრაუზერის სტანდარტით მუშაობს.

მოვლენები და პარამეტრები

პარამეტრიაღწერა
urlვინაობის დადასტურების url (POST /v1/verifications) — სავალდებულო.
onComplete(r)მომხმარებელმა დაასრულა; r.status — ინფორმაციისთვის.
onClose()მოდული დაიხურა.
onEvent(e)ყველა მოვლენა: ready, step {step}, complete {status}, close, error {step}.
minHeightinline რეჟიმის მინიმალური სიმაღლე (ნაგულისხმევი 560 px).
backdropmodal-ის ფონის ფერი.

iframe-დან თქვენს გვერდზე გადმოდის მხოლოდ ნაბიჯი და სტატუსი — პერსონალური მონაცემები არა. მეთოდი close() მოდულს პროგრამულად ხურავს.

ვიჯეტი კოდის გარეშე

ვიჯეტი ვინაობის დადასტურებას ბრაუზერიდან ქმნის — სერვერის კოდის გარეშე. ვიჯეტის კოდი კაბინეტშია („ვიჯეტი და ბრენდი“); შედეგი მოდის webhook-ით.

HTML
<script src="https://idmatic.net/sdk.js"></script>

<div data-idmatic-widget="eXXXXXXXXXXXX"
     data-reference="CUST-1042"
     data-mode="modal"
     data-text="ვინაობის დადასტურება"></div>

<script>
  document.querySelector("[data-idmatic-widget]")
    .addEventListener("idmatic:complete", (e) => console.log(e.detail.status));
</script>
ატრიბუტიაღწერა
data-idmatic-widgetვიჯეტის კოდი კაბინეტიდან.
data-referenceთქვენი იდენტიფიკატორი (არასავალდებულო).
data-modemodal ან inline.
data-textღილაკის ტექსტი (არასავალდებულო).
ვიჯეტი მუშაობს მხოლოდ „ჩასმის დომენებში“ მითითებული საიტებიდან.

უსაფრთხოება და მონაცემები

გადაცემა

HTTPS (TLS) და HSTS; მკაცრი Content-Security-Policy; ტოკენი URL-ის ფრაგმენტში.

შენახვა

AES-256-GCM; კომპანიის ცალკე გასაღები (HKDF, RFC 5869); პაროლები — PBKDF2.

წვდომა

სავალდებულო 2FA (RFC 6238), როლები, API გასაღების IP შეზღუდვა.

აუდიტი

ჯაჭვური, დაშიფრული ჟურნალი — ყოველი ნახვა და ცვლილება.

შენახვის ვადა

ავტომატური წაშლა ვადის შემდეგ; DELETE API — მოთხოვნისამებრ.

მინიმიზაცია

webhook-ში და ბრაუზერში — მხოლოდ სტატუსი, პერსონალური მონაცემების გარეშე.

On-premise განთავსება

IDmatic შეიძლება სრულად განთავსდეს თქვენს ინფრასტრუქტურაში. API, Web SDK, კაბინეტი და ამოცნობის ძრავა იგივეა, რაც ღრუბელში — იცვლება მხოლოდ ბაზური მისამართი.

კომპონენტიაღწერა
სერვერიერთი შესრულებადი ფაილი (Windows Server / Linux), გარე დამოკიდებულებების გარეშე.
ამოცნობის ძრავაOpenCV და Tesseract — ლოკალურად; მესამე მხარის API არ გამოიყენება.
საცავიდაშიფრული ფაილური საცავი; მთავარი გასაღები Windows-ზე დამატებით DPAPI-ით დაცული.
მასშტაბირებაამოცნობის დამატებითი კვანძები; ძრავის ცენტრალიზებული განახლება.
ქსელისაჯარო ინტერნეტში ან დახურულ ქსელში (LAN); TLS — თქვენი სერტიფიკატით.
On-premise განთავსების პირობებისა და მოთხოვნებისთვის დაგვიკავშირდით რეგისტრაციის შემდეგ კაბინეტიდან.

გაშვების ჩამონათვალი

  • API გასაღები ინახება მხოლოდ სერვერზე (საიდუმლოების საცავში), IP შეზღუდვით.
  • Webhook-ის ხელმოწერა მოწმდება raw სხეულზე, დროის ნიშნულით, მუდმივი დროის შედარებით.
  • მოვლენის id ინახება — დუბლიკატები უგულებელყოფილია.
  • საბოლოო სტატუსი იკითხება სერვერიდან, არა ბრაუზერიდან.
  • ჩასმის დომენები მითითებულია; ტესტირება გავლილია idm_test_ გასაღებით.
  • შენახვის ვადა დაყენებულია თქვენი პოლიტიკის შესაბამისად.
  • live გასაღებზე გადასვლა — ტესტების წარმატებით დასრულების შემდეგ.
მზად ხართ დასაწყებად?
სატესტო გასაღები — რეგისტრაციისთანავე, უფასოდ.
რეგისტრაცია