Introduction

Webhooks allow external services to be notified by iGMS when certain events happen. When a specified event happens, we send a POST request to the URL you've provided. To register a webhook you should email us to support@igms.com and provide the following information:

  • Client ID of your iGMS API Application
  • Webhook type (Calendar data change, Booking change, Guest data change, or Properties change)
  • a URL (or URLs) to send requests to. You may provide different URLs for different types of webhooks
  • (optional) a shared secret if you want webhook requests to be signed — see the Authentication section

Authentication (optional)

If you provided a shared secret when registering your webhook, every request iGMS sends will include the following headers:

HeaderDescription
X-iGMS-Webhook-IdUnique identifier of the webhook delivery. Useful for deduplication.
X-iGMS-Webhook-TypeWebhook type, mirrors the type field in the body.
X-iGMS-App-IdClient ID of the iGMS API Application the webhook is registered for. Use it to pick the matching secret or to filter deliveries when the same URL receives webhooks for several applications. Not part of the signed payload.
X-iGMS-TimestampUnix timestamp at which the request was signed.
X-iGMS-SignatureSignature in the form sha256=<hex>, see below.

The signature is computed as:

signature = HMAC_SHA256(secret, timestamp + "." + raw_request_body)

To verify a request, recompute the HMAC using the timestamp from X-iGMS-Timestamp, a dot, and the raw request body, then compare it (constant-time) with the value after sha256= in X-iGMS-Signature. Reject requests whose timestamp is older than a few minutes to prevent replay attacks.

Example (PHP):

$expected = 'sha256=' . hash_hmac('sha256', $_SERVER['HTTP_X_IGMS_TIMESTAMP'] . '.' . file_get_contents('php://input'), $secret);
if (!hash_equals($expected, $_SERVER['HTTP_X_IGMS_SIGNATURE'])) {
    http_response_code(401);
    exit;
}

If you did not provide a secret, only the X-iGMS-Webhook-Id, X-iGMS-Webhook-Type, and X-iGMS-App-Id headers are sent and the request is unsigned.

Webhooks general info

Every webhook request will have the following body schema:

KeyTypeDescription
typestringWebhook type. One of booking_data, calendar_data, guest_data, properties_data, reservation_alteration
dataobject[]Array of webhook data objects

The schema of objects in the data field depends on the webhook type. The response to the webhook request must be 200 OK, other codes would trigger a series of retries with exponential backoff.

List of webhooks

NameDescription
Booking changeNotify about reservation change
Reservation alterationNotify about an Airbnb alteration request created or finalized
Calendar data changeNotify about calendar data change
Guest data changeNotify about guest details change
Properties changeNotify about created\deleted properties
Property calendar control changeNotify a partner pricing-suggestion app about enabling/disabling calendar control for property
Connection revokedNotify about revoking connection
Message edited or unsentNotify about a guest editing or unsending an Airbnb message, or about the files of an Airbnb guest photo message becoming available
Message reactions changedNotify about a change of the reactions on an Airbnb message

Booking change

This webhook is sent when a booking is changed. For this webhook data objects will be in the following format:

KeyTypeDescription
company_uidstringUID of company
booking_uidstringUID of booking
reservation_codestringReservation code
booking_statusstringOne of available booking statuses (see the corresponding filters section)
reservation_typestringregular for a booking, or owner_block for an Owner's Block
platform_typestringOne of available platform types (see the corresponding filters section)
listing_uidstringUID of booked listing
property_uidstringUID of booked property
guest_uidstringUID of guest
host_uidstringUID of host
number_of_guestsintNumber of guests
guests_breakdownobjectGuests breakdown object, present only when a breakdown is available
priceobjectPricing data object
local_checkin_dttmstringLocal checkin datetime in Y-m-d H:i:s format
local_checkout_dttmstringLocal checkout datetime in Y-m-d H:i:s format
created_dttmstringCreation datetime in Y-m-d H:i:s format
updated_dttmstringLast update datetime in Y-m-d H:i:s format
Pricing data
KeyTypeDescription
currencystringCurrency code (3 symbols)
price_basestringNumeric string with fraction
price_extrasstringNumeric string with fraction
price_feestringNumeric string with fraction
price_taxstringNumeric string with fraction
price_totalstringNumeric string with fraction

price_fee is the channel's host fee. On most platforms the channel withholds it, so price_total is the host payout net of price_fee. Vrbo and sometimes Booking.com invoice their host fee to the host after the stay instead of withholding it, so on vrbo bookings price_total is not net of price_fee: it equals price_base + price_extras + price_tax, and price_fee is reported for information.

Guests breakdown

guests_breakdown and each of its keys appear only when iGMS holds a value for that reservation. Treat an absent key as unknown rather than zero. A present 0 is likewise not proof the platform reported zero — some integrations store 0 as a default for a category the platform never sent. The categories do not necessarily sum to number_of_guests, which some platforms count over adults and children only.

KeyTypeDescription
adultsintNumber of adults
childrenintNumber of children
infantsintNumber of infants
petsintNumber of pets

Request body sample

{
    "type": "booking_data",
    "data": [
        {
            "company_uid": "581919935819928467",
            "booking_uid": "DR3RS5S6_airgms_GT0QUEMAKFD400FS",
            "reservation_code": "DR3RS5S6",
            "booking_status": "accepted",
            "reservation_type": "regular",
            "platform_type": "airgms",
            "listing_uid": "GT0QUEMUFT28YBID_airgms_GT0QUEMAKFD400FS",
            "property_uid": "5804533058085162365",
            "guest_uid": "9WO7Y5I9C4WSCKCWG4KKWKWK0_airgms",
            "host_uid": "GT0QUEMAKFD400FS_airgms",
            "number_of_guests": 1,
            "guests_breakdown": {
                "adults": 1,
                "children": 0,
                "infants": 0
            },
            "price": {
                "currency": "USD",
                "price_base": "10.00",
                "price_extras": "0.00",
                "price_fee": "0.00",
                "price_tax": "0.00",
                "price_total": "10.00"
            },
            "local_checkin_dttm": "2021-10-10 13:00:00",
            "local_checkout_dttm": "2021-10-11 11:00:00",
            "created_dttm": "2021-10-06 20:14:10",
            "updated_dttm": "2021-10-06 20:14:15"
        }
    ]
}

Reservation alteration

(Available upon request, with the airbnb-reservations scope) This webhook is sent when a guest or a host creates an Airbnb alteration request, and when the request reaches a final status. For this webhook data objects will be in the following format:

KeyTypeDescription
company_uidstringUID of company
alteration_idstringAirbnb alteration ID. Send it as alteration_id to v2/accept-reservation-alteration or v2/decline-reservation-alteration
reservation_codestringReservation code
booking_uidstringUID of booking
statusstringOne of pending, accepted, declined, canceled, expired
initiated_bystringOne of guest, host, admin
checkin_datestringCheckin date requested by the alteration, in Y-m-d format
checkout_datestringCheckout date requested by the alteration, in Y-m-d format
guestsintNumber of guests requested by the alteration
pricenumberHost payout for the booking as the alteration changes it, the Payout the iGMS Inbox shows
currencystringCurrency code (3 symbols)
updated_atstringDatetime of the alteration's last update on Airbnb

Every request carries the latest state of the alteration, not a log of changes. Deliveries can arrive more than once or out of order: treat them as idempotent, and keep the one with the latest updated_at for each company_uid and alteration_id.

Request body sample

{
    "type": "reservation_alteration",
    "data": [
        {
            "company_uid": "581919935819928467",
            "alteration_id": "1234567",
            "reservation_code": "HMABCDEFGH",
            "booking_uid": "HMABCDEFGH_airbnb_123456789",
            "status": "pending",
            "initiated_by": "guest",
            "checkin_date": "2026-11-01",
            "checkout_date": "2026-11-05",
            "guests": 3,
            "price": 450.5,
            "currency": "USD",
            "updated_at": "2026-10-10 12:00:00"
        }
    ]
}

Calendar data change

(Available upon request) This webhook is sent when calendar data for a date (or dates) are changed. For this webhook data objects will be in the following format:

KeyTypeDescription
company_uidstringUID of company
listing_uidstringUID of listing
property_uidstringUID of property
datestringCalendar date in Y-m-d format
rate_idstringPlatform rate ID ('0' for the platforms which do not support rates and also for rate agnostic calendar data (e. g. listing availability))
currencystringCurrency code (3 symbols)
pricestringNumeric string with fraction
is_availableintIs listing available (1) or not (0)
min_stayintMinimum nights value
base_pricestringdeprecated
base_min_stayintdeprecated

Request body sample

{
    "type": "calendar_data",
    "data": [
        {
            "company_uid": "581919935819928467",
            "listing_uid": "51477991_airbnb_411957375",
            "date": "2021-10-11",
            "rate_id": "0",
            "currency": "USD",
            "is_available": 1,
            "price": "100.00",
            "min_stay": 2
        }
    ]
}

Guest details change

This webhook is sent when the guest details of one of the future bookings are changed. For this webhook data objects will be in the following format:

KeyTypeDescription
company_uidstringUID of company
guest_uidstringUID of guest
platform_typestringOne of available platform types (see the corresponding filters section)
namestringGuest full name
emailstring[]Array of guest emails
phone_numberstring[]Array of phone numbers

Request body sample

{
    "type": "guest_data",
    "data": [
        {
            "company_uid": "581919935819928467",
            "guest_uid": "EOJTEMLW5IOS4GWWWOGOCOS88_airgms",
            "platform_type": "airgms",
            "name": "Pavel",
            "email": [
                "pavel@example.com"
            ],
            "phone_number": [
                "+79123456789"
            ]
        }
    ]
}

Properties change

This webhook is sent when user's properties list has changed: either a property has been changed or deleted, or a property has been merged into another property, or a new property has been created. For this webhook data objects will be in the following format:

KeyTypeDescription
company_uidstringUID of company
operationstringcreate or delete or update
property_uidstringUID of removed\created property

Request body sample

{
    "type": "properties_data",
    "data": [
        {
            "company_uid": "4674080625695383552",
            "operation": "create",
            "property_uid": "6848864665656201326"
            "name": "Superior Single Room with Sea View",
            "address": "402 W Georgia St, Vancouver, V6B 5A2",
            "checkin_time": "15",
            "checkout_time": "12",
            "beds": 1,
            "bedrooms": 0,
            "bathrooms": 0,
            "is_active": 1,
            "comment": null,
            "clean_hr": 1.5,
            "clean_tm": null,
            "clean_beds_k": 0,
            "clean_beds_q": 1,
            "clean_beds_d": 0,
            "clean_beds_s": 0,
            "clean_specials": null,
            "is_inbox_enabled": 1,
            "are_auto_reviews_enabled": 1,
            "ical_token": null,
            "location": {
            "country_code": "ca",
            "postal_code": "V6B 5A2",
            "lat": 49.279616,
            "lng": -123.1122527,
            "street": "402 W Georgia St",
            "city": "Vancouver"
            },
            "selected_insurance_settings": {
            "future_reservation_coverage": "newlyBookedReservations",
            "content_and_dwelling_amount": 25000,
            "bodily_insurance_amount": 500000,
            "channel_coverage": [
                "airgms"
            ],
            "include_screening_information": true,
            "insurance_company_name": "CompanyName",
            "is_insurance_coverage_active": true
            },
            "listings": [
                "660689604_booking_6606896",
                "GHA78D5I705LYHGA_airgms_4OXKYWD7RB8KSK8GK8K4SS8K0"
            ],
            "door_access_code": null,
            "calendar_control_allowed": false,
            "currency": "CAD"
        }
    ]
}

Property calendar control change

This webhook is sent to a partner pricing-suggestion app when user changes whether that app controls property calendar. Even if control is not allowed, we save received calendar data to be applied if user re-enables the app. For this webhook data objects will be in following format:

KeyTypeDescription
company_uidstringUID of company
property_uidstringUID of property
calendar_control_allowedboolIs app controls property calendar

Request body sample

{
    "type": "property_calendar_control_changed",
    "data": [
        {
            "company_uid": "4674080625695383552",
            "property_uid": "6848864665656201326",
            "calendar_control_allowed": false
        }
    ]
}

Connection revoked

This webhook is sent when user revokes access to app. For this webhook data objects will be in following format:

KeyTypeDescription
company_uidstringUID of company

Request body sample

{
    "type": "connection_revoked",
    "data": [
        {
            "company_uid": "4674080625695383552"
        }
    ]
}

New message received

This webhook is sent when a new message is received in a conversation thread. For this webhook, the data object will be in the following format:

KeyTypeDescription
messageIdstringUnique ID of the message
threadIdstringUnique ID for threads
platformSenderUserIdstringID of the user who sent the message on the platform
senderUidstringComposite identifier combining sender ID and platform type
messageTextstringThe content of the message
messageDttmstringTimestamp of when the message was created
platformMessageDttmstringTimestamp of when the message was sent on the channel
filesarrayList of files attached to the message (if any). An Airbnb photo message can arrive with empty files; its files follow in the message_updated webhook, unless it reached iGMS 24 hours or more after it was sent
messageTypestringOne of guest, host, self_service_request
selfServiceTopicstring or nullPresent only when messageType is self_service_request: the self-service topic of the request, null when the guest picked none
editedAtstring or nullUTC time (Y-m-d H:i:s) the sender last edited an Airbnb message, null when it was never edited or is not from Airbnb
deletedAtstring or nullUTC time (Y-m-d H:i:s) the sender unsent an Airbnb message, null otherwise. An unsent message has an empty messageText and files

A self_service_request is a structured request a Booking.com guest sends through Booking.com's self-service options (check-in time, parking and so on); messageText holds the guest's text.

A self-service request that is already older than one hour when it is received is stored quietly and does not send this webhook.

Each new guest message and self-service request gets its own webhook, whose data list holds that one message, even when the same sync brings several messages of the thread or a newer host message. Webhooks of one thread can arrive out of order. When a conversation is first synced, only its messages from the last hour and its newest message are sent.

Self-service topics
selfServiceTopicLabelNote
checkinCheck-in time
checkoutCheck-out time
change_dates_nrChange datesExtranet only: answer this request in the Booking.com extranet
cancel_bookingCancel booking
booking_basic_waive_feeWaive cancellation feeExtranet only: answer this request in the Booking.com extranet
parkingParking
free_text_parkingParking (free text)
bed_typeBed type
extra_cribExtra crib
extra_bedExtra bed

Other values may appear as Booking.com adds topics.

Request body sample

{
    "type": "new_message",
    "data": [
        {
            "messageId": "msg_123456",
            "threadId" => "13234",
            "platformSenderUserId": "user_456789",
            "senderUid": "user_456789_airbnb",
            "messageText": "Hi, I'm interested in your listing.",
            "messageDttm": "2025-04-15T12:45:30Z",
            "platformMessageDttm": "2025-04-15T12:43:30Z",
            "files": [
                {
                    "url": "https://example.com/image1.jpg",
                    "name": "image1.jpg",
                    "type": "image/jpeg"
                }
            ],
            "messageType": "guest",
            "editedAt": null,
            "deletedAt": null
        }
    ]
}

Request body sample: self-service request

{
    "type": "new_message",
    "data": [
        {
            "messageId": "msg_123457",
            "threadId": "13235",
            "platformSenderUserId": "user_456790",
            "senderUid": "user_456790_booking",
            "messageText": "We will arrive around 10 am, can we check in early?",
            "messageDttm": "2025-04-15T12:50:00Z",
            "platformMessageDttm": "2025-04-15T12:48:00Z",
            "files": [],
            "messageType": "self_service_request",
            "selfServiceTopic": "checkin",
            "editedAt": null,
            "deletedAt": null
        }
    ]
}

Message edited or unsent

This webhook (type message_updated) is sent when an Airbnb guest edits a message or unsends it. Airbnb lets a guest edit a message within 15 minutes and unsend it within 24 hours. The app needs the messaging scope. For this webhook, the data object is the message in the same format as in the New message received webhook, holding the message's current content:

  • after an edit, messageText holds the new text and editedAt is set;
  • after an unsend, messageText is empty, files is empty and deletedAt is set.

It is also sent once the files of an Airbnb guest photo message are available, with files holding them. A photo message that a sync brings in 24 hours or more after it was sent sends nothing.

The message keeps its messageId, so replace the message you already have. It always carries the message's latest content, so edits made in quick succession may arrive as one webhook; a host's own edits do not send it.

Request body sample

{
    "type": "message_updated",
    "data": [
        {
            "messageId": "msg_123456",
            "threadId": "13234",
            "platformSenderUserId": "user_456789",
            "senderUid": "user_456789_airbnb",
            "messageText": "",
            "messageDttm": "2025-04-15 12:45:30",
            "platformMessageDttm": "2025-04-15 12:43:30",
            "files": [],
            "messageType": "guest",
            "editedAt": null,
            "deletedAt": "2025-04-15 13:02:11"
        }
    ]
}

Message reactions changed

This webhook is sent when Airbnb reports a change of the reactions on a message in an Airbnb thread, whether the host or the guest reacted. It comes with the messaging scope. For this webhook, the data object will be in the following format:

KeyTypeDescription
messageIdintID of the message, as messageId in get-threads
threadIdintID of the thread, as threadId in get-threads
reactionsobject[]Every reaction now on the message, in the format of reactions in get-threads: emoji, reactionCreatorUid, updatedDttm

Each event carries the full current list of reactions on the message, so an event may repeat a list that has not changed. When the last reaction is removed, reactions is an empty array.

Request body sample

{
    "type": "message_reactions_changed",
    "data": [
        {
            "messageId": 1409176420,
            "threadId": 1033512,
            "reactions": [
                {
                    "emoji": "❤️",
                    "reactionCreatorUid": "123456789_airbnb",
                    "updatedDttm": "2024-11-20 10:35:12"
                }
            ]
        }
    ]
}