/** * Webhooks-related types */ // ===================== // Webhook Payload Types // ===================== /** * Base webhook payload with common fields */ export interface WebhookPayloadBase { /** The type of webhook event */ event: string; /** ISO 8601 timestamp of the event */ timestamp: string; } /** * Reservation created webhook payload */ export interface ReservationCreatedPayload extends WebhookPayloadBase { event: 'reservation_created'; /** Hostex reservation code */ reservation_code: string; /** Hostex stay code */ stay_code: string; } /** * Sub-event types for reservation_updated */ export type ReservationUpdatedSubEvent = | 'arrival_and_departure_time_updated' | 'rates_updated' | 'lock_code_updated' | 'lock_code_deleted' | 'check_in_details_updated'; /** * Reservation updated webhook payload */ export interface ReservationUpdatedPayload extends WebhookPayloadBase { event: 'reservation_updated'; /** Hostex reservation code */ reservation_code: string; /** Hostex stay code */ stay_code: string; /** Optional sub-event type */ sub_event?: ReservationUpdatedSubEvent; } /** * Property availability entry */ export interface AvailabilityEntry { /** Date in YYYY-MM-DD format */ date: string; /** Whether the property is available */ available: boolean; } /** * Property availability updated webhook payload */ export interface PropertyAvailabilityUpdatedPayload extends WebhookPayloadBase { event: 'property_availability_updated'; /** Hostex property ID */ property_id: number; /** List of availability entries */ availabilities: AvailabilityEntry[]; } /** * Listing calendar updated webhook payload */ export interface ListingCalendarUpdatedPayload extends WebhookPayloadBase { event: 'listing_calendar_updated'; /** Channel type (e.g., 'airbnb', 'booking') */ channel_type: string; /** Listing ID on the channel */ listing_id: string; /** Start date in YYYY-MM-DD format */ start_date: string; /** End date in YYYY-MM-DD format */ end_date: string; } /** * Message created webhook payload */ export interface MessageCreatedPayload extends WebhookPayloadBase { event: 'message_created'; /** Conversation ID */ conversation_id: string; /** Message ID */ message_id: string; } /** * Review created webhook payload */ export interface ReviewCreatedPayload extends WebhookPayloadBase { event: 'review_created'; /** Hostex reservation code */ reservation_code: string; /** Hostex stay code */ stay_code: string; } /** * Review updated webhook payload */ export interface ReviewUpdatedPayload extends WebhookPayloadBase { event: 'review_updated'; /** Hostex reservation code */ reservation_code: string; /** Hostex stay code */ stay_code: string; } /** * Union type of all webhook payloads */ export type WebhookPayload = | ReservationCreatedPayload | ReservationUpdatedPayload | PropertyAvailabilityUpdatedPayload | ListingCalendarUpdatedPayload | MessageCreatedPayload | ReviewCreatedPayload | ReviewUpdatedPayload; /** * All possible webhook event types */ export type WebhookEventType = WebhookPayload['event']; // ===================== // Webhook Management Types // ===================== /** * Webhook information */ export interface Webhook { /** Unique webhook ID */ id: number; /** Webhook URL */ url: string; /** The list of event types this webhook subscribes to */ events: WebhookEventType[]; /** Whether the webhook can be managed (deleted) */ manageable: boolean; /** When the webhook was created (ISO 8601) */ created_at: string; } /** * Webhooks response data */ export interface WebhooksData { /** List of webhooks */ webhooks: Webhook[]; } /** * Create webhook parameters */ export interface CreateWebhookParams { /** Webhook URL */ url: string; /** The list of event types to subscribe to; defaults to all events if omitted */ events?: WebhookEventType[]; } /** * Update webhook parameters */ export interface UpdateWebhookParams { /** Webhook ID */ id: string; /** New webhook URL */ url?: string; /** Event types to subscribe to */ events?: WebhookEventType[]; } /** * Delete webhook parameters */ export interface DeleteWebhookParams { /** Webhook ID */ id: string; }