Geliştiriciler

REST API iş akışı kılavuzu

Doküman imzalama ve ek dosya yönetimi: iş yaşam döngüsü, uç noktalar, tam örnek akış ve hata kodları. Tam OpenAPI referansı ve SDK için teknik görüşme isteyin.

Genel Bakış

Bu kılavuz, doküman imzalama iş akışlarını oluşturmak ve yönetmek için REST API'nin nasıl kullanılacağını açıklar. Platform, PDF dokümanlarla dijital imzaları destekler ve birden fazla alıcının dokümanları sırayla veya paralel olarak imzalamasına olanak tanır.

📚 Tam API Referansı

Detaylı API dokümantasyonu ve etkileşimli test arayüzü için:

API Dokümantasyonu

Bu dokümantasyon, tüm uç noktaları, istek/yanıt şemalarını ve API çağrılarını test etmek için etkileşimli bir arayüz içerir.

Temel Kavramlar

  • İşler (Jobs): İmzalama iş akışı için kapsayıcı. Her işin bir tipi (ME_OTHERS veya SELF) ve durumu (NONE, DRAFT, IN_PROGRESS, COMPLETED) vardır.
  • Dokümanlar (Documents): İmzalanması gereken PDF dosyaları.
  • Alıcılar (Recipients): Dokümanları imzalaması gereken kişiler.
  • Form Alanları (Form Fields): PDF'deki etkileşimli öğeler; imza alanları, metin kutuları, onay kutuları ve ek dosya listelerini içerir.
  • Ek Dosyalar (Attachments): Ana PDF doküman içine gömülü ek dosyalar. Maksimum 15 ek dosya, her biri 40MB.

İş Yaşam Döngüsü

İşler, yaşam döngüleri boyunca farklı durumlardan geçer:

stateDiagram-v2
    [*] --> NONE: POST /jobs
    NONE --> DRAFT: PUT .../startrequestsignature
    DRAFT --> IN_PROGRESS: PUT .../finish
    IN_PROGRESS --> COMPLETED: Tüm imzalar toplandı
    COMPLETED --> [*]

    note right of NONE
        Başlangıç durumu
        Ek eklenip/çıkarılabilir
        Doküman yüklenebilir
    end note

    note right of DRAFT
        Yapılandırma aşaması
        Ek eklenip/çıkarılıp/güncellenebilir
        Alıcı eklenip/çıkarılabilir
        Form alanları eklenebilir
    end note

    note right of IN_PROGRESS
        İmzalama aşaması
        Ekler SALT OKUNUR
        Alıcılar bildirim alır
        İmzalar toplanıyor
    end note

    note right of COMPLETED
        Son durum
        Tüm imzalar toplandı
        Ekler SALT OKUNUR
        Doküman arşivlendi
    end note
                

Durum Açıklamaları

Durum Açıklama Kullanılabilir Ana İşlemler
NONE İş yeni oluşturuldu Doküman yükleme, ek ekleme, iş akışını başlatma
DRAFT Yapılandırma aşaması Alıcı yönetimi, form alanı ekleme, ek yönetimi, işi bitirme
IN_PROGRESS Aktif imzalama Alıcılar imzalıyor (sadece frontend), ekleri görüntüleme/indirme
COMPLETED Tamamlandı Final dokümanı görüntüleme, ekleri indirme

Durumlara Göre İşlemler

İş durumuna bağlı olarak farklı işlemlere izin verilir:

İşlem NONE DRAFT IN_PROGRESS COMPLETED
İş Oluşturma---
Doküman Yükleme
Alıcı Ekleme
Ek Ekleme
Ek İndirme
⚠️ Temel Kural: Bir iş IN_PROGRESS'e geçtiğinde (finish çağrısından sonra), tüm yapılandırma kilitlenir. Bu noktada sadece okuma/indirme yapabilirsiniz.

REST API Uç Noktaları

Tüm uç noktalar access_token header'ı ile kimlik doğrulama gerektirir. Temel URL: /rest

İş Yönetimi

POST /jobs - İş Oluşturma

Yeni bir imzalama işi oluşturur.

Headers:

  • access_token: Kimlik doğrulama token'ınız (zorunlu)

Parametreler (form data):

  • name: İş adı (zorunlu)
  • job_type: İş tipi - ME_OTHERS veya SELF (opsiyonel)

Örnek:

curl -X POST "http://localhost:8080/agree/rest/jobs" \
  -H "access_token: $ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "job_type=ME_OTHERS" \
  -d "name=Ekli Belgelerle Doküman İmzalama"
PUT /jobs/{id}/actions/startrequestsignature - İmza İsteği Başlatma

İşi NONE durumundan DRAFT durumuna geçirir.

Örnek:

curl -X PUT "http://localhost:8080/agree/rest/jobs/$JOB_ID/actions/startrequestsignature" \
  -H "access_token: $ACCESS_TOKEN"
Ne olur:
• İş durumu NONE → DRAFT'a değişir
• Hesabınız otomatik olarak ilk alıcı olarak eklenir
• Artık daha fazla alıcı ekleyebilir, alanları yapılandırabilirsiniz
PUT /jobs/{id}/actions/finish - İşin Tasarımını Bitirme

İş yapılandırmasını sonlandırır ve IN_PROGRESS durumuna geçirir.

Parametreler:

  • subject: E-posta konu satırı (zorunlu)
  • message: E-posta mesaj metni (zorunlu)

Örnek:

curl -X PUT "http://localhost:8080/agree/rest/jobs/$JOB_ID/actions/finish" \
  -H "access_token: $ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "subject=Lütfen imzalayın: Ekli Belgeli Doküman" \
  --data-urlencode "message=Lütfen dokümanı inceleyin ve imzalayın."
⚠️ Dikkat: Bu çağrıdan sonra tüm yapılandırma kilitlenir!

Doküman Yönetimi

⚠️ Önemli Not: Görüntüleme, imzalama ve ek dosya işlemleri yalnızca ilk yüklenen doküman için gerçekleştirilir. En az bir doküman yüklemeden startrequestsignature çağrısı yapamazsınız. NONE ve DRAFT durumlarında, birden fazla doküman eklemek ve bunları tek bir dokümanda birleştirmek mümkündür (ilk yüklenen doküman dosyasında saklanır).
POST /jobs/{id}/documents - Doküman Yükleme

İşe bir PDF doküman yükler.

Örnek:

curl -X POST "http://localhost:8080/agree/rest/jobs/$JOB_ID/documents" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/document.pdf;filename=sozlesme.pdf;type=application/pdf"

Ek Dosya Yönetimi

POST /documents/{id}/attachments - Ek Dosya Ekleme

PDF doküman içine bir dosyayı ek olarak gömer.

Parametreler:

  • file: Eklenecek dosya (zorunlu)
  • displayName: PDF'de gösterilecek ad (zorunlu)

Limitler:

  • Maksimum 15 ek dosya
  • Her ek maksimum 40MB
  • Türkçe karakterler dönüştürülür (ş→s, Ş→S)

Yaygın MIME Tipleri:

Dokümanlar:

  • .pdfapplication/pdf
  • .docapplication/msword
  • .docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
  • .xlsapplication/vnd.ms-excel
  • .xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • .pptapplication/vnd.ms-powerpoint (PowerPoint 97-2003)
  • .pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation (PowerPoint 2007+)
  • .txttext/plain

Görseller:

  • .pngimage/png
  • .jpgimage/jpeg
  • .gifimage/gif
  • .bmpimage/bmp
  • .svgimage/svg+xml

Arşiv Dosyaları:

  • .zipapplication/zip
  • .rarapplication/x-rar-compressed
  • .7zapplication/x-7z-compressed

CAD/Mühendislik:

  • .dwgapplication/acad veya image/vnd.dwg (AutoCAD)
  • .dxfimage/vnd.dxf

Diğer:

  • Bilinmeyen/Genel → application/octet-stream

Örnek:

curl -X POST "http://localhost:8080/agree/rest/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/attachment.pdf;filename=kimlik.pdf;type=application/pdf" \
  -F "displayName=Nüfus Cüzdanı Belgesi"
GET /documents/{id}/attachments - Ekleri Listeleme

Bir doküman için tüm ekleri getirir.

Örnek:

curl -X GET "http://localhost:8080/agree/rest/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN"
GET /attachments/{id} - Tek Ek Dosya İndirme

Belirli bir ek dosyayı indirir.

Örnek:

curl -X GET "http://localhost:8080/agree/rest/attachments/$ATTACHMENT_ID" \
  -H "access_token: $ACCESS_TOKEN" \
  -o indirilen-ek.pdf
DELETE /attachments/{id} - Ek Dosya Çıkarma

Dokümandan bir eki siler.

📝 Not: Sadece NONE ve DRAFT durumlarında izin verilir.

Tam İş Akışı Örneği

Bu bölüm, gerçek test script'i test-attachments-signing-workflow.sh'e dayalı olarak, ekli belgelerle tam bir doküman imzalama iş akışını adım adım anlatır.

Ön Koşullar

# Access token'ınızı ayarlayın
ACCESS_TOKEN="your_access_token_here"

# Base URL'i ayarlayın
BASE_URL="http://localhost:8080/agree/rest"
# Veya production için:
# BASE_URL="https://imzayeri.com/api/rest"

Adım 1: İş Oluşturma (NONE Durumu)

Yeni bir imzalama işi oluşturun.

RESPONSE=$(curl -s -X POST "$BASE_URL/jobs" \
  -H "access_token: $ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "job_type=ME_OTHERS" \
  -d "name=Ekli Belgelerle Doküman İmzalama")

JOB_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
echo "Oluşturulan İş ID: $JOB_ID"

Sonuç: NONE durumu ile iş oluşturuldu

Adım 2: Doküman Yükleme

İmzalanacak ana PDF dokümanı yükleyin.

RESPONSE=$(curl -s -X POST "$BASE_URL/jobs/$JOB_ID/documents" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/sozlesme.pdf;filename=sozlesme.pdf;type=application/pdf")

DOCUMENT_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['id'])")
echo "Yüklenen Doküman ID: $DOCUMENT_ID"

Adım 3: İmza İsteği Başlatma (NONE → DRAFT)

ME_OTHERS iş akışını başlatın.

RESPONSE=$(curl -s -X PUT "$BASE_URL/jobs/$JOB_ID/actions/startrequestsignature" \
  -H "access_token: $ACCESS_TOKEN")

JOB_STATUS=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['status'])")
RECIPIENT0_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['recipients'][0]['id'])")
echo "İş Durumu: $JOB_STATUS"

Adım 4-7: Ek Dosyalar Ekleme (DRAFT Durumu)

Dokümana birden fazla ek ekleyin.

# PDF ek
curl -s -X POST "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/ornek.pdf" \
  -F "displayName=Nüfus Cüzdanı Belgesi"

# Büyük PDF (30MB)
curl -s -X POST "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/buyuk-dosya.pdf" \
  -F "displayName=İmza Sirküsü Belgesi (30MB Test)"

# DWG dosyası
curl -s -X POST "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/cizim.dwg" \
  -F "displayName=ÇAĞ Testere Tezgahı"

# PowerPoint dosyası
curl -s -X POST "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN" \
  -F "file=@/path/to/sunum.ppt" \
  -F "displayName=DENİZ Savaş Sistemleri Belgesi"

Adım 8-10: Alıcıları Yapılandırma (DRAFT Durumu)

Varsayılan alıcıyı çıkarın ve iki yeni alıcı ekleyin.

# İlk alıcıyı sil
curl -s -X DELETE "$BASE_URL/recipients/$RECIPIENT0_ID" \
  -H "access_token: $ACCESS_TOKEN"

# İlk alıcıyı ekle
RESPONSE=$(curl -s -X POST "$BASE_URL/jobs/$JOB_ID/recipients" \
  -H "access_token: $ACCESS_TOKEN" \
  -d "name=Ahmet Yılmaz" \
  -d "email=ahmet.yilmaz@example.com")

# İkinci alıcıyı ekle ve HER İKİ yeni alıcı ID'sini çıkar
RESPONSE=$(curl -s -X POST "$BASE_URL/jobs/$JOB_ID/recipients" \
  -H "access_token: $ACCESS_TOKEN" \
  -d "name=Ayşe Kaya" \
  -d "email=ayse.kaya@example.com")

# ÖNEMLİ: Yanıt tüm alıcıları içeren tam iş nesnesini döner
# Eski RECIPIENT0_ID silindiği için, her ikisini de yeniden atıyoruz
RECIPIENT0_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['recipients'][0]['id'])")
RECIPIENT1_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['recipients'][1]['id'])")
echo "Alıcı 0 ID: $RECIPIENT0_ID"
echo "Alıcı 1 ID: $RECIPIENT1_ID"

Adım 11: Ek Dosya Listesi Alanı Ekleme

PDF'de tüm ekleri göstermek için özel bir alan ekleyin.

FORM_FIELDS="[{
  \"documentId\": $DOCUMENT_ID,
  \"recipientId\": $RECIPIENT0_ID,
  \"page\": 1,
  \"type\": \"file-list\",
  \"x\": 50,
  \"y\": 200,
  \"width\": 400,
  \"height\": 100,
  \"label\": \"Ekler\",
  \"enabled\": true,
  \"variable\": \"attachments_list\",
  \"orderno\": 0,
  \"required\": \"false\"
}]"

curl -s -X PUT "$BASE_URL/documents/$DOCUMENT_ID/fields" \
  -H "access_token: $ACCESS_TOKEN" \
  --data-urlencode "fields=$FORM_FIELDS"

Adım 12: İşin Tasarımını Bitirme (DRAFT → IN_PROGRESS)

Yapılandırmayı sonlandırın ve alıcılara gönderin.

curl -s -X PUT "$BASE_URL/jobs/$JOB_ID/actions/finish" \
  -H "access_token: $ACCESS_TOKEN" \
  -d "subject=Lütfen imzalayın: Ekli Belgeli Doküman" \
  --data-urlencode "message=Lütfen dokümanı inceleyin ve imzalayın."
⚠️ Sonuç: İş durumu IN_PROGRESS'e değişti. Her iki alıcıya da imzalama linkleriyle e-postalar gönderildi. Tüm yapılandırma artık kilitli!

Adım 13-14: İlk Alıcı İmzalıyor

⚠️ Not: İmzalama frontend web arayüzü üzerinden yapılır, REST API ile DEĞİL.

Alıcı, e-posta ile bir link alır, tıklar, dokümanı inceler (ek listesi görünür) ve sertifikası veya mobil imzası ile imzalar.

Adım 15-16: İlk İmzadan Sonra Ekleri Doğrulama

İlk imzadan sonra eklerin hala mevcut ve erişilebilir olduğunu kontrol edin.

RESPONSE=$(curl -s -X GET "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN")

ATTACHMENT_COUNT=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['count'])")
echo "Ek sayısı: $ATTACHMENT_COUNT"

if [ "$ATTACHMENT_COUNT" -eq 4 ]; then
  echo "✓ İlk imzadan sonra tüm 4 ek hala mevcut"
fi

Adım 17-18: İkinci Alıcı İmzalıyor

İkinci alıcı da artık dokümanı imzalıyor (yine frontend üzerinden).

Sonuç: Tüm imzalar toplandı, iş COMPLETED durumuna geçti

Adım 19-20: Final Doğrulama (COMPLETED Durumu)

Eklerin tüm imzalama iş akışı boyunca devam ettiğini doğrulayın.

RESPONSE=$(curl -s -X GET "$BASE_URL/documents/$DOCUMENT_ID/attachments" \
  -H "access_token: $ACCESS_TOKEN")

ATTACHMENT_COUNT=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin)['count'])")
echo "Final ek sayısı: $ATTACHMENT_COUNT"
echo "✓ Tüm ekler tam imzalama iş akışı boyunca devam etti"
✅ Final Sonuç:
  • İş durumu: COMPLETED
  • Tüm 4 ek mevcut ve indirilebilir
  • İmzalı PDF tüm ekleri gömülü içeriyor
  • Ek listesi alanı PDF'de tüm 4 eki gösteriyor

Özel Özellikler

Ek Dosya Listesi Alanı (file-list)

Ek dosya listesi alanı, tüm doküman eklerini otomatik olarak doğrudan PDF içinde formatlanmış bir liste olarak gösteren özel bir form alanı tipidir.

Nasıl Çalışır:

  1. Amaç: Ana doküman içinde tüm ekli dosyaların görsel bir referansını sağlar
  2. Render: "Ekli Belgeler Listesi" başlığıyla numaralı bir liste oluşturur
  3. İçerik: Her ekin displayName'ini gösterir
  4. Kalıcılık: Liste, iş bittiğinde render edilir ve final imzalı PDF'de kalır

Yapılandırma Örneği:

FORM_FIELDS='[{
  "documentId": '$DOCUMENT_ID',
  "recipientId": '$RECIPIENT_ID',
  "page": 1,
  "type": "file-list",
  "x": 50,
  "y": 200,
  "width": 400,
  "height": 100,
  "label": "Ekler",
  "enabled": true,
  "variable": "attachments_list",
  "orderno": 0,
  "required": "false"
}]'
✅ PDF'deki Çıktı:

Ekli Belgeler Listesi
1. Nüfus Cüzdanı Belgesi
2. İmza Sirküsü Belgesi
3. ÇAĞ Testere Tezgahı
4. DENİZ Savaş Sistemleri Belgesi

Önemli Notlar

Ek Kalıcılığı

  • Gömme: Ekler PDFBox kütüphanesi kullanılarak fiziksel olarak PDF içine gömülür
  • Kalıcılık: Bir kez gömüldükten sonra, ekler tüm aşamalarda devam eder
  • İmzalama: Dijital imzalar ekleri kaldırmaz veya bozmaz
  • Erişim: Ekler tüm aşamalarda indirilebilir durumda kalır

Karakter İşleme

Görünen Adlar (ek listesinde):
Türkçe ş → s, Türkçe Ş → S

Dosya Adları (PDF'de):
Geçersiz karakterler alt çizgi (_) ile değiştirilir

Dosya Limitleri

Limit Tipi Değer Hata Kodu
Doküman başına max ek 15 280
Ek dosya max boyutu 40 MB 286
Yinelenen dosya adı İzin verilmez 282

Hata Kodları

Kod Ad Açıklama Çözüm
280 ATTACHMENT_LIMIT_EXCEEDED 15'ten fazla ek eklemeye çalışıldı Bazı ekleri çıkarın veya daha az dosya kullanın
282 ATTACHMENT_ALREADY_EXISTS Dosya adı zaten mevcut Farklı bir dosya adı kullanın
285 ATTACHMENT_MODIFICATION_NOT_ALLOWED İş bittikten sonra değişiklik denendi Ekler sadece NONE veya DRAFT durumunda değiştirilebilir
286 ATTACHMENT_SIZE_EXCEEDED Ek dosya 40MB limitini aşıyor Dosyayı sıkıştırın

HTTP Durum Kodları

  • 200 OK: Başarılı istek
  • 201 Created: Kaynak oluşturuldu
  • 400 Bad Request: Geçersiz parametreler
  • 403 Forbidden: İşlem yapılamaz
  • 404 Not Found: Kaynak bulunamadı