Webhook'lar
Sipariş olaylarını polling yapmadan anlık alın: kayıtlı HTTPS adresinize her olayda JSON gövdeli bir POST atılır. Hem tedarikçi hem restoran anahtarları webhook kaydedebilir; her taraf yalnızca kendi siparişlerinin olaylarını alır.
Olaylar
| Olay | Ne zaman tetiklenir |
|---|---|
| order.created | Yeni sipariş oluşturulduğunda (web, panel veya API — kanal fark etmez) |
| order.status_changed | Sipariş durumu her değiştiğinde (onay, hazırlama, sevkiyat, teslim, iptal…) |
| webhook.test | Yalnızca talep üzerine — POST /webhooks/:id/test ile kurulum testi |
Teslimat gövdesi
Örnek POST gövdesi
{
"event": "order.status_changed",
"created_at": "2026-07-10T09:15:00Z",
"data": {
"order_id": "uuid",
"status": "confirmed",
"previous_status": "pending", // order.created'da null
"payment_method": "cari",
"payment_status": "unpaid",
"subtotal": 1740,
"total": 1914,
"restaurant_id": "uuid",
"supplier_id": "uuid",
"order_created_at": "2026-07-10T08:30:00Z"
}
}Gövde özet bilgidir; kalemler gerekiyorsa GET /orders/:id ile detayı çekin.
Teslimat garantisi ve retry
Ucunuz 5 saniye içinde 2xx dönmelidir. İlk deneme olay anında yapılır; başarısız olursa (zaman aşımı, bağlantı hatası veya 2xx dışı yanıt) teslimat artan aralıklarla otomatik tekrarlanır: 2 dk → 10 dk → 30 dk → 2 sa — toplam 5 deneme. Beşinci deneme de başarısızsa olay failed olarak işaretlenir ve bir daha gönderilmez. Aynı olay birden çok kez ulaşabilir (en az bir kez teslimat) — her teslimatın tüm denemelerinde aynı kalan X-Restomarkt-Delivery-Id başlığıyla tekilleştirin (işlediğiniz kimlikleri kaydedin, tekrar gelirse 2xx dönüp atlayın). Uzun kesintiler için GET /orders ile mutabakat yine önerilir.
İmza doğrulama
Her istekte şu başlıklar bulunur: X-Restomarkt-Event, X-Restomarkt-Webhook-Id, X-Restomarkt-Delivery-Id(teslimat kimliği — retry'larda değişmez, tekilleştirme için) ve X-Restomarkt-Signature. İmza, ham istek gövdesinin webhook secret'ınızla HMAC-SHA256 özetidir — istekleri mutlaka doğrulayın:
Node.js doğrulama örneği
import crypto from "node:crypto";
function verifyWebhook(rawBody, signatureHeader, secret) {
// signatureHeader: "sha256=3f5a..."
const expected = "sha256=" +
crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signatureHeader),
Buffer.from(expected),
);
}Yönetim uçları
GET /api/v1/webhookswebhooks:manage
Kayıtlı webhook'larınız. Güvenlik gereği secret hiçbir listede dönmez.
Yanıt
{ "webhooks": [
{ "id": "uuid", "url": "https://ornek.com/webhook", "events": ["order.created"], "is_active": true, "created_at": "..." }
] }POST /api/v1/webhookswebhooks:manage
Yeni webhook kaydeder (en fazla 10). url https:// olmalı. events boşsa iki olay da açılır. Yanıttaki secret YALNIZCA bu istekte döner — imza doğrulaması için güvenle saklayın.
İstek gövdesi
{
"url": "https://ornek.com/restomarkt-webhook",
"events": ["order.created", "order.status_changed"] // opsiyonel
}Yanıt
{ "webhook": {
"id": "uuid",
"url": "https://ornek.com/restomarkt-webhook",
"events": ["order.created", "order.status_changed"],
"is_active": true,
"secret": "whsec_..." // bir daha gösterilmez!
} } // HTTP 201Örnek
curl -X POST https://restomarkt.com/api/v1/webhooks \
-H "Authorization: Bearer rmk_live_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://ornek.com/restomarkt-webhook"}'PATCH /api/v1/webhooks/:idwebhooks:manage
url, events veya is_active güncelleyin (en az bir alan). Geçici olarak kapatmak için is_active=false yeterli.
İstek gövdesi
{ "is_active": false }Yanıt
{ "webhook": { "id": "uuid", "url": "...", "events": [...], "is_active": false, "created_at": "..." } }DELETE /api/v1/webhooks/:idwebhooks:manage
Webhook kaydını kalıcı olarak siler.
Yanıt
{ "deleted": true }POST /api/v1/webhooks/:id/testwebhooks:manage
Kayıtlı adrese imzalı bir webhook.test olayı gönderir — imza doğrulamanızı ve ucunuzun erişilebilirliğini canlı sipariş beklemeden sınayın. Senkron çalışır, retry kuyruğuna girmez.
Yanıt
{ "delivered": true, "status_code": 200 }
// uca ulaşılamazsa:
{ "delivered": false, "status_code": null, "error": "Uca ulaşılamadı..." }Örnek
curl -X POST https://restomarkt.com/api/v1/webhooks/WEBHOOK_ID/test \
-H "Authorization: Bearer rmk_live_..."