Webhooks Overview
Pientegra event delivery modeli, headers, retry davranışı ve handler contract'ı.


Pientegra, deposit ve withdrawal state değişikliklerini partner site backend'ine webhook olarak gönderir. Webhook delivery at-least-once çalışır: aynı business event birden fazla kez gelebilir, bu yüzden handler idempotent olmalıdır.
Webhook, status polling'in yerine geçen primary integration channel'dır.
Webhook endpoint setup
İlk entegrasyonda Pientegra ekibine HTTPS endpoint'inizi iletin; size bir
API key ve ilk webhook_secret sağlanır. Bu noktadan sonra rotasyon
self-serve'dir: PUT /external/site/webhook-config endpoint'i ile URL
ve/veya secret'ı kendiniz değiştirebilirsiniz; detay için
Webhook Config.
Request body içinde webhookUrl field'ı kabul edilmez: tek delivery target,
site kaydında saklanan URL'dir.
Delivery flow
Partner backend Pientegra Partner webhook
| | |
| POST /withdrawals | |
|------------------------------->| |
| 200 withdrawalId | |
|<-------------------------------| |
| | (Pientegra processes the |
| | withdrawal) |
| | |
| | POST /your/webhook + HMAC |
| |------------------------------->|
| | 2xx = delivered, non-2xx |
| | = retry per backoff |
| |<-------------------------------|Request headers
| Header | Açıklama |
|---|---|
Content-Type | application/json |
Pientegra-Signature | t=<unix-ms>,v1=<hex> formatında HMAC-SHA256 signature. |
Pientegra-Event-Id | Delivery identifier. Handler log'larında ve duplicate detection'da saklayın. |
Payload envelope
Webhook body tek bir JSON object'tir:
{
"eventId": "01927b3c-9c1f-7a3a-9c4f-8a3e1f8b1c00",
"eventType": "withdrawal.sent",
"occurredAt": "2026-04-28T13:15:00.000Z",
"withdrawal": {
"id": "01927b3c-9c1f-7a3a-9c4f-8a3e1f8b1c00",
"referenceNo": "W-2026-0000123",
"externalUserId": "user-12345",
"amount": "250000",
"currency": "TRY",
"status": "SENT"
}
}| Field | Açıklama |
|---|---|
eventId | Webhook delivery/event identifier. Retry attempt'leri arasında stable kalır. |
eventType | Stable event type string. |
occurredAt | Business transition'ın Pientegra tarafında kaydedildiği UTC timestamp. Retry'lar arasında değişmez. |
intent | Deposit event'lerinde bulunur. |
withdrawal | Withdrawal event'lerinde bulunur. |
Financial mutation'lar için sadece eventId saklamakla yetinmeyin. Balance update
gibi side effect'leri (eventType, resource.id, resource.status) veya kendi
ledger transaction ID'nizle idempotent hale getirin.
Response contract
Handler başarılı işlediği veya daha önce işlenmiş duplicate event gördüğü durumda
2xx dönmelidir. Pientegra 2xx dışındaki response'ları delivery failure kabul eder.
| Response | Pientegra davranışı |
|---|---|
2xx | Event delivered kabul edilir. |
400/401/403 | Failure olarak işaretlenir ve retry edilir. |
5xx veya timeout | Failure olarak işaretlenir ve retry edilir. |
Handler 10 saniye içinde cevap vermelidir. Ağır işleri queue'ya alıp hızlı 200
dönmek en güvenli modeldir.
Retry behavior
Webhook delivery asynchronous retry mekanizmasıyla çalışır. Partner tarafında bilmeniz gereken contract:
| Ayar | Varsayılan |
|---|---|
| Max attempts | 8 |
| Backoff | Exponential |
| Base delay | 5s |
| Per-attempt timeout | 10s |
| Terminal failure | Attempts bittiğinde outbox row DEAD olur |
Delay sırası yaklaşık 5s, 10s, 20s, 40s, 80s, 160s, 320s şeklindedir.
Geçici platform restart'larında retry state korunur; aynı event yeniden
gönderilebileceği için handler idempotent kalmalıdır.
Handler checklist
- Raw body'yi parse etmeden önce signature verify edin.
- Timestamp tolerance uygulayın.
- Delivery ID ve business transition için idempotency kaydı tutun.
- Balance mutation'ı transactional yapın.
- Duplicate event'te side effect çalıştırmadan
2xxdönün. - Ağır işleri background job'a alın; webhook endpoint'i hızlı cevap versin.