Webhook
GET /v1/jobs/{id} polling'inin push tabanli alternatifidir: surekli
durum sormak yerine, bir document completed ya da failed oldugunda
backend sizin belirledigin URL'e imzali bir HTTP POST istegi atar. Polling
her zaman calisir durumda kalir (webhook basarisiz olsa dahi guvenilir
fallback'tir, bkz. Polling); webhook yalnizca gecikmeyi ve
gereksiz sorgu trafigini azaltir.
Batch bazinda toplu webhook yoktur — batch icindeki her document kendi bildirimini ayri ayri alir.
Callback URL nasil ayarlanir
Webhook hedefi kalici bir dashboard ayari degil, istek bazinda belirlenir:
POST /v1/documentsya daPOST /v1/batchesgovdesinde opsiyonelcallback_urlalani ile gonderilir (bkz. Upload). Ayni tenant'in farkli yuklemeleri farkli URL'lere gidebilir.- Istekte
callback_urlbos birakilirsa tenant'in varsayilani (default_callback_url) kullanilir. - Bu varsayilan ve HMAC imza sirri (
webhook_secret) su an self-servis bir panelden ayarlanamiyor — DocsFra operasyon ekibi tarafindan tenant kaydi uzerinde tanimlanir; entegrasyona baslarken bunlari bizimle paylasmaniz gerekir. - Ikisi de bos ise webhook hic gonderilmez (no-op) — bu durumda istemci yalnizca polling'e guvenmelidir.
Event tipleri ve payload semasi
document.completed—resultdolu,error: nulldocument.failed—result: null,errordolu
Payload alanlari GET /v1/jobs/{id} ile ayni kaynaktan turetilir:
id,batch_id,external_item_ref,external_batch_refstatus,page_countpartial—trueise en az bir sayfa tum motorlarda islenemedi ama document yinecompletedsayilir (kismi sonuc, bkz. Polling).result.markdown_url,result.json_url— yalnizcacompletediken dolu. Sureli signed link'lerdir, webhook gonderilirken bir kez uretilip payload'a gomulur; retry denemelerinde ayni URL tekrar kullanilir (her denemede yeniden imzalanmaz), bu yuzden gecikmis bir teslimat aliyorsaniz linkin suresi dolmus olabilir — bu durumdaGET /v1/jobs/{id}ile taze bir link alin.error— yalnizcafailediken dolu.
Ornek payload ve tam sema sag panelde.
Imza dogrulama
Her istek X-Signature: sha256=<hex hmac> basligi tasir. Deger,
tenant'inizin webhook_secret'i ile istek govdesinin (ham JSON body, parse
edilmeden once) HMAC-SHA256 imzasidir.
Kendi tarafinizda ayni hesaplamayi ham body byte'lari uzerinden yapip
sabit zamanli karsilastirma yapmalisiniz (timingSafeEqual /
hmac.compare_digest) — string esitligi (===) zamanlama saldirilarina
acik oldugu icin kullanilmamalidir. Kod ornekleri sag panelde.
Yanit beklentisi
- Endpoint'iniz 10 saniye icinde yanit vermelidir; asilirsa timeout sayilir ve retry sirasina girer.
- Yalnizca HTTP durum kodu kontrol edilir:
2xx(200-299) basarili sayilir, govde icerigi onemli degildir. Bunun disindaki her kod (4xx/5xx dahil) ve baglanti hatasi basarisiz sayilir.
Retry politikasi
Hedef 2xx disinda bir kod donerse ya da timeout olursa, exponential
backoff ile tekrar denenir:
1dk -> 5dk -> 30dk -> 2sa -> exhausted
exhausted durumuna ulasan bir job icin istemci GET /v1/jobs/{id}
polling'ine dusmelidir — bu endpoint her zaman guncel durumu doner.
Idempotency
Webhook endpoint'inizin idempotent olmasi gerekir; ayni document.id
icin birden fazla bildirim gelebilir (retry senaryolarinda, ya da nadiren
ayni denemenin tekrar kuyruklanmasinda). Tekrarlanan istekleri guvenle yok
sayabilmek icin document.id + status kombinasyonuna gore kontrol
uygulayin.
Notlar
- MVP'de payload formati sabittir; tenant'a ozel sablon destegi yoktur.
callback_urlistekte bos birakilirsatenant.default_callback_urlkullanilir; o da yoksa webhook hic gonderilmez.