მიმოხილვა
IDmatic არის ვინაობის დისტანციური დადასტურების პლატფორმა. თქვენი სერვერი ქმნის ვინაობის დადასტურების სესიას, მომხმარებელი ტელეფონით გადაიღებს დოკუმენტს და სახის ფოტოს, ხოლო IDmatic ამოიცნობს დოკუმენტს, ამოწმებს მას და გიბრუნებთ სტრუქტურირებულ შედეგს და გადაწყვეტილებას.
- ბაზური მისამართი:
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დარეგისტრირდით და კაბინეტში შექმენით სატესტო API გასაღები (
idm_test_…) — „დეველოპერები → API გასაღებები“. - 2თქვენი სერვერიდან შექმენით ვინაობის დადასტურება:
POST /v1/verifications. - 3მიღებული
urlგაუგზავნეთ მომხმარებელს, გადაამისამართეთ ან გახსენით Web SDK-ით. - 4დაარეგისტრირეთ webhook („დეველოპერები → Webhook-ები“) და შეამოწმეთ ხელმოწერა.
- 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 სათაურით:
Authorization: Bearer idm_live_XXXXXXXXXXXXXXXXXXXXXXXX| პრეფიქსი | გარემო | აღწერა |
|---|---|---|
| idm_test_ | სატესტო | უფასო; ვინაობის დადასტურებები აღინიშნება როგორც mode: "test" და არ ითვლება ბილინგში. |
| idm_live_ | საწარმოო | რეალური ვინაობის დადასტურებები; ითვლება პაკეტის მიხედვით. |
- გასაღები გამოიყენეთ მხოლოდ სერვერიდან. ბრაუზერსა და მობილურ აპლიკაციაში API გასაღები არასდროს მოათავსოთ — იქ მხოლოდ ვინაობის დადასტურების
urlგადაეცემა. - გასაღები შეგიძლიათ შეზღუდოთ თქვენი სერვერების IP მისამართებით; სხვა მისამართიდან მოთხოვნა დაბრუნდება
403 ip_not_allowed. - გასაღების გაჟონვის ეჭვისას — დაუყოვნებლივ გააუქმეთ კაბინეტში და შექმენით ახალი. გასაღებების შექმნა და გაუქმება აუდიტში ფიქსირდება.
ვინაობის დადასტურების შექმნა
/v1/verificationsახალი სესია| ველი | ტიპი | აღწერა |
|---|---|---|
| reference | string ≤ 120 | თქვენი იდენტიფიკატორი (არასავალდებულო). ბრუნდება შედეგსა და webhook-ში. |
| redirect_url | URL | სად დაბრუნდეს მომხმარებელი დასრულების შემდეგ (ბმულის/გადამისამართების რეჟიმში). |
| metadata | object ≤ 20 | თავისუფალი key → string წყვილები თქვენი საჭიროებისთვის. |
| send_to | object | ბმულის გაგზავნა პირისთვის მაშინვე: email და/ან phone (SMS — საქართველოს ნომრებზე: 5XX… ან +995…), name — მიმართვისთვის. მიმღები არ ინახება — მხოლოდ დაფარული სახით; შედეგი — პასუხის sent ველში. |
სხეულში უცნობი ველები არ მიიღება (400 invalid_json) — ეს იცავს შეცდომით გაგზავნილი მონაცემებისგან.
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, თუ საბოლოო გადაწყვეტილება ოპერატორმა მიიღო.
review სტატუსში და არასდროს — ავტომატურ approved-ში.შედეგის მიღება
/v1/verifications/{id}სრული შედეგი/v1/verifications?status=reviewუახლესი 100 ვინაობის დადასტურება (არასავალდებულო ფილტრით)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_format | TD1 (ბარათი) ან TD3 (პასპორტი) — ICAO 9303. |
| checks[] | შემოწმებები: id, status (passed · failed · warning · not_performed), message. |
| erased | true — პერსონალური მონაცემები და გამოსახულებები წაშლილია (გადაწყვეტილება რჩება). |
onComplete-ს ან redirect-ს გადაწყვეტილებისთვის ნუ ენდობით — საბოლოო სტატუსი წაიკითხეთ webhook-ით ან GET /v1/verifications/{id}-ით.გამოსახულებები
/v1/verifications/{id}/images/{key}JPEGდოკუმენტიდან ამოჭრილი პორტრეტი (photo) ან ხელმოწერა (signature). ყოველი ნახვა აუდიტში იწერება. მონაცემების წაშლის შემდეგ პასუხი — 404.
რეგისტრატურა და HL7 FHIR
/v1/verifications/{id}/deskJSON/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.
სინქრონული ამოცნობა
/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_plan | live გასაღებით ყოველი წარმატებული ამოცნობა პაკეტიდან ერთ ვინაობის დადასტურებად ითვლება; ლიმიტის ამოწურვისას — 402 (ვერ შესრულებული ამოცნობა არ ითვლება). სატესტო გასაღებით — სატესტო ლიმიტით. |
მონაცემების წაშლა
/v1/verifications/{id}GDPR, მუხლი 17შლის გამოსახულებებს და პერსონალურ მონაცემებს; გადაწყვეტილება, სტატუსი და აუდიტის ჩანაწერი რჩება. გარდა ამისა, კაბინეტში მითითებული შენახვის ვადის გასვლისას წაშლა ავტომატურად ხდება.
დოკუმენტის ტიპები
/v1/document-typesაქტიური ტიპებიაბრუნებს თქვენს ანგარიშზე აქტიურ დოკუმენტის ტიპებს. საქართველოს დოკუმენტები (პირადობის მოწმობა, პასპორტი, ბინადრობის და მართვის მოწმობა) ეფუძნება PRADO-ს რეესტრის ემისიებს.
შეცდომები და ლიმიტები
შეცდომა ყოველთვის ერთი ფორმისაა. request_id მიუთითეთ მხარდაჭერასთან მიმართვისას.
{
"error": {
"code": "invalid_api_key",
"message": "…",
"request_id": "req_…"
}
}| HTTP | მაგალითი | რა ვქნა |
|---|---|---|
| 400 | invalid_json, invalid | შეამოწმეთ სხეული — უცნობი ან არასწორი ველი. |
| 401 | invalid_api_key | გასაღები არასწორია ან გაუქმებულია. |
| 402 | no_plan, limit_reached, past_due, payment_required, trial_over, test_limit | პაკეტი არ არის, მისი ლიმიტი ამოიწურა (მომსახურება ჩერდება — დამატებითი პაკეტი ან უფრო დიდი ტარიფი), ინვოისი ვადაგადაცილებულია ან ჯერ გადასახდელია, საცდელი დასრულდა, სატესტო ზღვარი ამოიწურა. ეხება ვინაობის დადასტურებასაც და დოკუმენტის ამოცნობასაც (/v1/recognize). |
| 403 | ip_not_allowed, org_suspended | IP შეზღუდვა ან ანგარიშის სტატუსი. |
| 404 | not_found | ობიექტი არ არსებობს ან სხვა კომპანიას ეკუთვნის. |
| 409 | invalid_state | მოქმედება ამ სტატუსში შეუძლებელია. |
| 413 / 415 / 422 | too_large, unsupported_media_type, image_rejected | ფაილის ზომა, ტიპი ან ხარისხი. |
| 429 | rate_limited | გადააჭარბეთ ლიმიტს — დაელოდეთ Retry-After წამს. |
| 503 | busy, engine_unavailable | დროებით გადატვირთულია — სცადეთ Retry-After-ის შემდეგ. |
- ლიმიტი: 600 მოთხოვნა წუთში თითო გასაღებზე.
- გამეორებისას გამოიყენეთ ექსპონენციალური დაყოვნება და გაითვალისწინეთ
Retry-Afterსათაური.
მოვლენები და მიწოდება
Webhook-ი გატყობინებთ ვინაობის დადასტურების სტატუსის ცვლილებას. მიმართულება და საიდუმლო გასაღები კაბინეტში იმართება. შეტყობინება პერსონალურ მონაცემებს არ შეიცავს — მხოლოდ სტატუსს და გადაწყვეტილებას.
| მოვლენა | როდის |
|---|---|
| verification.completed | ავტომატური გადაწყვეტილება მიღებულია (approved / declined). |
| verification.review | ვინაობის დადასტურება გადავიდა ხელით განხილვაზე. |
| verification.updated | ოპერატორმა შეცვალა ან დაადგინა გადაწყვეტილება, ან დაუსრულებელი ვინაობის დადასტურება წაიშალა (status: abandoned). |
| verification.expired | ბმულის ვადა გავიდა დასრულების გარეშე. |
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));
}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}. |
| minHeight | inline რეჟიმის მინიმალური სიმაღლე (ნაგულისხმევი 560 px). |
| backdrop | modal-ის ფონის ფერი. |
iframe-დან თქვენს გვერდზე გადმოდის მხოლოდ ნაბიჯი და სტატუსი — პერსონალური მონაცემები არა. მეთოდი close() მოდულს პროგრამულად ხურავს.
ვიჯეტი კოდის გარეშე
ვიჯეტი ვინაობის დადასტურებას ბრაუზერიდან ქმნის — სერვერის კოდის გარეშე. ვიჯეტის კოდი კაბინეტშია („ვიჯეტი და ბრენდი“); შედეგი მოდის webhook-ით.
<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-mode | modal ან 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 — თქვენი სერტიფიკატით. |
გაშვების ჩამონათვალი
- API გასაღები ინახება მხოლოდ სერვერზე (საიდუმლოების საცავში), IP შეზღუდვით.
- Webhook-ის ხელმოწერა მოწმდება raw სხეულზე, დროის ნიშნულით, მუდმივი დროის შედარებით.
- მოვლენის id ინახება — დუბლიკატები უგულებელყოფილია.
- საბოლოო სტატუსი იკითხება სერვერიდან, არა ბრაუზერიდან.
- ჩასმის დომენები მითითებულია; ტესტირება გავლილია idm_test_ გასაღებით.
- შენახვის ვადა დაყენებულია თქვენი პოლიტიკის შესაბამისად.
- live გასაღებზე გადასვლა — ტესტების წარმატებით დასრულების შემდეგ.