Geliştirici belgeleri API
Base path: /api/v1/developer/documents
| Method | Path | Scope |
|---|---|---|
| GET | /developer/documents?page=&pageSize= | documents:read |
| GET | /developer/documents/{operationId} | documents:read |
| GET | /developer/templates?page=&pageSize= | documents:read |
| GET | /developer/templates/{templateOperationId} | documents:read |
| GET | /developer/kiosks | documents:read |
| GET | /developer/documents/{operationId}/final-pdf | documents:read |
| GET | /developer/documents/{operationId}/certificate-pdf | documents:read |
| GET | /developer/documents/{operationId}/timestamp-file | documents:read |
| GET | /developer/documents/{operationId}/resend-options | documents:read |
| POST | /developer/documents/send | documents:create |
| POST | /developer/documents | documents:create |
| POST | /developer/documents/{operationId}/pdf | documents:create |
| PUT | /developer/documents/{operationId}/configuration | documents:create |
| POST | /developer/documents/{operationId}/send | documents:create |
| POST | /developer/documents/from-template/{templateOperationId}/send | documents:create |
| POST | /developer/documents/{operationId}/resend | documents:create |
| DELETE | /developer/documents/{operationId} | documents:delete |
Önerilen entegrasyon: Tek istekte belge gönderme (POST /developer/documents/send).
Kiosk listesi — GET /developer/kiosks
Workspace’e bağlı kiosk cihazlarını döner. Scope: documents:read. Yanıttaki id alanı gönderimde kioskDeviceId olarak kullanılır.
Oluşturma, PIN ve eşleştirme Developer API’de yoktur (panel /kiosk).
İndirme (binary)
Başarılı yanıt CustomResponse değildir; dosya akışıdır. Hata durumunda JSON CustomResponse (400).
Completed sonrası:
GET /developer/documents/{operationId}/final-pdfGET /developer/documents/{operationId}/certificate-pdfGET /developer/documents/{operationId}/timestamp-file
Yeniden gönderim
Yalnızca Dispatched belgeler.
GET /developer/documents/{operationId}/resend-options— alıcı uygunluğuPOST /developer/documents/{operationId}/resend— body:recipientId,channels,kioskDeviceId?
Kiosk yeniden gönderiminde kioskDeviceId için GET /developer/kiosks kullanın.
İmza deneyimi özeti: İmzalama akışı.
Tek istekte gönder — POST /developer/documents/send
multipart/form-data: file (PDF) + payload (JSON). workspaceId token’dan alınır. Alıcıların fields[] dizisi ve channels aynı nesnede gider.
Müşteri entegrasyonlarında sık kullanılan ayrık imza örneği (pageNumber: 0, config.isDetached: true):
{
"displayFileName": "sozlesme.pdf",
"description": "İki taraflı sözleşme",
"privateNote": "ERP #12345",
"settings": {
"isOrderedFlow": true,
"useUniqueDeliveryKey": true,
"showOtherRecipientsFields": false,
"showOtherRecipientsFieldsAsRendered": false,
"documentLanguageCode": "tr",
"timestampProvider": "dijital-imza"
},
"recipients": [
{
"id": "r1",
"fullName": "Ayşe Yılmaz",
"email": "[email protected]",
"phone": "+905551112233",
"role": "Signee",
"order": 1,
"channels": ["email", "sms"],
"copyNotificationChannels": ["email"],
"fields": [
{
"type": "SIGNATURE",
"pageNumber": 0,
"label": "İmza",
"required": true,
"config": { "isDetached": true }
}
]
}
]
}
Rehber, curl ve hata/uyarı modeli: Tek istekte belge gönderme.
Referans: alan (element) tipleri
Konfigürasyonda her alan elementType ile belirtilir. Büyük/küçük harf duyarsızdır; önerilen kanonik değerler:
elementType | Anlamı |
|---|---|
INPUT / input / text | Tek satır metin |
TEXT_AREA / text_area | Çok satırlı metin |
SELECT / select | Açılır liste |
CHECKBOX / checkbox | Onay kutusu |
RADIO / radio | Radyo seçenek |
SIGNATURE / signature | Klasik çizim imza |
BIOMETRIC_SIGNATURE / biometric_signature | Biyometrik imza |
ELECTRONIC_SIGNATURE / electronic_signature | Elektronik imza (masaüstü istemci) |
IMAGE / image | Resim yükleme |
NOTE / note | Bilgilendirme notu (salt görüntü) |
IYS_CONSENT / iys_consent | İYS onay kutusu |
MONEY_CURRENCY / money_currency | Para / birim |
Element ortak alanları:
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
externalId | string | Evet | Alan kimliği (benzersiz) |
pageNumber | number | Evet | Konumlu alanlarda PDF sayfa (≥ 1); ayrıkta 0 |
recipientExternalId | string | Hayır* | Atanan alıcının externalId (*imza alanlarında gerekli) |
elementType | string | Evet | Yukarıdaki tiplerden biri |
x, y | number | Hayır | Konumlu konum (piksel); ayrıkta 0 |
width, height | number | Önerilir | Boyut (ör. imza 180×48) |
zIndex | number | Hayır | Katman sırası |
config | object | Hayır | Props (required, label, isDetached, …) |
Sık config anahtarları:
| Anahtar | Tip | Açıklama |
|---|---|---|
required | boolean | Zorunlu alan |
label | string | Etiket |
placeholder | string | Yer tutucu (metin alanları) |
isDetached | boolean | true: PDF dışı doldurma; final PDF sonuna basılır |
biometricSignatureType | string | Yalnızca biyometrik: basic veya forensic |
Element örnekleri
Aşağıdan elementType seçin; yalnızca seçilen tipin elements[] örneği gösterilir. Hepsi aynı alıcıya (r1) atanmış varsayılır.
Tek satır metin alanı.
| config anahtarı | Tip | Zorunlu | Açıklama |
|---|---|---|---|
type | string | Hayır | text | number | email | tel | url | password | date |
validationType | string | Hayır | none | email | phone | number | custom |
regexPattern | string | Hayır | validationType=custom iken regex |
minLength | number | Hayır | Minimum karakter |
maxLength | number | Hayır | Maksimum karakter |
placeholder | string | Hayır | Yer tutucu metin |
defaultValue | string | boolean | Hayır | Başlangıç değeri (checkbox/İYS için boolean olabilir) |
required | boolean | Hayır | Alan zorunlu mu |
label | string | Hayır | Görünen etiket |
isDetached | boolean | Hayır | true: PDF dışı doldurma; final PDF sonuna ek sayfada basılır (pageNumber: 0) |
{
"externalId": "e-input-1",
"pageNumber": 1,
"recipientExternalId": "r1",
"elementType": "INPUT",
"x": 40,
"y": 40,
"width": 220,
"height": 28,
"config": {
"required": true,
"label": "Ad Soyad",
"placeholder": "Adınızı yazın",
"type": "text"
}
}Ayrık bileşenler (config.isDetached)
PDF üzerine konum vermeden imza, metin vb. istemek için kullanılır. Alıcı /r/{code} ekranında alanı PDF dışı doldurma adımlarında doldurur; nihai PDF’te değerler belgenin sonuna ek sayfada alt alta basılır.
| Kural | Değer |
|---|---|
config.isDetached | true |
pageNumber | 0 |
x / y | 0 veya atlanabilir |
width / height | önerilir |
pages | PDF sayfa meta bilgisi yine gönderilir |
Örnek — yalnızca ayrık imza:
{
"operationType": "document",
"displayFileName": "sozlesme.pdf",
"recipients": [
{
"externalId": "r1",
"fullName": "Ayşe Yılmaz",
"email": "[email protected]",
"role": "Signee",
"order": 1
}
],
"pages": [{ "pageNumber": 1, "width": 595, "height": 842 }],
"elements": [
{
"externalId": "e-sig-detached",
"pageNumber": 0,
"recipientExternalId": "r1",
"elementType": "SIGNATURE",
"x": 0,
"y": 0,
"width": 180,
"height": 48,
"config": {
"isDetached": true,
"required": true,
"label": "İmza"
}
}
]
}
Referans: gönderim kanalları (channels)
POST .../send içindeki deliveryPlans[].channels:
| Kod | Anlamı | Gereksinim |
|---|---|---|
email | E-posta ile imza linki | Alıcıda email dolu |
sms | SMS ile kısa link | Alıcıda phone dolu |
kiosk | Eşleşmiş kiosk | kioskDeviceId (GUID) |
open_on_device | Bu cihazda aç | Genelde ilk / aktif alıcı |
copyNotificationChannels yalnızca email ve sms kabul eder.
Referans: diğer sabitler
| Alan | Geçerli değerler |
|---|---|
operationType | document, template |
Alıcı role | Signee, Approver, Viewer (serbest string; tipik değerler) |
isOrderedFlow | true sıralı; false paralel |
timestampProvider | dijital-imza, tubitak, freetsa, sectigo, opentimestamps |
documentLanguageCode | auto, tr, en, es, ar, de |
workspaceId create isteğinde token workspace’i ile aynı olmalıdır.
Roller ve sıralı akış
role | Tipik |
|---|---|
Signee | İmza / zorunlu alanlar |
Approver | Onay |
Viewer | Görüntüleme |
isOrderedFlow: true iken alıcılar order sırasıyla ilerler.
Create — POST /developer/documents
İstek alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
workspaceId | guid | Evet | Token workspace ile aynı olmalı |
operationType | string | Hayır | Varsayılan document; template da geçerli |
description | string | Hayır | İşlem açıklaması |
Örnek istek
{
"workspaceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"operationType": "document",
"description": "Sözleşme — örnek"
}
Yanıt data (özet)
| Alan | Tip | Açıklama |
|---|---|---|
operationId | guid | Sonraki adımlarda kullanılır |
operationType | string | İşlem türü |
status | string | Genelde Draft |
publicShortCode | string | Kısa erişim kodu |
PDF — POST /developer/documents/{operationId}/pdf
multipart/form-data; alan adı file (PDF). JSON body değildir.
Configuration — PUT /developer/documents/{operationId}/configuration
Gerçek model: düz recipients + pages + elements (pages içinde nested elements yok).
Üst alanlar
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
operationType | string | Evet | document veya template |
displayFileName | string | Evet | Görünen dosya adı |
description | string | Hayır | Açıklama |
privateNote | string | Hayır | Yalnızca sistem kullanıcısı görür |
useUniqueDeliveryKey | boolean | Hayır | true: alıcıya özel tahmin edilemez link |
showOtherRecipientsFields | boolean | Hayır | Diğer alıcı alanlarını göster |
showOtherRecipientsFieldsAsRendered | boolean | Hayır | Diğer alanları PDF benzeri render |
isOrderedFlow | boolean | Hayır | Sıralı / paralel |
documentLanguageCode | string | Hayır | auto / tr / en / … |
timestampProvider | string | Hayır | Zaman damgası sağlayıcısı |
saveAsDraft | boolean | Hayır | true: Draft kalır; false: Configured |
recipients | array | Evet | Alıcı listesi |
pages | array | Evet | Sayfa meta |
elements | array | Evet | Form / imza alanları |
recipients[] alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
externalId | string | Evet | Element eşlemesi için kimlik |
fullName | string | Evet | Görünen ad |
email | string | Hayır* | E-posta kanalı için gerekli |
phone | string | Hayır* | SMS / OTP için gerekli |
role | string | Evet | Örn. Signee |
order | number | Evet | Sıra (sıralı akışta kritik) |
color | string | Hayır | UI renk kodu |
recipientProfile | object | Hayır | Kimlik / vekil / doğrulama |
recipientProfile / verification
| Alan | Tip | Açıklama |
|---|---|---|
firstName, lastName | string | Asıl kişi adı |
personCategory | string | TurkishCitizen / Foreign / Stateless |
identityDocumentKind | string | TcKimlik / PassportOrYkn / … |
tcKimlikNo | string | TC kimlik |
useRepresentativeForDelivery | boolean | Bildirimleri vekile yönlendir |
representative | object | Vekil bilgileri |
verification.phoneOtpVerification | boolean | OTP |
pages[]
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
pageNumber | number | Evet | ≥ 1 |
width | number | Hayır | Sayfa genişliği (px) |
height | number | Hayır | Sayfa yüksekliği (px) |
Örnek istek (imza + doğrulama + biyometrik)
{
"operationType": "document",
"displayFileName": "sozlesme.pdf",
"description": "İki taraflı imza akışı",
"privateNote": "İç not",
"useUniqueDeliveryKey": true,
"showOtherRecipientsFields": false,
"showOtherRecipientsFieldsAsRendered": false,
"isOrderedFlow": true,
"documentLanguageCode": "tr",
"timestampProvider": "dijital-imza",
"saveAsDraft": false,
"recipients": [
{
"externalId": "r1",
"fullName": "Ayşe Yılmaz",
"email": "[email protected]",
"phone": "+905551112233",
"role": "Signee",
"order": 1,
"recipientProfile": {
"verification": {
"phoneOtpVerification": true
}
}
},
{
"externalId": "r2",
"fullName": "Mehmet Demir",
"email": "[email protected]",
"phone": "+905559998877",
"role": "Signee",
"order": 2
}
],
"pages": [{ "pageNumber": 1, "width": 595, "height": 842 }],
"elements": [
{
"externalId": "e-sig-1",
"pageNumber": 1,
"recipientExternalId": "r1",
"elementType": "SIGNATURE",
"x": 120,
"y": 640,
"width": 180,
"height": 48,
"config": { "required": true, "label": "İmza" }
},
{
"externalId": "e-bio-2",
"pageNumber": 1,
"recipientExternalId": "r2",
"elementType": "BIOMETRIC_SIGNATURE",
"x": 120,
"y": 720,
"width": 180,
"height": 48,
"config": {
"required": true,
"label": "Biyometrik imza",
"biometricSignatureType": "basic"
}
}
]
}
Şablon listesi — GET /developer/templates
Workspace’teki UI şablonlarını (/mytemplates) listeler. Yanıt şekli belge listesi ile aynıdır; items[].operationId şablon kimliğidir (templateOperationId).
Scope: documents:read.
Şablon detayı — GET /developer/templates/{templateOperationId}
Şablon iskeletini alıcılarla döndürür. from-template gönderiminden önce çağırın: kaç kişi, hangi role / order, vekil var mı, recipientExternalId (GUID) nedir.
Scope: documents:read. Yanıt şekli belge detayı ile aynıdır (operationType: template).
Şablondan gönder — POST /developer/documents/from-template/{templateOperationId}/send
Panelde oluşturulan şablondan tek istekte yeni belge üretir ve gönderimi başlatır. Create → PDF → configuration adımları gerekmez.
Scope: documents:create. Token workspace’i şablonun workspace’i ile aynı olmalıdır.
İstek alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
isOrderedFlow | boolean | Hayır | Sıralı imza akışı |
privateNote | string | Hayır | Boşsa şablondaki not kullanılır |
recipients | array | Evet | Şablondaki alıcıları iletişim bilgileriyle doldurur |
deliveryPlans | array | Evet | Alıcı bazlı kanal planı (send ile aynı) |
recipients[]
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
recipientExternalId | string | GUID ise | Şablon alıcı GUID (externalId); r1 gibi string çalışmaz |
order | number | Hayır | externalId yoksa sıra ile eşleme |
role | string | Hayır | externalId yoksa rol ile eşleme |
fullName | string | Evet | Ad soyad |
email | string | Kanala göre | E-posta |
phone | string | Kanala göre | Telefon |
recipientProfile | object | Hayır | Uyruk, kimlik, vekil, doğrulama (configuration ile aynı şema) |
Örnek istek
recipientExternalId: "r1" çalışmaz (configuration örneğidir). Şablon alıcı eşlemesi:
recipientExternalId= şablon alıcı GUID (DocumentRecipient.Id/ panelexternalId), veyaorderverolebirlikte şablondakiyle aynı
deliveryPlans sayısı şablon alıcı sayısına eşitse sıra ile eşlenir (GUID zorunlu değil).
Tek alıcılı şablon örneği (privateNote, uyruk, vekil, OTP dahil):
{
"isOrderedFlow": true,
"privateNote": "ERP sipariş #4521 — iç not",
"recipients": [
{
"order": 1,
"role": "Signee",
"fullName": "Ayşe Yılmaz",
"email": "[email protected]",
"phone": "+905551112233",
"recipientProfile": {
"firstName": "Ayşe",
"lastName": "Yılmaz",
"principalEmail": "[email protected]",
"principalPhone": "+905551112233",
"personCategory": "TurkishCitizen",
"identityDocumentKind": "TcKimlik",
"tcKimlikNo": "12345678901",
"useRepresentativeForDelivery": true,
"representative": {
"personCategory": "TurkishCitizen",
"identityDocumentKind": "TcKimlik",
"tcKimlikNo": "10987654321",
"firstName": "Mehmet",
"lastName": "Demir",
"email": "[email protected]",
"phone": "+905559998877"
},
"verification": {
"phoneOtpVerification": true
}
}
}
],
"deliveryPlans": [
{ "channels": ["email", "sms"] }
]
}
personCategory: TurkishCitizen | Foreign | Stateless. Vekil yoksa useRepresentativeForDelivery ve representative alanlarını göndermeyin.
İki alıcılı şablon: recipients ve deliveryPlans içinde şablondaki kadar kayıt gönderin (order: 1, order: 2 …).
Yanıt data
| Alan | Tip | Açıklama |
|---|---|---|
operationId | guid | Üretilen yeni belge operasyon kimliği |
enqueuedJobCount | number | Kuyruğa alınan gönderim işi |
initialRecipientAccessCode | string | İlk alıcı erişim kodu (open_on_device) |
openOnThisDeviceForActiveRecipient | boolean | Bu cihazda aç yönlendirmesi |
Şablon kimliği path’tedir; yanıt operationId üretilen belgenindir. Durum: GET /developer/documents/{operationId}.
Send — POST /developer/documents/{operationId}/send
İstek alanları
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
isOrderedFlow | boolean | Hayır | Sıralı / paralel |
deliveryPlans | array | Evet | Alıcı bazlı kanal planı |
deliveryPlans[]
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
recipientExternalId | string | Evet | Configuration’daki alıcı externalId |
channels | string[] | Evet | email / sms / kiosk / open_on_device |
kioskDeviceId | guid | Hayır* | kiosk kanalında zorunlu |
scheduledSendAtUtc | string | Hayır | İleri tarihli gönderim (ISO 8601 UTC) |
copyNotificationChannels | string[] | Hayır | Tamamlanınca kopya: yalnızca email / sms |
Örnek istek
{
"isOrderedFlow": true,
"deliveryPlans": [
{
"recipientExternalId": "r1",
"channels": ["email", "sms"],
"copyNotificationChannels": ["email"]
},
{
"recipientExternalId": "r2",
"channels": ["email"],
"scheduledSendAtUtc": "2026-08-20T09:00:00Z"
}
]
}
Kiosk örneği:
{
"recipientExternalId": "r1",
"channels": ["kiosk"],
"kioskDeviceId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
Yanıt data
| Alan | Tip | Açıklama |
|---|---|---|
enqueuedJobCount | number | Kuyruğa alınan iş adedi |
initialRecipientAccessCode | string | İlk / aktif alıcı erişim kodu (/r/{code}) |
openOnThisDeviceForActiveRecipient | boolean | Bu cihazda aç yönlendirmesi gerekli mi |
{
"enqueuedJobCount": 2,
"initialRecipientAccessCode": "ABC12XYZ",
"openOnThisDeviceForActiveRecipient": false
}
Imza linki: {appBase}/r/{initialRecipientAccessCode} — bkz. İmzalama akışı.
Liste yanıtı (data)
| Alan | Tip | Açıklama |
|---|---|---|
items[].operationId | guid | İşlem kimliği |
items[].displayFileName | string | Dosya adı |
items[].status | string | Draft / Configured / Dispatched / Completed / Rejected |
items[].publicShortCode | string | Kısa kod |
items[].createdAtUtc | string | Zaman (UTC) |
totalCount | number | Toplam kayıt |
page | number | Sayfa |
pageSize | number | Sayfa boyutu |
Detay yanıtı (data)
GET /developer/documents/{operationId} ve GET /developer/templates/{templateOperationId} aynı data şeklini döner.
| Alan | Tip | Açıklama |
|---|---|---|
operationId | guid | İşlem / şablon kimliği |
workspaceId | guid | Workspace |
operationType | string | document / template |
status | string | Durum |
displayFileName | string | Görünen ad |
description | string | Açıklama |
privateNote | string | İç not |
isOrderedFlow | boolean | Sıralı akış |
publicShortCode | string | Kısa kod |
recipientCount | number | Alıcı adedi |
recipients | array | Alıcı özetleri (aşağıda) |
recipients[] (detay)
| Alan | Tip | Açıklama |
|---|---|---|
recipientExternalId | string | Alıcı GUID — from-template body’de eşleme için |
order | number | Sıra |
role | string | Signee / Viewer / Approver vb. |
fullName | string | Kayıtlı ad (şablonda boş olabilir) |
email / phone | string | Kayıtlı iletişim |
personCategory | string | Uyruk (varsa) |
useRepresentativeForDelivery | boolean | Vekil akışı |
representativeFullName / Email / Phone | string | Vekil özeti |
defaultDeliveryChannels | string[] | Şablon varsayılan kanalları |
deliveryStatus | string | Pending / Sent / Failed |
isStepCompleted | boolean | Alıcı adımı tamamlandı mı |
completedAtUtc | string | Tamamlanma zamanı (UTC) |
Şablondan gönderirken her recipients[] öğesi için body’de bir kayıt doldurun (order+role veya recipientExternalId).