Skip to main content

Webhooks

When an anomaly is detected during booking reconciliation, Recon can send an HTTP request to a configured webhook URL delivering a JSON payload with the anomaly details. These webhooks allow you to receive real-time notifications about discrepancies in your booking data, enabling you to take immediate action and maintain accurate records across your systems.

You can configure your webhook URL and authentication method in the Reconciliation Dashboard under Webhooks section. Recon supports three authentication methods for webhooks: API Key, Basic Authentication, and Bearer Token. You can choose the method that best fits your security requirements.

HTTP headers

Every webhook request includes the following headers:

HeaderValue
Content-Typeapplication/json
User-AgentTravelgate-Recon-Webhook/1.0

Additionally, any custom headers and authentication headers (API Key, Basic Auth, or Bearer Token) configured on the webhook are included.

Demo payload

{
"event": "anomaly.detected",
"anomaly": {
"id": 42,
"scenario": "status",
"pair": "seller-internal",
"severity": "error",
"summary": "Status differs: CONFIRMED vs CANCELLED",
"details": { "left": "CONFIRMED", "right": "CANCELLED" },
"fingerprint": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
"is_open": true,
"detected_at": "2026-02-19T10:30:00+00:00",
"first_seen_at": "2026-02-19T10:30:00+00:00"
},
"booking_references": {
"internal_id": 1001,
"seller_id": 2002,
"buyer_id": null
},
"timestamp": "2026-02-19T10:30:00+00:00"
}

Field descriptions

FieldTypeDescription
eventstringAlways "anomaly.detected".
anomaly.idintegerUnique identifier of the anomaly.
anomaly.scenariostringThe type of check that detected the anomaly (see scenarios below).
anomaly.pairstringWhich two booking sources were compared (see pairs below).
anomaly.severitystringSeverity level: error, warn, or info.
anomaly.summarystringHuman-readable description of the anomaly.
anomaly.detailsobjectScenario-specific data (see details per scenario below).
anomaly.fingerprintstringSHA-256 hash used for deduplication.
anomaly.is_openbooleanWhether the anomaly is still open.
anomaly.detected_atstringISO 8601 datetime when the anomaly was detected.
anomaly.first_seen_atstringISO 8601 datetime when the anomaly was first seen.
booking_references.internal_idinteger or nullID of the internal booking (if involved in the pair).
booking_references.seller_idinteger or nullID of the seller booking (if involved in the pair).
booking_references.buyer_idinteger or nullID of the buyer booking (if involved in the pair).
timestampstringISO 8601 datetime (same as detected_at).

Anomaly scenarios

ScenarioDescription
statusBooking status mismatch between two sources.
net_amountNet payable amount differs beyond tolerance.
check_in_outCheck-in or check-out dates do not match.
hotelHotel code mismatch between two sources.
cancel_penalties_nrfNon-refundable flag mismatch.
cancel_penalties_deadlineCancellation penalty deadline mismatch.
cancel_penalties_net_amountCancellation penalty amount mismatch.

details per scenario

The anomaly.details object varies by scenario:

  • status
{ "left": "CONFIRMED", "right": "CANCELLED" }
  • net_amount
{ "amount_left": "350.00", "amount_right": "375.50", "delta": "25.50" }
  • check_in_out
{
"left": { "check_in": "2026-03-10", "check_out": "2026-03-15" },
"right": { "check_in": "2026-03-10", "check_out": "2026-03-14" }
}
  • hotel
{ "mismatches": { "code_seller": ["HTL-ABC", "HTL-XYZ"] } }
  • cancel_penalties_nrf
{
"left": { "refundable": true, "penalties": [] },
"right": { "refundable": false, "penalties": [] }
}
  • cancel_penalties_deadline
{
"left": "2026-03-01T12:00:00+00:00",
"right": "2026-02-28T12:00:00+00:00",
"left_penalties_count": 1,
"right_penalties_count": 2
}
  • cancel_penalties_net_amount
{ "left": "150.00", "right": "200.00" }

Severity values

SeverityMeaning
errorCritical discrepancy that likely requires immediate action.
warnNotable difference that should be reviewed.
infoInformational; values match or difference is within tolerance.

Pair values

The pair field indicates which two booking sources were compared. The value before the hyphen is the "left" side and the value after is the "right" side in the details object.

PairDescription
seller-internalSeller booking compared against internal (Travelgate) booking.
buyer-sellerBuyer booking compared against seller booking.
buyer-internalBuyer booking compared against internal (Travelgate) booking.