Abonelik Sözleşmesi İmzalama¶
Bu örnek, arayüzden yüklenen bir Abonelik Sözleşmesi taslağının API aracılığıyla imzalatılmasını adım adım açıklar.
Üç farklı senaryo ele alınmaktadır:
| Senaryo | Abone | İşletmeci |
|---|---|---|
| Senaryo A | E-İmza | E-İmza |
| Senaryo B | Yapay Zeka Kimlik Doğrulama (TCKK) | E-İmza |
| Senaryo C | e-Devlet kimlik doğrulama (dışarıda gerçekleşir) | PDF yükle + E-İmza |
Ön Koşullar¶
- Abonelik Sözleşmesi döküman taslağı arayüzden sisteme yüklenmiş olmalıdır.
- Taslak ID'si ve imzalama sırası (
signingID'leri) Referans API üzerinden öğrenilmiş olmalıdır. - İşletmeci, sistemde tanımlı bir imzacı olmalıdır (
signerId).
Senaryo A: Her İki Taraf E-İmza ile İmzalar¶
Süreç Oluştur → Taslaktan Döküman Ekle → Süreci Başlat
İmzalama sırası: Abone (1. sıra) → İşletmeci (2. sıra)
Abone ve işletmeci bilgileri döküman taslağındaki signing ID'lerine bağlanır.
Adım 1 – Süreç Oluştur¶
POST /api/external/process-instances
{
"name": "Abonelik Sözleşmesi - Ali Veli"
}
Yanıt:
{
"id": 147,
"accountId": 153,
"createdByUserId": null,
"name": "Abonelik Sözleşmesi - Ali Veli",
"statusCode": "NEW",
"processType": "BELGE_IMZALAMA",
"documents": [],
"signers": [],
"createdAt": "2026-06-29T16:38:59.134467",
"updatedAt": "2026-06-29T16:38:59.134469",
"responsibleBy": null,
"accessToken": "kQQQioa",
"tokenExpiry": null,
"referenceCode": null,
"formFields": [],
"formDesigns": []
}
accessToken— Kullanıcının mobil uygulamaya gireceği süreç token'ıdır. Bu değer, abonenin sürece mobil uygulama üzerinden erişmesini sağlar.
id değerini (147) sonraki adımlarda kullanın.
Adım 2 – Taslaktan Döküman Ekle¶
Döküman taslağındaki signings sıralaması (Referans API'den öğrenilir):
id: 75→ Abone (1. imzacı)id: 77→ İşletmeci (2. imzacı)
POST /api/external/process-instances/147/document/document-type
{
"id": 85,
"name": "Abonelik Sözleşmesi",
"description": "",
"isSign": true,
"isForm": false,
"isActive": true,
"isApprove": true,
"isUpload": true,
"document": {
"base64": "",
"fileName": "Abonelik belgesi.pdf"
},
"signings": [
{
"id": 75,
"signer": {
"fullName": "Ali Veli",
"email": "[email protected]",
"phone": "5551112233",
"identityNumber": "12345678901"
}
},
{
"id": 77,
"signer": {
"id": 108
}
}
]
}
signings[0].signer→ Abone bilgileri ile yeni imzacı oluşturulur.
signings[1].signer.id→ Sistemde kayıtlı İşletmeci imzacısı (id: 108) bağlanır.
Yanıt:
{
"id": 7203
}
Adım 3 – Süreci Başlat¶
PUT /api/external/process-instances/147/status/start
Yanıt: ok
Senaryo A Tamamlandı
Süreç başlatıldı. Abone e-posta/SMS ile bildirim alır ve e-imzasıyla imzalar. Ardından İşletmeci sırasına geçilir.
Senaryo B: Abone Yapay Zeka ile Kimlik Doğrulamayla İmzalar¶
Süreç Oluştur → Taslaktan Döküman Ekle (TCKK bilgileriyle) → Süreci Başlat
Bu senaryoda:
- Abone: Yapay Zeka kimlik doğrulama (
TCKK_ONBOARDING) ile imzalar. TC kimlik kartı bilgileri ve BTK mevzuatına uygun yasal metin, döküman eklenirkensigningsiçinde belirtilir. - İşletmeci: E-İmza ile imzalar (2. sıra).
Adım 1 – Süreç Oluştur¶
POST /api/external/process-instances
{
"name": "Abonelik Sözleşmesi - Ali Veli (TCKK)"
}
Yanıt:
{
"id": 148,
"accountId": 153,
"createdByUserId": null,
"name": "Abonelik Sözleşmesi - Ali Veli (TCKK)",
"statusCode": "NEW",
"processType": "BELGE_IMZALAMA",
"documents": [],
"signers": [],
"createdAt": "2026-06-29T16:38:59.134467",
"updatedAt": "2026-06-29T16:38:59.134469",
"responsibleBy": null,
"accessToken": "mPPPjob",
"tokenExpiry": null,
"referenceCode": null,
"formFields": [],
"formDesigns": []
}
accessToken— Kullanıcının mobil uygulamaya gireceği süreç token'ıdır. Bu değer, abonenin sürece mobil uygulama üzerinden erişmesini sağlar.
Adım 2 – Taslaktan Döküman Ekle (TCKK Bilgileriyle)¶
BTK Mevzuatı – Zorunlu Yasal Metin¶
BTK mevzuatı gereği, görüntülü kimlik doğrulama sırasında abonenin yüksek sesle okuması gereken standart metin şu formattadır:
"Ben \<Ad Soyad> olarak \<Hizmet Numarası> numaralı hizmetin \<İşlem Türü> işlemi için kimliğimin doğrulanmasını \<GG.AA.YYYY> \<SS.DD> itibarıyla onaylıyorum."
Örnek:
"Ben Ali Veli olarak 0532 XXX XX XX numaralı hizmetin Abonelik Başvurusu işlemi için kimliğimin doğrulanmasını 29.06.2026 12:55 itibarıyla onaylıyorum."
Bu metin promptText alanına dinamik olarak üretilerek gönderilmelidir.
Abone signing'i (id: 75) için signatureType, promptText, videoMaxDurationSeconds ve kimlik bilgileri doğrudan signings içinde verilir. İşletmeci (id: 77) ise kayıtlı imzacı ID'si ile bağlanır.
POST /api/external/process-instances/148/document/document-type
{
"id": 85,
"name": "Abonelik Sözleşmesi",
"description": "",
"isSign": true,
"isForm": false,
"isActive": true,
"isApprove": true,
"isUpload": true,
"document": {
"base64": "",
"fileName": "Abonelik belgesi.pdf"
},
"signings": [
{
"id": 75,
"signatureType": {
"code": "TCKK_ONBOARDING"
},
"promptText": "Ben Ali Veli olarak 0532 XXX XX XX numaralı hizmetin Abonelik Başvurusu işlemi için kimliğimin doğrulanmasını 29.06.2026 12:55 itibarıyla onaylıyorum.",
"videoMaxDurationSeconds": 60,
"signer": {
"fullName": "Ali Veli",
"identityNumber": "12345678901",
"birthDate": "1990-05-15",
"expiredDate": "2030-01-01",
"tcSerial": "A1B2C3D4",
"phone": "+905551112233",
"email": "[email protected]"
}
},
{
"id": 77,
"signer": {
"id": 108
}
}
]
}
| Alan | Açıklama |
|---|---|
signings[0].id |
Taslaktaki Abone imzalama sırası ID'si |
signings[0].signatureType.code |
TCKK_ONBOARDING — Yapay Zeka kimlik doğrulama akışı |
signings[0].promptText |
BTK yasal metni — abone video sırasında yüksek sesle okur |
signings[0].videoMaxDurationSeconds |
Video kaydı için maksimum süre (saniye) |
signings[0].signer.birthDate |
Doğum tarihi (kimlik doğrulama için) |
signings[0].signer.expiredDate |
Kimlik kartı son geçerlilik tarihi |
signings[0].signer.tcSerial |
TC kimlik kartı seri numarası |
signings[1].signer.id |
Sistemde kayıtlı İşletmeci imzacısı (id: 108) |
Yanıt:
{
"id": 7355,
"documentTypeId": 85,
"documentTypeName": "Abonelik Sözleşmesi",
"filePath": null,
"fileName": "Abonelik Sözleşmesi",
"description": "",
"documentSigningType": null,
"uploaded": null,
"signed": null,
"addpublicsigned": false,
"approved": null,
"mustsigned": true,
"mustuploaded": true,
"mustapproved": true,
"signedAt": null,
"uploadedAt": null,
"approvedAt": null,
"fileTypes": null,
"documentFiles": [
{
"id": 1558,
"fileType": "ORIGINAL",
"isCurrentVersion": null,
"linkedAt": null,
"isOldsign": null,
"storedFileId": 1412,
"fileName": "Abonelik belgesi_xxxxxxxx.pdf",
"filePath": "xxx/xxx/Abonelik belgesi_xxxxxxxx.pdf",
"contentType": "application/pdf",
"size": 2425408,
"archivedDocumentId": null
}
],
"signers": [
{
"id": 1165,
"documentInstanceId": 7355,
"fullName": "Ali Veli",
"signerId": 75,
"email": "[email protected]",
"phone": "5XXXXXXXXX",
"mustUpload": false,
"mustSign": true,
"isauth": false,
"stepOrder": 1,
"uploadedAt": null,
"signedAt": null,
"issign": false,
"partTypeId": null,
"partTypeName": null,
"signatureTypeId": 16,
"signatureTypeName": "TCKK_ONBOARDING",
"signatureTypeCode": "TCKK_ONBOARDING",
"accessToken": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"visibleSignature": {
"id": 7554,
"data": "Ali Veli",
"image": false,
"originX": 384,
"originY": 332,
"width": 200,
"height": 190,
"pageNumber": 7,
"fontSize": 14,
"textColor": "#000000",
"backgroundColor": "#ffffff",
"alignment": "CENTER"
},
"signatureFileId": null,
"promptText": null,
"videoMaxDurationSeconds": null,
"identityNumber": "1XXXXXXXXXX"
},
{
"id": 1166,
"documentInstanceId": 7355,
"fullName": "İşletmeci Yetkili",
"signerId": 108,
"email": "[email protected]",
"phone": "5XXXXXXXXX",
"mustUpload": false,
"mustSign": true,
"isauth": false,
"stepOrder": 2,
"uploadedAt": null,
"signedAt": null,
"issign": false,
"partTypeId": null,
"partTypeName": null,
"signatureTypeId": 1,
"signatureTypeName": "Eimza",
"signatureTypeCode": "EIMZA",
"accessToken": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"visibleSignature": {
"id": 7555,
"data": "İşletmeci Yetkili",
"image": false,
"originX": 35,
"originY": 416,
"width": 200,
"height": 75,
"pageNumber": 7,
"fontSize": 14,
"textColor": "#000000",
"backgroundColor": "#ffffff",
"alignment": "CENTER"
},
"signatureFileId": null,
"promptText": null,
"videoMaxDurationSeconds": null,
"identityNumber": "1XXXXXXXXXX"
}
],
"documentAdds": null,
"signingControl": false,
"fileTypesEnum": []
}
Adım 3 – Süreci Başlat¶
PUT /api/external/process-instances/148/status/start
Yanıt: ok
Senaryo B Tamamlandı
Süreç başlatıldı. Abone, mobil uygulama üzerinden accessToken ile sürece girer; TC kimlik kartını okutarak ve BTK mevzuatına uygun metni yüksek sesle okuyarak video kaydı yapar. Doğrulama tamamlandıktan sonra İşletmeci e-imzasıyla imzalar.
Senaryo C: e-Devlet ile Kimlik Doğrulama, İşletmeci E-İmza ile İmzalar¶
Süreç Oluştur → Tekil Döküman Ekle → İmzacı Ekle (İşletmeci) → Süreci Başlat
Bu senaryoda BTK mevzuatı gereği abonenin kimlik doğrulaması e-Devlet üzerinden gerçekleştirilir. Süreç tamamen işletmeci tarafından yönetilir:
- Abone: e-Devlet üzerinden kimliğini doğrular (bu adım DijitalBelge dışında gerçekleşir).
- İşletmeci: e-Devlet'ten aldığı abone bilgilerini içeren PDF'i sisteme yükler ve e-İmza ile imzalar.
Adım 1 – Süreç Oluştur¶
POST /api/external/process-instances
{
"name": "Abonelik Sözleşmesi - Ali Veli (e-Devlet)"
}
Yanıt:
{
"id": 149,
"accountId": 153,
"createdByUserId": null,
"name": "Abonelik Sözleşmesi - Ali Veli (e-Devlet)",
"statusCode": "NEW",
"processType": "BELGE_IMZALAMA",
"documents": [],
"signers": [],
"createdAt": "2026-06-29T16:38:59.134467",
"updatedAt": "2026-06-29T16:38:59.134469",
"responsibleBy": null,
"accessToken": "nRRRkpc",
"tokenExpiry": null,
"referenceCode": null,
"formFields": [],
"formDesigns": []
}
Adım 2 – e-Devlet PDF'ini Sürece Yükle¶
İşletmeci, e-Devlet'ten alınan abone kimlik doğrulama bilgilerini içeren PDF'i Base64 formatında sürece ekler.
POST /api/external/process-instances/149/document/single
{
"name": "Abonelik Sözleşmesi",
"base64": "JVBERi0xLjQK...",
"fileName": "Abonelik belgesi.pdf"
}
Yanıt:
{
"id": 7356,
"name": "Abonelik Sözleşmesi",
"statusCode": "PENDING",
"createdAt": "2026-06-29T20:00:00"
}
Adım 3 – İşletmeciye İmzacı Olarak Ekle¶
e-Devlet kimlik doğrulaması dışarıda tamamlandığından yalnızca işletmeci imzacı olarak eklenir.
POST /api/external/process-instances/149/document/7356/signers
{
"order": 1,
"isRequired": true,
"signer": {
"id": 108
}
}
Yanıt:
{
"id": 1167,
"documentInstanceId": 7356,
"fullName": "İşletmeci Yetkili",
"signerId": 108,
"email": "[email protected]",
"stepOrder": 1,
"statusCode": "PENDING",
"signatureTypeCode": "EIMZA",
"createdAt": "2026-06-29T20:00:00"
}
Adım 4 – Süreci Başlat¶
PUT /api/external/process-instances/149/status/start
Yanıt: ok
Senaryo C Tamamlandı
Süreç başlatıldı. Abonenin kimlik doğrulaması e-Devlet üzerinden gerçekleştirilmiş olup PDF'e işlenmiştir. İşletmeci e-İmzasıyla belgeyi imzalayarak süreci tamamlar.
İmza Sonrası – İmzalı Belgeyi İndir¶
Her üç senaryoda da süreç tamamlandıktan sonra imzalı belgenin son versiyonu Base64 formatında çekilebilir.
Scope: document:read
GET /api/external/process-instances/{processId}/document/{documentId}/file
Senaryo A için örnek (processId: 147, documentId: 7203):
GET /api/external/process-instances/147/document/7203/file
Senaryo B için örnek (processId: 148, documentId: 7355):
GET /api/external/process-instances/148/document/7355/file
Senaryo C için örnek (processId: 149, documentId: 7356):
GET /api/external/process-instances/149/document/7356/file
Yanıt:
{
"fileName": "Abonelik belgesi_xxxxxxxx.pdf",
"mimeType": "application/pdf",
"base64": "JVBERi0xLjQK...",
"size": 2425408
}
| Alan | Tip | Açıklama |
|---|---|---|
fileName |
string | Dosya adı |
mimeType |
string | Dosya MIME türü |
base64 |
string | İmzalı belgenin Base64 içeriği (en son versiyon) |
size |
number | Dosya boyutu (byte) |
documentId, döküman eklenirken dönen yanıttakiidalanıdır (Senaryo A:7203, Senaryo B:7355).
Senaryo Karşılaştırması¶
| Senaryo A | Senaryo B | Senaryo C | |
|---|---|---|---|
| Abone kimlik doğrulama | E-İmza | TCKK (Yapay Zeka) | e-Devlet (dışarıda) |
| İşletmeci imza türü | E-İmza | E-İmza | E-İmza |
| İmzalama sırası | Abone → İşletmeci | Abone → İşletmeci | Yalnızca İşletmeci |
| Döküman kaynağı | Taslak | Taslak | İşletmeci tarafından yüklenir |
| Gerekli abone bilgileri | fullName, email, phone, identityNumber | + birthDate, expiredDate, tcSerial | Gerekmez (e-Devlet PDF'inde) |
| promptText / video | Gerekmez | BTK yasal metni zorunlu | Gerekmez |
| accessToken kullanımı | Abone mobil uygulamaya girer | Abone mobil uygulamaya girer | Gerekmez |