Kılavuzlar
Webhook'lar
Üç olay, bütün rezervasyon tipleri, doğrulanacak tek imza. Bir uç kaydedin ve sormayı bırakın.
Abonelik
Abonelik iki eksende daralır.
events üç olaydan hangilerini alacağınızı, entities ise hangi kayıt tiplerini seçer. Birini yazmazsanız hepsini alırsınız; bu aynı zamanda sonradan eklenen bir kayıt tipinin de sizin ucunuza düşmeye başlaması demektir. Bu sizin için önemliyse açıkça seçin.events
- record.created
- record.updated
- record.deleted
entities
- car_rentals
- charters
- cruises
- customers
- events
- hotel_stays
- leads
- operator_invoices
- supplier_bills
- suppliers
- tickets
- tour_bookings
- tour_departures
- transfers
- visa_cases
curl -X POST https://YOUR-CELL.lydira.com/api/v1/webhooks \
-H 'Authorization: Bearer sek_YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/hooks/lydira",
"events": ["record.created", "record.updated"],
"entities": ["hotel_stays", "tickets"]
}'Yayınlamak ile aktarmak aynı izin değil
Şu tipler yayın yapar ve geri okunabilir, ama gönderilemez. Birine POST atmak
422 entity_not_writable döner. Ayrıca bir kalkışın iptal edildiğini ya da dolduğunu duymanın tek yolu tour_departures aboneliğidir, çünkü bu durum o kalkışta satılmış koltukların statüsünü değiştirmez.- charters
- events
- visa_cases
Gövde
Her olay aynı dört anahtarı taşır.
data, kaydı GET /api/v1/imports/{entity}/records/{external_id} ile aynı biçimde verir; kayıt bir aktarımla geldiyse sizin external_id değerinizi de içerir. record.updated her yeniden hesaplamada değil, anlamlı bir alan kıpırdadığında tetiklenir.POST your endpoint
{
"id": "evt_8f14e45fea2c4f339a3b",
"event": "record.updated",
"occurred_at": "2026-03-14T09:30:00Z",
"data": {
"entity": "hotel_stays",
"external_id": "HOTEL-STAY-1001",
"status": "confirmed"
}
}Her teslimattaki başlıklar
X-Lydira-Event: …
X-Lydira-Delivery: …
X-Lydira-Attempt: …
X-Lydira-Signature: …İmza doğrulama
Dört adım.
X-Lydira-Signature başlığından t ve v1 değerlerini ayırın, kayıt sırasında sakladığınız whsec_ gizli anahtarının SHA-256 hex özetini alın, . üzerinde HMAC-SHA256 hesaplayın ve v1 ile sabit zamanlı karşılaştırın. Eski bir t değerini de reddedin; yoksa yakalanmış bir teslimat daha sonra size karşı tekrar oynatılabilir.verify.js
import crypto from "node:crypto";
const SECRET = process.env.LYDIRA_WEBHOOK_SECRET; // whsec_…
const signingKey = crypto.createHash("sha256").update(SECRET).digest("hex");
export function verify(rawBody, header) {
const parts = Object.fromEntries(
header.split(",").map((pair) => pair.split("=")),
);
// Reject anything older than five minutes: without this, a delivery
// captured once can be replayed at you for ever.
const age = Math.abs(Date.now() / 1000 - Number(parts.t));
if (!parts.t || age > 300) return false;
const expected = crypto
.createHmac("sha256", signingKey)
.update(`${parts.t}.${rawBody}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(parts.v1 ?? ""),
);
}Teslimat
- Deneme
- 5 kez, üstel bekleme ile
- Başarı
- 2xx döndüren her yanıt; geri kalanı yeniden denenir
- Zaman aşımı
- bağlanma 10 sn, okuma 15 sn
- Hedefler
- yalnız genel adresler; özel, loopback ve link-local adresler reddedilir