repull 0.2.27 → 0.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/repull/api/airbnb_api.rb +1 -1
- data/lib/repull/api/atlas_api.rb +1 -1
- data/lib/repull/api/availability_api.rb +1 -1
- data/lib/repull/api/billing_api.rb +1 -1
- data/lib/repull/api/booking_com_api.rb +1 -1
- data/lib/repull/api/connect_api.rb +201 -1
- data/lib/repull/api/connections_api.rb +1 -1
- data/lib/repull/api/conversations_api.rb +3 -3
- data/lib/repull/api/guests_api.rb +84 -3
- data/lib/repull/api/health_api.rb +1 -1
- data/lib/repull/api/kv_api.rb +1 -1
- data/lib/repull/api/listings_api.rb +3 -3
- data/lib/repull/api/markets_api.rb +1 -1
- data/lib/repull/api/migrate_api.rb +1 -1
- data/lib/repull/api/plumguide_api.rb +1 -1
- data/lib/repull/api/pricing_api.rb +1 -1
- data/lib/repull/api/properties_api.rb +1 -1
- data/lib/repull/api/quotes_api.rb +1 -1
- data/lib/repull/api/reservations_api.rb +7 -7
- data/lib/repull/api/reviews_api.rb +3 -3
- data/lib/repull/api/schema_api.rb +1 -1
- data/lib/repull/api/system_api.rb +1 -1
- data/lib/repull/api/vrbo_api.rb +1 -1
- data/lib/repull/api/webhooks_api.rb +1 -1
- data/lib/repull/api_client.rb +1 -1
- data/lib/repull/api_error.rb +1 -1
- data/lib/repull/api_model_base.rb +1 -1
- data/lib/repull/configuration.rb +1 -1
- data/lib/repull/models/accept_reservation_request200_response.rb +1 -1
- data/lib/repull/models/account_created_event.rb +1 -1
- data/lib/repull/models/account_created_payload.rb +1 -1
- data/lib/repull/models/account_disconnected_event.rb +1 -1
- data/lib/repull/models/account_disconnected_payload.rb +1 -1
- data/lib/repull/models/acknowledge_booking_reservations_request.rb +1 -1
- data/lib/repull/models/ai_operation.rb +1 -1
- data/lib/repull/models/ai_operation_completed_event.rb +1 -1
- data/lib/repull/models/ai_operation_completed_payload.rb +1 -1
- data/lib/repull/models/ai_operation_failed_event.rb +1 -1
- data/lib/repull/models/ai_operation_failed_payload.rb +1 -1
- data/lib/repull/models/ai_operation_failed_payload_error.rb +1 -1
- data/lib/repull/models/airbnb_account_freshness.rb +1 -1
- data/lib/repull/models/airbnb_alteration.rb +1 -1
- data/lib/repull/models/airbnb_alteration_create_request.rb +1 -1
- data/lib/repull/models/airbnb_amenity.rb +1 -1
- data/lib/repull/models/airbnb_availability_write_request.rb +1 -1
- data/lib/repull/models/airbnb_calendar_operation.rb +1 -1
- data/lib/repull/models/airbnb_connection.rb +1 -1
- data/lib/repull/models/airbnb_connection_accessibility_amenities_inner.rb +1 -1
- data/lib/repull/models/airbnb_connection_amenities_inner.rb +1 -1
- data/lib/repull/models/airbnb_connection_host.rb +1 -1
- data/lib/repull/models/airbnb_connection_response.rb +1 -1
- data/lib/repull/models/airbnb_connection_summary.rb +1 -1
- data/lib/repull/models/airbnb_content_write_response.rb +1 -1
- data/lib/repull/models/airbnb_data_freshness.rb +1 -1
- data/lib/repull/models/airbnb_description_write_request.rb +1 -1
- data/lib/repull/models/airbnb_description_write_request_description.rb +1 -1
- data/lib/repull/models/airbnb_host_review_submit.rb +1 -1
- data/lib/repull/models/airbnb_host_review_submit_category_ratings_inner.rb +1 -1
- data/lib/repull/models/airbnb_listing.rb +1 -1
- data/lib/repull/models/airbnb_listing_action200_response.rb +1 -1
- data/lib/repull/models/airbnb_listing_action200_response_one_of.rb +1 -1
- data/lib/repull/models/airbnb_listing_action200_response_one_of1.rb +1 -1
- data/lib/repull/models/airbnb_listing_action_request.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_response.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request_check_in_option.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request_quiet_hours_inner.rb +1 -1
- data/lib/repull/models/airbnb_listing_lifecycle_response.rb +1 -1
- data/lib/repull/models/airbnb_listing_list_response.rb +1 -1
- data/lib/repull/models/airbnb_permits_response.rb +1 -1
- data/lib/repull/models/airbnb_permits_response_cached_inner.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request_permits_inner.rb +1 -1
- data/lib/repull/models/airbnb_photo_position.rb +1 -1
- data/lib/repull/models/airbnb_pricing_write_request.rb +1 -1
- data/lib/repull/models/airbnb_pricing_write_request_fees_inner.rb +1 -1
- data/lib/repull/models/airbnb_pricing_write_request_records_inner.rb +1 -1
- data/lib/repull/models/airbnb_publish_result.rb +1 -1
- data/lib/repull/models/airbnb_reservation.rb +1 -1
- data/lib/repull/models/airbnb_reservation_action200_response.rb +1 -1
- data/lib/repull/models/airbnb_reservation_action_request.rb +1 -1
- data/lib/repull/models/airbnb_reservation_list_response.rb +1 -1
- data/lib/repull/models/airbnb_review.rb +1 -1
- data/lib/repull/models/airbnb_review_list_response.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosure.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosures_response.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosures_write_request.rb +1 -1
- data/lib/repull/models/airbnb_thread.rb +1 -1
- data/lib/repull/models/airbnb_thread_list_response.rb +1 -1
- data/lib/repull/models/airbnb_transaction.rb +1 -1
- data/lib/repull/models/airbnb_transaction_fees.rb +1 -1
- data/lib/repull/models/airbnb_transaction_payout.rb +1 -1
- data/lib/repull/models/alteration_change.rb +1 -1
- data/lib/repull/models/alteration_webhook_object.rb +1 -1
- data/lib/repull/models/apply_connection_mappings200_response.rb +1 -1
- data/lib/repull/models/apply_connection_mappings200_response_results_inner.rb +1 -1
- data/lib/repull/models/apply_connection_mappings_request.rb +1 -1
- data/lib/repull/models/apply_connection_mappings_request_mappings_inner.rb +1 -1
- data/lib/repull/models/auto_map_connection_units200_response.rb +1 -1
- data/lib/repull/models/auto_map_connection_units_request.rb +1 -1
- data/lib/repull/models/availability_batch_write_request.rb +1 -1
- data/lib/repull/models/availability_write_request.rb +1 -1
- data/lib/repull/models/availability_write_result.rb +1 -1
- data/lib/repull/models/availability_write_result_synced.rb +1 -1
- data/lib/repull/models/availability_write_settings.rb +1 -1
- data/lib/repull/models/booking_availability_state_response.rb +1 -1
- data/lib/repull/models/booking_availability_update.rb +1 -1
- data/lib/repull/models/booking_availability_update_date_range.rb +1 -1
- data/lib/repull/models/booking_availability_update_request.rb +1 -1
- data/lib/repull/models/booking_availability_update_request_property_id.rb +1 -1
- data/lib/repull/models/booking_availability_update_request_updates_inner.rb +1 -1
- data/lib/repull/models/booking_connect_listing_option.rb +1 -1
- data/lib/repull/models/booking_connect_room.rb +1 -1
- data/lib/repull/models/booking_connect_rooms_response.rb +1 -1
- data/lib/repull/models/booking_conversation.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_date_range.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_restrictions.rb +1 -1
- data/lib/repull/models/booking_pricing_response.rb +1 -1
- data/lib/repull/models/booking_pricing_update_request.rb +1 -1
- data/lib/repull/models/booking_pricing_update_response.rb +1 -1
- data/lib/repull/models/booking_property.rb +1 -1
- data/lib/repull/models/booking_property_action_request.rb +1 -1
- data/lib/repull/models/booking_property_action_response.rb +1 -1
- data/lib/repull/models/booking_property_listings_inner.rb +1 -1
- data/lib/repull/models/booking_publish_result.rb +1 -1
- data/lib/repull/models/booking_publish_section_error.rb +1 -1
- data/lib/repull/models/booking_rate_write_occupancy.rb +1 -1
- data/lib/repull/models/booking_rate_write_price_half.rb +1 -1
- data/lib/repull/models/booking_rate_write_restriction_half.rb +1 -1
- data/lib/repull/models/booking_rate_write_verification.rb +1 -1
- data/lib/repull/models/booking_rate_write_verification_row.rb +1 -1
- data/lib/repull/models/booking_reservation.rb +1 -1
- data/lib/repull/models/booking_reservation_room.rb +1 -1
- data/lib/repull/models/booking_restriction_request_row.rb +1 -1
- data/lib/repull/models/booking_restriction_verification.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row_booking_value.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row_expected.rb +1 -1
- data/lib/repull/models/booking_room_mapping.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response_rooms_inner.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response_rooms_inner_rates_inner.rb +1 -1
- data/lib/repull/models/booking_setup_request.rb +1 -1
- data/lib/repull/models/booking_setup_request_legal_entity.rb +1 -1
- data/lib/repull/models/booking_upstream_failure.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_request.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_response.rb +1 -1
- data/lib/repull/models/bulk_pricing_failure.rb +1 -1
- data/lib/repull/models/bulk_pricing_item.rb +1 -1
- data/lib/repull/models/bulk_pricing_request.rb +1 -1
- data/lib/repull/models/bulk_pricing_response.rb +1 -1
- data/lib/repull/models/calendar_day.rb +1 -1
- data/lib/repull/models/calendar_response.rb +1 -1
- data/lib/repull/models/calendar_updated_event.rb +1 -1
- data/lib/repull/models/calendar_updated_payload.rb +1 -1
- data/lib/repull/models/calendar_updated_payload_range.rb +1 -1
- data/lib/repull/models/cancel_reservation200_response.rb +1 -1
- data/lib/repull/models/cancel_reservation_request.rb +1 -1
- data/lib/repull/models/channel_market_state_item.rb +1 -1
- data/lib/repull/models/check_migration_cutover200_response.rb +1 -1
- data/lib/repull/models/check_migration_cutover_request.rb +1 -1
- data/lib/repull/models/check_migration_cutover_request_reservations_inner.rb +1 -1
- data/lib/repull/models/clear_kv200_response.rb +1 -1
- data/lib/repull/models/connect_host.rb +1 -1
- data/lib/repull/models/connect_provider.rb +1 -1
- data/lib/repull/models/connect_provider_list_response.rb +1 -1
- data/lib/repull/models/connect_session.rb +1 -1
- data/lib/repull/models/connect_session_completed_event.rb +1 -1
- data/lib/repull/models/connect_session_completed_payload.rb +1 -1
- data/lib/repull/models/connect_status.rb +1 -1
- data/lib/repull/models/connect_status_accounts_inner.rb +1 -1
- data/lib/repull/models/connect_status_capabilities.rb +15 -6
- data/lib/repull/models/connection.rb +1 -1
- data/lib/repull/models/connection_action.rb +1 -1
- data/lib/repull/models/connection_list_response.rb +1 -1
- data/lib/repull/models/conversation.rb +1 -1
- data/lib/repull/models/conversation_capabilities.rb +1 -1
- data/lib/repull/models/conversation_detail.rb +1 -1
- data/lib/repull/models/conversation_guest.rb +1 -1
- data/lib/repull/models/conversation_guest_contact.rb +1 -1
- data/lib/repull/models/conversation_host.rb +1 -1
- data/lib/repull/models/conversation_list_response.rb +1 -1
- data/lib/repull/models/conversation_message_attachment.rb +1 -1
- data/lib/repull/models/create_airbnb_listing_room_request.rb +1 -1
- data/lib/repull/models/create_airbnb_offer_request.rb +1 -1
- data/lib/repull/models/create_airbnb_offer_request_guest_details.rb +1 -1
- data/lib/repull/models/create_billing_checkout_request.rb +1 -1
- data/lib/repull/models/create_booking_webhook_request.rb +1 -1
- data/lib/repull/models/create_connect_session_request.rb +1 -1
- data/lib/repull/models/create_connect_session_request_copy.rb +1 -1
- data/lib/repull/models/create_connect_session_request_workspace.rb +1 -1
- data/lib/repull/models/create_connection_request.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response_fees_inner.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response_guests.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response_lines_inner.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request_fees_inner.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request_guests.rb +1 -1
- data/lib/repull/models/create_webhook_request.rb +1 -1
- data/lib/repull/models/custom_schema.rb +1 -1
- data/lib/repull/models/custom_schema_create.rb +1 -1
- data/lib/repull/models/custom_schema_create_response.rb +1 -1
- data/lib/repull/models/custom_schema_delete_response.rb +1 -1
- data/lib/repull/models/custom_schema_list_response.rb +1 -1
- data/lib/repull/models/custom_schema_summary.rb +1 -1
- data/lib/repull/models/custom_schema_update.rb +1 -1
- data/lib/repull/models/decline_reservation_request_request.rb +1 -1
- data/lib/repull/models/delete_airbnb_listing_photo200_response.rb +1 -1
- data/lib/repull/models/delete_airbnb_listing_room200_response.rb +1 -1
- data/lib/repull/models/delete_connection200_response.rb +1 -1
- data/lib/repull/models/delete_kv200_response.rb +1 -1
- data/lib/repull/models/delete_migration200_response.rb +1 -1
- data/lib/repull/models/delete_migration200_response_data.rb +1 -1
- data/lib/repull/models/error.rb +1 -1
- data/lib/repull/models/error_error.rb +1 -1
- data/lib/repull/models/error_error_listings_inner.rb +1 -1
- data/lib/repull/models/error_error_support.rb +1 -1
- data/lib/repull/models/get_airbnb_alteration200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_advance_notice.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_booking_window.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation_non_refundable.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in_start.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_out.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_instant_book.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_preparation_time.rb +1 -1
- data/lib/repull/models/get_airbnb_checkin_guide200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_details200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_quality200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_settings200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_offer200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_thread200_response.rb +1 -1
- data/lib/repull/models/get_booking_extranet_login_config200_response.rb +1 -1
- data/lib/repull/models/get_booking_extranet_login_status200_response.rb +1 -1
- data/lib/repull/models/get_channel_health200_response.rb +1 -1
- data/lib/repull/models/get_channel_health200_response_vrbo.rb +1 -1
- data/lib/repull/models/get_connect_write_policy200_response.rb +1 -1
- data/lib/repull/models/get_health200_response.rb +1 -1
- data/lib/repull/models/get_listing_calendar_sync200_response.rb +1 -1
- data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner.rb +1 -1
- data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_problems_inner.rb +1 -1
- data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_queue.rb +1 -1
- data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_queue_last_push.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response_airbnb_inner.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response_booking_inner.rb +1 -1
- data/lib/repull/models/get_migration200_response.rb +1 -1
- data/lib/repull/models/get_migration_channel_map200_response.rb +1 -1
- data/lib/repull/models/get_migration_report200_response.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response_data_inner.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response_pagination.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_breakdown_inner.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_limits.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_remaining.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_status_distribution.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_timeline_inner.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_totals.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_used.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_limits.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_remaining.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_used.rb +1 -1
- data/lib/repull/models/guest.rb +1 -1
- data/lib/repull/models/guest_contact.rb +1 -1
- data/lib/repull/models/guest_create_request.rb +15 -5
- data/lib/repull/models/guest_create_response.rb +16 -6
- data/lib/repull/models/guest_create_response_pms.rb +158 -0
- data/lib/repull/models/guest_flag.rb +1 -1
- data/lib/repull/models/guest_list_response.rb +1 -1
- data/lib/repull/models/guest_note.rb +1 -1
- data/lib/repull/models/guest_profile.rb +1 -1
- data/lib/repull/models/guest_reservations_summary.rb +1 -1
- data/lib/repull/models/guest_update_request.rb +205 -0
- data/lib/repull/models/guest_update_response.rb +209 -0
- data/lib/repull/models/{guest_create_response_contacts_inner.rb → guest_update_response_contacts_inner.rb} +4 -4
- data/lib/repull/models/guest_update_response_pms_inner.rb +158 -0
- data/lib/repull/models/inquiry_created_event.rb +1 -1
- data/lib/repull/models/inquiry_created_payload.rb +1 -1
- data/lib/repull/models/inquiry_updated_event.rb +1 -1
- data/lib/repull/models/inquiry_updated_payload.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object_expected_payout.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object_guests.rb +1 -1
- data/lib/repull/models/invite_booking_extranet_user200_response.rb +1 -1
- data/lib/repull/models/invite_booking_extranet_user_request.rb +1 -1
- data/lib/repull/models/list_airbnb_alterations200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_amenities200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_amenities200_response_data.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_permits200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_safety_disclosures200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response_pagination.rb +1 -1
- data/lib/repull/models/list_airbnb_transactions200_response.rb +1 -1
- data/lib/repull/models/list_booking_reservations200_response.rb +1 -1
- data/lib/repull/models/list_connection_units200_response.rb +1 -1
- data/lib/repull/models/list_connection_units200_response_listing_options_inner.rb +1 -1
- data/lib/repull/models/list_connection_units200_response_units_inner.rb +1 -1
- data/lib/repull/models/list_inquiries200_response.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner_expected_payout.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner_guests.rb +1 -1
- data/lib/repull/models/list_kv200_response.rb +1 -1
- data/lib/repull/models/list_kv200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_kv200_response_pagination.rb +1 -1
- data/lib/repull/models/list_listing_units200_response.rb +1 -1
- data/lib/repull/models/list_listing_units200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_migrations200_response.rb +1 -1
- data/lib/repull/models/listing.rb +1 -1
- data/lib/repull/models/listing_active_request.rb +1 -1
- data/lib/repull/models/listing_active_response.rb +1 -1
- data/lib/repull/models/listing_address.rb +1 -1
- data/lib/repull/models/listing_address_readiness.rb +1 -1
- data/lib/repull/models/listing_amenity.rb +1 -1
- data/lib/repull/models/listing_capabilities.rb +15 -6
- data/lib/repull/models/listing_channel.rb +1 -1
- data/lib/repull/models/listing_comp.rb +1 -1
- data/lib/repull/models/listing_comp_nightly.rb +1 -1
- data/lib/repull/models/listing_comp_ratings.rb +1 -1
- data/lib/repull/models/listing_comps_response.rb +1 -1
- data/lib/repull/models/listing_content.rb +1 -1
- data/lib/repull/models/listing_content_update_request.rb +1 -1
- data/lib/repull/models/listing_content_update_request_address.rb +1 -1
- data/lib/repull/models/listing_content_update_request_amenities.rb +1 -1
- data/lib/repull/models/listing_content_update_request_amenities_one_of_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_checkout_tasks_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_details.rb +1 -1
- data/lib/repull/models/listing_content_update_request_occupancy.rb +1 -1
- data/lib/repull/models/listing_content_update_request_photos_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_photos_inner_one_of.rb +1 -1
- data/lib/repull/models/listing_content_update_request_policies.rb +1 -1
- data/lib/repull/models/listing_content_update_request_pricing.rb +1 -1
- data/lib/repull/models/listing_content_update_request_rooms_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_rooms_inner_beds_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_response.rb +16 -6
- data/lib/repull/models/listing_content_update_response_pms.rb +172 -0
- data/lib/repull/models/listing_content_update_response_pms_errors_inner.rb +199 -0
- data/lib/repull/models/listing_create_request.rb +1 -1
- data/lib/repull/models/listing_create_response.rb +1 -1
- data/lib/repull/models/listing_created_event.rb +1 -1
- data/lib/repull/models/listing_created_payload.rb +1 -1
- data/lib/repull/models/listing_created_payload_address.rb +1 -1
- data/lib/repull/models/listing_deleted_event.rb +1 -1
- data/lib/repull/models/listing_deleted_payload.rb +1 -1
- data/lib/repull/models/listing_details.rb +1 -1
- data/lib/repull/models/listing_generate_content_request.rb +1 -1
- data/lib/repull/models/listing_generate_content_response.rb +1 -1
- data/lib/repull/models/listing_list_response.rb +1 -1
- data/lib/repull/models/listing_market_state_request.rb +1 -1
- data/lib/repull/models/listing_market_state_response.rb +1 -1
- data/lib/repull/models/listing_photo.rb +1 -1
- data/lib/repull/models/listing_photo_delete_request.rb +1 -1
- data/lib/repull/models/listing_photo_delete_response.rb +1 -1
- data/lib/repull/models/listing_photo_upload_url_request.rb +1 -1
- data/lib/repull/models/listing_photo_upload_url_response.rb +1 -1
- data/lib/repull/models/listing_photos_response.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_request.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_response.rb +1 -1
- data/lib/repull/models/listing_pricing_history_entry.rb +1 -1
- data/lib/repull/models/listing_pricing_history_response.rb +1 -1
- data/lib/repull/models/listing_pricing_recommendation.rb +1 -1
- data/lib/repull/models/listing_pricing_response.rb +1 -1
- data/lib/repull/models/listing_pricing_response_comp_summary.rb +1 -1
- data/lib/repull/models/listing_pricing_response_date_range.rb +1 -1
- data/lib/repull/models/listing_pricing_response_listing.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy_input.rb +1 -1
- data/lib/repull/models/listing_publish_airbnb_request.rb +1 -1
- data/lib/repull/models/listing_publish_airbnb_response.rb +1 -1
- data/lib/repull/models/listing_publish_booking_request.rb +1 -1
- data/lib/repull/models/listing_publish_booking_response.rb +1 -1
- data/lib/repull/models/listing_publish_status_channel.rb +1 -1
- data/lib/repull/models/listing_publish_status_connection.rb +1 -1
- data/lib/repull/models/listing_publish_status_response.rb +1 -1
- data/lib/repull/models/listing_pull_airbnb_request.rb +1 -1
- data/lib/repull/models/listing_pull_response.rb +1 -1
- data/lib/repull/models/listing_quality_tier.rb +1 -1
- data/lib/repull/models/listing_reactivated_event.rb +1 -1
- data/lib/repull/models/listing_segment.rb +1 -1
- data/lib/repull/models/listing_segment_recommendation.rb +1 -1
- data/lib/repull/models/listing_segments_response.rb +1 -1
- data/lib/repull/models/listing_segments_response_scope.rb +1 -1
- data/lib/repull/models/listing_status_batch_request.rb +1 -1
- data/lib/repull/models/listing_status_batch_response.rb +1 -1
- data/lib/repull/models/listing_suspended_event.rb +1 -1
- data/lib/repull/models/listing_suspension_payload.rb +1 -1
- data/lib/repull/models/listing_units_inner.rb +1 -1
- data/lib/repull/models/listing_updated_event.rb +1 -1
- data/lib/repull/models/listing_updated_payload.rb +1 -1
- data/lib/repull/models/listing_webhook_object.rb +1 -1
- data/lib/repull/models/listing_webhook_object_address.rb +1 -1
- data/lib/repull/models/listing_webhook_object_channels_inner.rb +1 -1
- data/lib/repull/models/map_airbnb_listing_request.rb +1 -1
- data/lib/repull/models/map_airbnb_listing_response.rb +1 -1
- data/lib/repull/models/map_booking_room_request.rb +1 -1
- data/lib/repull/models/map_booking_room_response.rb +1 -1
- data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
- data/lib/repull/models/map_connect_booking_rooms_response.rb +1 -1
- data/lib/repull/models/market_browse_category.rb +1 -1
- data/lib/repull/models/market_browse_entry.rb +1 -1
- data/lib/repull/models/market_browse_featured.rb +1 -1
- data/lib/repull/models/market_browse_response.rb +1 -1
- data/lib/repull/models/market_calendar_day.rb +1 -1
- data/lib/repull/models/market_calendar_day_events_inner.rb +1 -1
- data/lib/repull/models/market_calendar_response.rb +1 -1
- data/lib/repull/models/market_detail_response.rb +1 -1
- data/lib/repull/models/market_detail_response_price_distribution_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_property_type_mix_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_supply_trend_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_top_comps.rb +1 -1
- data/lib/repull/models/market_event.rb +1 -1
- data/lib/repull/models/market_my_listing.rb +1 -1
- data/lib/repull/models/market_summary.rb +1 -1
- data/lib/repull/models/market_top_comp.rb +1 -1
- data/lib/repull/models/markets_overview_response.rb +1 -1
- data/lib/repull/models/markets_overview_response_browse.rb +1 -1
- data/lib/repull/models/markets_overview_response_subscriptions.rb +1 -1
- data/lib/repull/models/markets_overview_response_totals.rb +1 -1
- data/lib/repull/models/message.rb +1 -1
- data/lib/repull/models/message_list_response.rb +1 -1
- data/lib/repull/models/migration.rb +1 -1
- data/lib/repull/models/migration_channel_map.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner_airbnb.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner_booking.rb +1 -1
- data/lib/repull/models/migration_channel_map_sources_inner.rb +1 -1
- data/lib/repull/models/migration_completed_event.rb +1 -1
- data/lib/repull/models/migration_connections_inner.rb +1 -1
- data/lib/repull/models/migration_counts.rb +1 -1
- data/lib/repull/models/migration_cutover_check.rb +1 -1
- data/lib/repull/models/migration_cutover_check_mismatched_inner.rb +1 -1
- data/lib/repull/models/migration_failed_event.rb +1 -1
- data/lib/repull/models/migration_import_payload.rb +1 -1
- data/lib/repull/models/migration_import_payload_results_inner.rb +1 -1
- data/lib/repull/models/migration_import_run.rb +1 -1
- data/lib/repull/models/migration_import_run_results_inner.rb +1 -1
- data/lib/repull/models/migration_report.rb +1 -1
- data/lib/repull/models/migration_report_issues_inner.rb +1 -1
- data/lib/repull/models/migration_reservation_ref.rb +1 -1
- data/lib/repull/models/pagination.rb +1 -1
- data/lib/repull/models/payment_completed_event.rb +1 -1
- data/lib/repull/models/payment_completed_payload.rb +1 -1
- data/lib/repull/models/payment_refunded_event.rb +1 -1
- data/lib/repull/models/payment_refunded_payload.rb +1 -1
- data/lib/repull/models/payment_webhook_object.rb +1 -1
- data/lib/repull/models/payout_completed_event.rb +1 -1
- data/lib/repull/models/payout_completed_payload.rb +1 -1
- data/lib/repull/models/plan_notice.rb +1 -1
- data/lib/repull/models/plumguide_listing.rb +1 -1
- data/lib/repull/models/plumguide_listing_list_response.rb +1 -1
- data/lib/repull/models/pms_capabilities.rb +242 -0
- data/lib/repull/models/pms_capabilities_calendar.rb +148 -0
- data/lib/repull/models/pms_capabilities_conversations.rb +167 -0
- data/lib/repull/models/pms_capabilities_guests.rb +158 -0
- data/lib/repull/models/pms_capabilities_listings.rb +238 -0
- data/lib/repull/models/pms_capabilities_payments.rb +148 -0
- data/lib/repull/models/pms_capabilities_reservations.rb +158 -0
- data/lib/repull/models/pms_capabilities_reviews.rb +158 -0
- data/lib/repull/models/pms_capabilities_tasks.rb +156 -0
- data/lib/repull/models/pms_write_policy.rb +1 -1
- data/lib/repull/models/pms_write_policy_calendar.rb +1 -1
- data/lib/repull/models/pms_write_policy_reservations.rb +1 -1
- data/lib/repull/models/preapprove_conversation201_response.rb +1 -1
- data/lib/repull/models/preapprove_conversation_request.rb +1 -1
- data/lib/repull/models/preview_conversation_special_offer_request.rb +1 -1
- data/lib/repull/models/preview_conversation_special_offer_request_fees_inner.rb +1 -1
- data/lib/repull/models/preview_conversation_special_offer_request_guests.rb +1 -1
- data/lib/repull/models/property.rb +1 -1
- data/lib/repull/models/property_availability.rb +1 -1
- data/lib/repull/models/property_availability_coverage.rb +1 -1
- data/lib/repull/models/property_availability_day.rb +1 -1
- data/lib/repull/models/property_list_response.rb +1 -1
- data/lib/repull/models/publish_section_error.rb +1 -1
- data/lib/repull/models/quote.rb +1 -1
- data/lib/repull/models/quote_pricing.rb +1 -1
- data/lib/repull/models/recheck_booking_extranet_login200_response.rb +178 -0
- data/lib/repull/models/recheck_booking_extranet_login_request.rb +192 -0
- data/lib/repull/models/record_account.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos200_response.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos200_response_data.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos_request.rb +1 -1
- data/lib/repull/models/replay_webhook_delivery_request.rb +1 -1
- data/lib/repull/models/reply_booking_review200_response.rb +1 -1
- data/lib/repull/models/reply_booking_review_request.rb +1 -1
- data/lib/repull/models/reply_to_review201_response.rb +13 -2
- data/lib/repull/models/reply_to_review_request.rb +1 -1
- data/lib/repull/models/repull_ping_event.rb +1 -1
- data/lib/repull/models/repull_ping_payload.rb +1 -1
- data/lib/repull/models/reservation.rb +1 -1
- data/lib/repull/models/reservation_alteration_created_event.rb +1 -1
- data/lib/repull/models/reservation_alteration_created_payload.rb +1 -1
- data/lib/repull/models/reservation_alteration_responded_event.rb +1 -1
- data/lib/repull/models/reservation_alteration_responded_payload.rb +1 -1
- data/lib/repull/models/reservation_cancelled_event.rb +1 -1
- data/lib/repull/models/reservation_cancelled_payload.rb +1 -1
- data/lib/repull/models/reservation_capabilities.rb +1 -1
- data/lib/repull/models/reservation_create_request.rb +1 -1
- data/lib/repull/models/reservation_create_response.rb +1 -1
- data/lib/repull/models/reservation_create_response_unit.rb +1 -1
- data/lib/repull/models/reservation_created_event.rb +1 -1
- data/lib/repull/models/reservation_created_payload.rb +1 -1
- data/lib/repull/models/reservation_financials.rb +1 -1
- data/lib/repull/models/reservation_guest_financials.rb +1 -1
- data/lib/repull/models/reservation_guest_input.rb +1 -1
- data/lib/repull/models/reservation_host_financials.rb +1 -1
- data/lib/repull/models/reservation_list_response.rb +1 -1
- data/lib/repull/models/reservation_message_received_event.rb +1 -1
- data/lib/repull/models/reservation_message_received_payload.rb +1 -1
- data/lib/repull/models/reservation_message_received_payload_from.rb +1 -1
- data/lib/repull/models/reservation_message_sent_event.rb +1 -1
- data/lib/repull/models/reservation_message_sent_payload.rb +1 -1
- data/lib/repull/models/reservation_message_sent_payload_from.rb +1 -1
- data/lib/repull/models/reservation_message_updated_event.rb +1 -1
- data/lib/repull/models/reservation_message_updated_payload.rb +1 -1
- data/lib/repull/models/reservation_message_updated_payload_from.rb +1 -1
- data/lib/repull/models/reservation_money_line.rb +1 -1
- data/lib/repull/models/reservation_occupancy.rb +1 -1
- data/lib/repull/models/reservation_pms_outcome.rb +1 -1
- data/lib/repull/models/reservation_pms_outcome_quote.rb +1 -1
- data/lib/repull/models/reservation_pms_section_error.rb +1 -1
- data/lib/repull/models/reservation_primary_guest.rb +1 -1
- data/lib/repull/models/reservation_quote_request.rb +1 -1
- data/lib/repull/models/reservation_quote_response.rb +1 -1
- data/lib/repull/models/reservation_quote_response_breakdown.rb +1 -1
- data/lib/repull/models/reservation_request_created_event.rb +1 -1
- data/lib/repull/models/reservation_request_created_payload.rb +1 -1
- data/lib/repull/models/reservation_request_updated_event.rb +1 -1
- data/lib/repull/models/reservation_request_updated_payload.rb +1 -1
- data/lib/repull/models/reservation_unit.rb +1 -1
- data/lib/repull/models/reservation_update_request.rb +1 -1
- data/lib/repull/models/reservation_update_response.rb +1 -1
- data/lib/repull/models/reservation_updated_event.rb +1 -1
- data/lib/repull/models/reservation_updated_payload.rb +1 -1
- data/lib/repull/models/reservation_webhook_object.rb +1 -1
- data/lib/repull/models/respond_airbnb_review_request.rb +1 -1
- data/lib/repull/models/resume_connect400_response.rb +208 -0
- data/lib/repull/models/resume_connect500_response.rb +188 -0
- data/lib/repull/models/review.rb +13 -2
- data/lib/repull/models/review_category.rb +1 -1
- data/lib/repull/models/review_created_event.rb +1 -1
- data/lib/repull/models/review_created_payload.rb +1 -1
- data/lib/repull/models/review_list_response.rb +1 -1
- data/lib/repull/models/review_responded_event.rb +1 -1
- data/lib/repull/models/review_responded_payload.rb +1 -1
- data/lib/repull/models/review_response.rb +1 -1
- data/lib/repull/models/review_webhook_object.rb +1 -1
- data/lib/repull/models/rotate_webhook_secret200_response.rb +1 -1
- data/lib/repull/models/run_migration_import202_response.rb +1 -1
- data/lib/repull/models/run_migration_import202_response_data.rb +1 -1
- data/lib/repull/models/run_migration_import202_response_data_queued_inner.rb +1 -1
- data/lib/repull/models/run_migration_import_request.rb +1 -1
- data/lib/repull/models/search_connect_session_listing_options200_response.rb +1 -1
- data/lib/repull/models/search_connect_session_listing_options200_response_data_inner.rb +1 -1
- data/lib/repull/models/search_connection_listing_options200_response.rb +1 -1
- data/lib/repull/models/select_connect_provider_request.rb +1 -1
- data/lib/repull/models/select_provider_response.rb +1 -1
- data/lib/repull/models/send_airbnb_message201_response.rb +1 -1
- data/lib/repull/models/send_airbnb_message_request.rb +1 -1
- data/lib/repull/models/send_booking_message_request.rb +1 -1
- data/lib/repull/models/send_message_attachment.rb +1 -1
- data/lib/repull/models/send_message_part.rb +1 -1
- data/lib/repull/models/send_message_request.rb +3 -3
- data/lib/repull/models/send_message_response.rb +1 -1
- data/lib/repull/models/sent_attachment.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo200_response.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo200_response_data.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo_request.rb +1 -1
- data/lib/repull/models/set_kv_request.rb +1 -1
- data/lib/repull/models/set_listing_markup_request.rb +1 -1
- data/lib/repull/models/start_booking_extranet_login200_response.rb +1 -1
- data/lib/repull/models/start_booking_extranet_login_request.rb +1 -1
- data/lib/repull/models/submit_beds24_credentials200_response.rb +1 -1
- data/lib/repull/models/submit_beds24_credentials_request.rb +1 -1
- data/lib/repull/models/submit_bookingsync_credentials_request.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials200_response.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials200_response_account_info.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials200_response_webhooks.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials_request.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials_request_credentials.rb +1 -1
- data/lib/repull/models/submit_guest_review200_response.rb +1 -1
- data/lib/repull/models/submit_guesty_credentials_request.rb +1 -1
- data/lib/repull/models/submit_hospitable_credentials_request.rb +1 -1
- data/lib/repull/models/submit_hostaway_credentials_request.rb +1 -1
- data/lib/repull/models/submit_igms_credentials_request.rb +1 -1
- data/lib/repull/models/submit_lodgify_credentials_request.rb +1 -1
- data/lib/repull/models/submit_mews_credentials200_response.rb +1 -1
- data/lib/repull/models/submit_mews_credentials200_response_account_info.rb +1 -1
- data/lib/repull/models/submit_mews_credentials_request.rb +1 -1
- data/lib/repull/models/submit_mews_credentials_request_credentials.rb +1 -1
- data/lib/repull/models/submit_ownerrez_credentials_request.rb +1 -1
- data/lib/repull/models/submit_smoobu_credentials_request.rb +1 -1
- data/lib/repull/models/submit_smoobu_credentials_request_credentials.rb +1 -1
- data/lib/repull/models/submit_track_credentials200_response.rb +213 -0
- data/lib/repull/models/submit_track_credentials200_response_account_info.rb +222 -0
- data/lib/repull/models/submit_track_credentials200_response_first_sync.rb +157 -0
- data/lib/repull/models/submit_track_credentials_request.rb +184 -0
- data/lib/repull/models/submit_track_credentials_request_credentials.rb +332 -0
- data/lib/repull/models/submit_vrbo_credentials_request.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions200_response.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner_error.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions_request.rb +1 -1
- data/lib/repull/models/test_webhook_request.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings200_response_data.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_advance_notice.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_booking_window.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_cancellation.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_cancellation_non_refundable.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_check_in.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_check_out.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_instant_book.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_preparation_time.rb +1 -1
- data/lib/repull/models/update_airbnb_checkin_guide200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_checkin_guide200_response_data.rb +1 -1
- data/lib/repull/models/update_airbnb_checkin_guide200_response_data_steps_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_checkin_guide_request.rb +1 -1
- data/lib/repull/models/update_airbnb_checkin_guide_request_steps_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities200_response_data.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request_accessibility_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_permits200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_photo200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_photo_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_beds_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner_value.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_safety_disclosures200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_message_request.rb +1 -1
- data/lib/repull/models/update_booking_charges_request.rb +1 -1
- data/lib/repull/models/update_booking_content_request.rb +1 -1
- data/lib/repull/models/update_booking_content_request_content_data_inner.rb +1 -1
- data/lib/repull/models/update_booking_content_request_photos_inner.rb +1 -1
- data/lib/repull/models/update_connect_write_policy_request.rb +1 -1
- data/lib/repull/models/update_connect_write_policy_request_calendar.rb +1 -1
- data/lib/repull/models/update_connect_write_policy_request_reservations.rb +1 -1
- data/lib/repull/models/update_listing_pricing_strategy200_response.rb +1 -1
- data/lib/repull/models/update_webhook_request.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner_listing_id.rb +1 -1
- data/lib/repull/models/usage_quota_warning_event.rb +1 -1
- data/lib/repull/models/usage_quota_warning_payload.rb +1 -1
- data/lib/repull/models/usage_quota_warning_payload_top_operation.rb +1 -1
- data/lib/repull/models/vrbo_import_status.rb +1 -1
- data/lib/repull/models/vrbo_listing.rb +1 -1
- data/lib/repull/models/vrbo_login200_response.rb +1 -1
- data/lib/repull/models/vrbo_login_request.rb +1 -1
- data/lib/repull/models/vrbo_reservation.rb +1 -1
- data/lib/repull/models/vrbo_reservation_list_response.rb +1 -1
- data/lib/repull/models/webhook_delivery.rb +1 -1
- data/lib/repull/models/webhook_delivery_detail.rb +1 -1
- data/lib/repull/models/webhook_delivery_list_response.rb +1 -1
- data/lib/repull/models/webhook_event.rb +1 -1
- data/lib/repull/models/webhook_event_account.rb +1 -1
- data/lib/repull/models/webhook_event_catalog.rb +1 -1
- data/lib/repull/models/webhook_event_catalog_domains_inner.rb +1 -1
- data/lib/repull/models/webhook_event_catalog_entry.rb +1 -1
- data/lib/repull/models/webhook_event_type.rb +1 -1
- data/lib/repull/models/webhook_list_response.rb +1 -1
- data/lib/repull/models/webhook_subscription.rb +1 -1
- data/lib/repull/models/withdraw_conversation_preapproval200_response.rb +1 -1
- data/lib/repull/models/withdraw_conversation_special_offer200_response.rb +1 -1
- data/lib/repull/version.rb +2 -2
- data/lib/repull.rb +26 -2
- data/openapi/v1.json +769 -27
- data/scripts/regen.sh +1 -1
- metadata +27 -3
data/openapi/v1.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Repull API",
|
|
5
5
|
"version": "1.0.0",
|
|
6
|
-
"description": "The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization.\n\n## Designed for AI agents\nEvery error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human:\n- `error.code` \u2014 stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`)\n- `error.message` \u2014 human-readable cause\n- `error.fix` \u2014 exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\")\n- `error.docs_url` \u2014 link to the canonical write-up at `https://repull.dev/docs/errors/{code}`\n- `error.request_id` \u2014 id to correlate with server-side logs\n- `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` \u2014 when the error is parameter-specific\n- `error.retry_after` \u2014 seconds to wait before retrying (rate-limit + transient upstream)\n\n`Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses.\n\n## Quick Start\n1. Get an API key at https://repull.dev/dashboard\n2. Connect a PMS: `POST /v1/connect/{provider}`\n3. List properties: `GET /v1/properties`\n4. Get reservations: `GET /v1/reservations`\n\n## Authentication\nAll requests require a Bearer token:\n```\nAuthorization: Bearer sk_live_YOUR_API_KEY\n```\n\n## Request Correlation (X-Request-ID)\nEvery response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports \u2014 we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id.\n\nYou may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`.\n\nThe id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy.\n\n## Rate Limits\nThe public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas.\n\n**Default policy:** 600 requests per 60 seconds, per API key. Sliding window \u2014 there is no fixed-minute boundary you can burst across.\n\nEvery response includes:\n\n| Header | Meaning |\n|---|---|\n| `X-RateLimit-Limit` | Requests permitted in the current window. |\n| `X-RateLimit-Remaining` | Requests left in the current window after this call. |\n| `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. |\n| `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. |\n| `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** |\n\n**On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries \u2014 never a tight loop.\n\nRecommended backoff:\n```\nsleep_ms = (Retry-After * 1000) + random(0..250)\n```\n\nMonthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields.\n\n## Plan Limits (402 \u2014 `listings_limit_exceeded`)\nThe Repull API also enforces a per-tier cap on **active listings**:\n\n| Tier | Active listings cap |\n|---|---|\n| `free` | 3 |\n| `starter` |
|
|
6
|
+
"description": "The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization.\n\n## Designed for AI agents\nEvery error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human:\n- `error.code` \u2014 stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`)\n- `error.message` \u2014 human-readable cause\n- `error.fix` \u2014 exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\")\n- `error.docs_url` \u2014 link to the canonical write-up at `https://repull.dev/docs/errors/{code}`\n- `error.request_id` \u2014 id to correlate with server-side logs\n- `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` \u2014 when the error is parameter-specific\n- `error.retry_after` \u2014 seconds to wait before retrying (rate-limit + transient upstream)\n\n`Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses.\n\n## Quick Start\n1. Get an API key at https://repull.dev/dashboard\n2. Connect a PMS: `POST /v1/connect/{provider}`\n3. List properties: `GET /v1/properties`\n4. Get reservations: `GET /v1/reservations`\n\n## Authentication\nAll requests require a Bearer token:\n```\nAuthorization: Bearer sk_live_YOUR_API_KEY\n```\n\n## Request Correlation (X-Request-ID)\nEvery response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports \u2014 we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id.\n\nYou may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`.\n\nThe id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy.\n\n## Rate Limits\nThe public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas.\n\n**Default policy:** 600 requests per 60 seconds, per API key. Sliding window \u2014 there is no fixed-minute boundary you can burst across.\n\nEvery response includes:\n\n| Header | Meaning |\n|---|---|\n| `X-RateLimit-Limit` | Requests permitted in the current window. |\n| `X-RateLimit-Remaining` | Requests left in the current window after this call. |\n| `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. |\n| `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. |\n| `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** |\n\n**On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries \u2014 never a tight loop.\n\nRecommended backoff:\n```\nsleep_ms = (Retry-After * 1000) + random(0..250)\n```\n\nMonthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields.\n\n## Plan Limits (402 \u2014 `listings_limit_exceeded`)\nThe Repull API also enforces a per-tier cap on **active listings**:\n\n| Tier | Active listings cap |\n|---|---|\n| `free` | 3 |\n| `starter` | unlimited (10 included, then billed per listing) |\n| `custom` | unlimited |\n\nWhen a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT:\n\n- `/v1/health` \u2014 uptime probes are never gated.\n- `/v1/usage/*` \u2014 so dashboards can render the over-cap state.\n- Any `DELETE` \u2014 so the customer can trim listings to get back under the cap without paying.\n\nUnlike 429, 402 is NOT a \"wait and retry\" condition \u2014 `Retry-After` is not set. The only paths back to 200 are:\n 1. `DELETE` enough listings to come back under the cap, or\n 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute.\n\nThe envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.",
|
|
7
7
|
"contact": {
|
|
8
8
|
"url": "https://repull.dev"
|
|
9
9
|
},
|
|
@@ -1368,6 +1368,12 @@
|
|
|
1368
1368
|
"type": "string",
|
|
1369
1369
|
"nullable": true
|
|
1370
1370
|
},
|
|
1371
|
+
"pms": {
|
|
1372
|
+
"type": "string",
|
|
1373
|
+
"nullable": true,
|
|
1374
|
+
"example": "guesty",
|
|
1375
|
+
"description": "The PMS this review was read from (`guesty`, `hostaway`, \u2026) when it came through one \u2014 `platform` is still the channel the guest wrote it on. A reply (`POST /v1/reviews/{id}/reply`) goes through this PMS; `GET /v1/connect/{provider}` \u2192 `capabilities.pms.reviews.reply` says whether it can. `null` for a review from a directly connected channel."
|
|
1376
|
+
},
|
|
1371
1377
|
"listingId": {
|
|
1372
1378
|
"type": "string",
|
|
1373
1379
|
"nullable": true,
|
|
@@ -2171,10 +2177,13 @@
|
|
|
2171
2177
|
},
|
|
2172
2178
|
"capabilities": {
|
|
2173
2179
|
"type": "object",
|
|
2174
|
-
"description": "PMS providers only. `reservations`: which reservation writes the API performs on this connection's listings \u2014 the connector's support combined with `writePolicy`. When `connected` is false, what the connector supports once connected.",
|
|
2180
|
+
"description": "PMS providers only. `reservations`: which reservation writes the API performs on this connection's listings \u2014 the connector's support combined with `writePolicy`. `pms`: everything else the API does through this PMS (review replies, request answers, listing content, guests, message channel/attachments, calendar). When `connected` is false, what the connector supports once connected.",
|
|
2175
2181
|
"properties": {
|
|
2176
2182
|
"reservations": {
|
|
2177
2183
|
"$ref": "#/components/schemas/ReservationCapabilities"
|
|
2184
|
+
},
|
|
2185
|
+
"pms": {
|
|
2186
|
+
"$ref": "#/components/schemas/PmsCapabilities"
|
|
2178
2187
|
}
|
|
2179
2188
|
}
|
|
2180
2189
|
},
|
|
@@ -8061,7 +8070,51 @@
|
|
|
8061
8070
|
"items": {
|
|
8062
8071
|
"type": "string"
|
|
8063
8072
|
},
|
|
8064
|
-
"description": "Provided-but-not-applied fields \u2014 e.g. \"photos\" when a non-empty photos array carried no valid http(s) URL."
|
|
8073
|
+
"description": "Provided-but-not-applied fields \u2014 e.g. \"photos\" when a non-empty photos array carried no valid http(s) URL. On a listing a PMS manages, also the content sections the PMS refused (`title`, `descriptions`, `times`, `capacity`, `amenities`, `houseRules`, `address`, `photos`), which are then not written here either."
|
|
8074
|
+
},
|
|
8075
|
+
"pms": {
|
|
8076
|
+
"type": "object",
|
|
8077
|
+
"nullable": true,
|
|
8078
|
+
"description": "Present when the listing is managed in a PMS: the PMS-owned fields were written there first, and this is its per-section outcome.",
|
|
8079
|
+
"properties": {
|
|
8080
|
+
"provider": {
|
|
8081
|
+
"type": "string",
|
|
8082
|
+
"example": "guesty"
|
|
8083
|
+
},
|
|
8084
|
+
"applied": {
|
|
8085
|
+
"type": "array",
|
|
8086
|
+
"items": {
|
|
8087
|
+
"type": "string"
|
|
8088
|
+
},
|
|
8089
|
+
"description": "Sections the PMS applied."
|
|
8090
|
+
},
|
|
8091
|
+
"errors": {
|
|
8092
|
+
"type": "array",
|
|
8093
|
+
"items": {
|
|
8094
|
+
"type": "object",
|
|
8095
|
+
"properties": {
|
|
8096
|
+
"section": {
|
|
8097
|
+
"type": "string"
|
|
8098
|
+
},
|
|
8099
|
+
"code": {
|
|
8100
|
+
"type": "string",
|
|
8101
|
+
"enum": [
|
|
8102
|
+
"rejected",
|
|
8103
|
+
"unavailable",
|
|
8104
|
+
"unsupported",
|
|
8105
|
+
"not_found",
|
|
8106
|
+
"reauth_required",
|
|
8107
|
+
"duplicate"
|
|
8108
|
+
]
|
|
8109
|
+
},
|
|
8110
|
+
"message": {
|
|
8111
|
+
"type": "string"
|
|
8112
|
+
}
|
|
8113
|
+
}
|
|
8114
|
+
},
|
|
8115
|
+
"description": "Sections the PMS refused, with its reason."
|
|
8116
|
+
}
|
|
8117
|
+
}
|
|
8065
8118
|
}
|
|
8066
8119
|
}
|
|
8067
8120
|
},
|
|
@@ -8748,10 +8801,13 @@
|
|
|
8748
8801
|
"properties": {
|
|
8749
8802
|
"capabilities": {
|
|
8750
8803
|
"type": "object",
|
|
8751
|
-
"description": "`GET /v1/listings/{id}` only. What the API can do with this listing.",
|
|
8804
|
+
"description": "`GET /v1/listings/{id}` only. What the API can do with this listing. `pms` is present when a connected PMS manages it.",
|
|
8752
8805
|
"properties": {
|
|
8753
8806
|
"reservations": {
|
|
8754
8807
|
"$ref": "#/components/schemas/ReservationCapabilities"
|
|
8808
|
+
},
|
|
8809
|
+
"pms": {
|
|
8810
|
+
"$ref": "#/components/schemas/PmsCapabilities"
|
|
8755
8811
|
}
|
|
8756
8812
|
}
|
|
8757
8813
|
},
|
|
@@ -11725,6 +11781,150 @@
|
|
|
11725
11781
|
}
|
|
11726
11782
|
}
|
|
11727
11783
|
},
|
|
11784
|
+
"PmsCapabilities": {
|
|
11785
|
+
"type": "object",
|
|
11786
|
+
"description": "What the API does through a connected PMS beyond reservation writes, read from the same connector table the router uses \u2014 a `false` flag is a `422 pms_write_unsupported` naming the PMS.",
|
|
11787
|
+
"properties": {
|
|
11788
|
+
"provider": {
|
|
11789
|
+
"type": "string",
|
|
11790
|
+
"example": "guesty"
|
|
11791
|
+
},
|
|
11792
|
+
"connected": {
|
|
11793
|
+
"type": "boolean",
|
|
11794
|
+
"description": "`false`: what the connector supports once connected (on a listing: a dead link \u2014 every write answers `409 no_connection`)."
|
|
11795
|
+
},
|
|
11796
|
+
"reservations": {
|
|
11797
|
+
"type": "object",
|
|
11798
|
+
"properties": {
|
|
11799
|
+
"respond": {
|
|
11800
|
+
"type": "boolean",
|
|
11801
|
+
"description": "`POST /v1/reservations/{id}/accept|decline` on requests this PMS relays."
|
|
11802
|
+
},
|
|
11803
|
+
"preapprove": {
|
|
11804
|
+
"type": "boolean",
|
|
11805
|
+
"description": "`POST /v1/conversations/{id}/pre-approval` on inquiries this PMS relays."
|
|
11806
|
+
}
|
|
11807
|
+
}
|
|
11808
|
+
},
|
|
11809
|
+
"reviews": {
|
|
11810
|
+
"type": "object",
|
|
11811
|
+
"properties": {
|
|
11812
|
+
"read": {
|
|
11813
|
+
"type": "boolean",
|
|
11814
|
+
"description": "Its reviews appear in `GET /v1/reviews` (with `pms` set)."
|
|
11815
|
+
},
|
|
11816
|
+
"reply": {
|
|
11817
|
+
"type": "boolean",
|
|
11818
|
+
"description": "`POST /v1/reviews/{id}/reply`."
|
|
11819
|
+
}
|
|
11820
|
+
}
|
|
11821
|
+
},
|
|
11822
|
+
"listings": {
|
|
11823
|
+
"type": "object",
|
|
11824
|
+
"description": "Sections `PUT /v1/listings/{id}/content` writes to the PMS.",
|
|
11825
|
+
"properties": {
|
|
11826
|
+
"title": {
|
|
11827
|
+
"type": "boolean"
|
|
11828
|
+
},
|
|
11829
|
+
"descriptions": {
|
|
11830
|
+
"type": "boolean"
|
|
11831
|
+
},
|
|
11832
|
+
"times": {
|
|
11833
|
+
"type": "boolean"
|
|
11834
|
+
},
|
|
11835
|
+
"capacity": {
|
|
11836
|
+
"type": "boolean"
|
|
11837
|
+
},
|
|
11838
|
+
"amenities": {
|
|
11839
|
+
"type": "boolean"
|
|
11840
|
+
},
|
|
11841
|
+
"houseRules": {
|
|
11842
|
+
"type": "boolean"
|
|
11843
|
+
},
|
|
11844
|
+
"address": {
|
|
11845
|
+
"type": "boolean"
|
|
11846
|
+
},
|
|
11847
|
+
"photosAdd": {
|
|
11848
|
+
"type": "boolean"
|
|
11849
|
+
},
|
|
11850
|
+
"photosDelete": {
|
|
11851
|
+
"type": "boolean"
|
|
11852
|
+
},
|
|
11853
|
+
"photosReorder": {
|
|
11854
|
+
"type": "boolean"
|
|
11855
|
+
},
|
|
11856
|
+
"photoCaptions": {
|
|
11857
|
+
"type": "boolean"
|
|
11858
|
+
}
|
|
11859
|
+
}
|
|
11860
|
+
},
|
|
11861
|
+
"guests": {
|
|
11862
|
+
"type": "object",
|
|
11863
|
+
"properties": {
|
|
11864
|
+
"create": {
|
|
11865
|
+
"type": "boolean",
|
|
11866
|
+
"description": "`POST /v1/guests` with `provider`."
|
|
11867
|
+
},
|
|
11868
|
+
"update": {
|
|
11869
|
+
"type": "boolean",
|
|
11870
|
+
"description": "`PATCH /v1/guests/{id}` on a guest linked to this PMS."
|
|
11871
|
+
}
|
|
11872
|
+
}
|
|
11873
|
+
},
|
|
11874
|
+
"conversations": {
|
|
11875
|
+
"type": "object",
|
|
11876
|
+
"properties": {
|
|
11877
|
+
"send": {
|
|
11878
|
+
"type": "boolean"
|
|
11879
|
+
},
|
|
11880
|
+
"attachments": {
|
|
11881
|
+
"type": "boolean",
|
|
11882
|
+
"description": "`attachments` on `POST /v1/conversations/{id}/messages`."
|
|
11883
|
+
},
|
|
11884
|
+
"channelSelect": {
|
|
11885
|
+
"type": "boolean",
|
|
11886
|
+
"description": "`channel` on `POST /v1/conversations/{id}/messages`."
|
|
11887
|
+
}
|
|
11888
|
+
}
|
|
11889
|
+
},
|
|
11890
|
+
"calendar": {
|
|
11891
|
+
"type": "object",
|
|
11892
|
+
"properties": {
|
|
11893
|
+
"write": {
|
|
11894
|
+
"type": "boolean",
|
|
11895
|
+
"description": "`PUT /v1/availability/{propertyId}` reaches the PMS."
|
|
11896
|
+
}
|
|
11897
|
+
}
|
|
11898
|
+
},
|
|
11899
|
+
"payments": {
|
|
11900
|
+
"type": "object",
|
|
11901
|
+
"properties": {
|
|
11902
|
+
"read": {
|
|
11903
|
+
"type": "boolean",
|
|
11904
|
+
"description": "Payments recorded in the PMS are imported onto the reservation."
|
|
11905
|
+
}
|
|
11906
|
+
}
|
|
11907
|
+
},
|
|
11908
|
+
"tasks": {
|
|
11909
|
+
"type": "object",
|
|
11910
|
+
"properties": {
|
|
11911
|
+
"read": {
|
|
11912
|
+
"type": "boolean"
|
|
11913
|
+
},
|
|
11914
|
+
"write": {
|
|
11915
|
+
"type": "boolean"
|
|
11916
|
+
}
|
|
11917
|
+
}
|
|
11918
|
+
},
|
|
11919
|
+
"notes": {
|
|
11920
|
+
"type": "object",
|
|
11921
|
+
"additionalProperties": {
|
|
11922
|
+
"type": "string"
|
|
11923
|
+
},
|
|
11924
|
+
"description": "The connector's own notes per family (limits, required access)."
|
|
11925
|
+
}
|
|
11926
|
+
}
|
|
11927
|
+
},
|
|
11728
11928
|
"GuestCreateRequest": {
|
|
11729
11929
|
"type": "object",
|
|
11730
11930
|
"required": [
|
|
@@ -11763,6 +11963,100 @@
|
|
|
11763
11963
|
"isBusinessTraveler": {
|
|
11764
11964
|
"type": "boolean",
|
|
11765
11965
|
"default": false
|
|
11966
|
+
},
|
|
11967
|
+
"provider": {
|
|
11968
|
+
"type": "string",
|
|
11969
|
+
"example": "guesty",
|
|
11970
|
+
"description": "A connected PMS to create the guest in as well. The guest is created there FIRST; a PMS that cannot create guest profiles returns `422 pms_write_unsupported` and nothing is created. The PMS's guest id comes back as `pms.externalId`, and later `PATCH /v1/guests/{id}` changes reach it."
|
|
11971
|
+
}
|
|
11972
|
+
}
|
|
11973
|
+
},
|
|
11974
|
+
"GuestUpdateRequest": {
|
|
11975
|
+
"type": "object",
|
|
11976
|
+
"minProperties": 1,
|
|
11977
|
+
"properties": {
|
|
11978
|
+
"firstName": {
|
|
11979
|
+
"type": "string",
|
|
11980
|
+
"minLength": 1
|
|
11981
|
+
},
|
|
11982
|
+
"lastName": {
|
|
11983
|
+
"type": "string"
|
|
11984
|
+
},
|
|
11985
|
+
"email": {
|
|
11986
|
+
"type": "string",
|
|
11987
|
+
"format": "email",
|
|
11988
|
+
"description": "Added as the guest's newest email; earlier ones are kept."
|
|
11989
|
+
},
|
|
11990
|
+
"phone": {
|
|
11991
|
+
"type": "string",
|
|
11992
|
+
"description": "E.164 preferred. Added as the guest's newest phone; earlier ones are kept."
|
|
11993
|
+
},
|
|
11994
|
+
"language": {
|
|
11995
|
+
"type": "string",
|
|
11996
|
+
"description": "BCP-47 tag."
|
|
11997
|
+
}
|
|
11998
|
+
}
|
|
11999
|
+
},
|
|
12000
|
+
"GuestUpdateResponse": {
|
|
12001
|
+
"type": "object",
|
|
12002
|
+
"properties": {
|
|
12003
|
+
"id": {
|
|
12004
|
+
"type": "integer"
|
|
12005
|
+
},
|
|
12006
|
+
"firstName": {
|
|
12007
|
+
"type": "string"
|
|
12008
|
+
},
|
|
12009
|
+
"lastName": {
|
|
12010
|
+
"type": "string",
|
|
12011
|
+
"nullable": true
|
|
12012
|
+
},
|
|
12013
|
+
"language": {
|
|
12014
|
+
"type": "string",
|
|
12015
|
+
"nullable": true
|
|
12016
|
+
},
|
|
12017
|
+
"contacts": {
|
|
12018
|
+
"type": "array",
|
|
12019
|
+
"items": {
|
|
12020
|
+
"type": "object",
|
|
12021
|
+
"properties": {
|
|
12022
|
+
"type": {
|
|
12023
|
+
"type": "string",
|
|
12024
|
+
"enum": [
|
|
12025
|
+
"email",
|
|
12026
|
+
"phone"
|
|
12027
|
+
]
|
|
12028
|
+
},
|
|
12029
|
+
"value": {
|
|
12030
|
+
"type": "string"
|
|
12031
|
+
},
|
|
12032
|
+
"isPrimary": {
|
|
12033
|
+
"type": "boolean"
|
|
12034
|
+
}
|
|
12035
|
+
}
|
|
12036
|
+
}
|
|
12037
|
+
},
|
|
12038
|
+
"updatedAt": {
|
|
12039
|
+
"type": "string",
|
|
12040
|
+
"format": "date-time",
|
|
12041
|
+
"nullable": true
|
|
12042
|
+
},
|
|
12043
|
+
"pms": {
|
|
12044
|
+
"type": "array",
|
|
12045
|
+
"description": "Each PMS the change was written to first (the guest's linked PMSs), with the sections it applied.",
|
|
12046
|
+
"items": {
|
|
12047
|
+
"type": "object",
|
|
12048
|
+
"properties": {
|
|
12049
|
+
"provider": {
|
|
12050
|
+
"type": "string"
|
|
12051
|
+
},
|
|
12052
|
+
"applied": {
|
|
12053
|
+
"type": "array",
|
|
12054
|
+
"items": {
|
|
12055
|
+
"type": "string"
|
|
12056
|
+
}
|
|
12057
|
+
}
|
|
12058
|
+
}
|
|
12059
|
+
}
|
|
11766
12060
|
}
|
|
11767
12061
|
}
|
|
11768
12062
|
},
|
|
@@ -11821,6 +12115,20 @@
|
|
|
11821
12115
|
"createdAt": {
|
|
11822
12116
|
"type": "string",
|
|
11823
12117
|
"format": "date-time"
|
|
12118
|
+
},
|
|
12119
|
+
"pms": {
|
|
12120
|
+
"type": "object",
|
|
12121
|
+
"nullable": true,
|
|
12122
|
+
"description": "Set when `provider` was sent: the PMS the guest was also created in, and its id there.",
|
|
12123
|
+
"properties": {
|
|
12124
|
+
"provider": {
|
|
12125
|
+
"type": "string"
|
|
12126
|
+
},
|
|
12127
|
+
"externalId": {
|
|
12128
|
+
"type": "string",
|
|
12129
|
+
"nullable": true
|
|
12130
|
+
}
|
|
12131
|
+
}
|
|
11824
12132
|
}
|
|
11825
12133
|
}
|
|
11826
12134
|
},
|
|
@@ -11865,7 +12173,8 @@
|
|
|
11865
12173
|
},
|
|
11866
12174
|
"channel": {
|
|
11867
12175
|
"type": "string",
|
|
11868
|
-
"
|
|
12176
|
+
"example": "email",
|
|
12177
|
+
"description": "Force a channel. Omit to send on whichever channel the conversation already uses, which is the right default. One of `airbnb`, `booking`, `vrbo`, `sms`, `email`, `website` \u2014 except on a conversation a connected PMS relays (Guesty, Hostaway, \u2026), where the message is sent through the PMS and `channel` is passed to it: the PMS's own channel/module name (Guesty `airbnb2`, `bookingCom`, `email`, `sms`, \u2026) or one of Repull's names, which the PMS maps. A PMS that cannot choose a channel returns `422 pms_write_unsupported`; `GET /v1/connect/{provider}` \u2192 `capabilities.pms.conversations.channelSelect` says so beforehand."
|
|
11869
12178
|
},
|
|
11870
12179
|
"attachments": {
|
|
11871
12180
|
"type": "array",
|
|
@@ -11874,7 +12183,7 @@
|
|
|
11874
12183
|
"items": {
|
|
11875
12184
|
"$ref": "#/components/schemas/SendMessageAttachment"
|
|
11876
12185
|
},
|
|
11877
|
-
"description": "Files to send. See the per-channel table above."
|
|
12186
|
+
"description": "Files to send. See the per-channel table above. On a conversation a connected PMS relays, files go through the PMS \u2014 `422 pms_write_unsupported` when its API cannot send them (`capabilities.pms.conversations.attachments` on `GET /v1/connect/{provider}`)."
|
|
11878
12187
|
}
|
|
11879
12188
|
}
|
|
11880
12189
|
},
|
|
@@ -14603,7 +14912,7 @@
|
|
|
14603
14912
|
"post": {
|
|
14604
14913
|
"operationId": "create_reservation",
|
|
14605
14914
|
"summary": "Create a reservation",
|
|
14606
|
-
"description": "Creates a reservation \u2014 in the listing's PMS when it has one, otherwise as a direct booking in Repull.\n\n### Where the booking is made\n\n- **A listing managed in a connected PMS** (Mews, Cloudbeds, Hostaway, Guesty, Beds24, BookingSync, Lodgify, Smoobu, Hospitable, iGMS, OwnerRez): the booking is created **in the PMS first**, then recorded in Repull from the PMS's own record, so the next sync lands on the same confirmation code and nothing is duplicated. A booking is **never** created only in Repull for such a listing \u2014 the PMS would keep selling the dates. What the PMS cannot do is refused (`422 pms_write_unsupported`), never faked. The PMS checks availability: taken dates answer `409 pms_unavailable`.\n- **Any other listing**: a direct booking made in Repull, with everything that hangs off one \u2014 the guest, the conversation, the calendar block and the `reservation.created` fan-out that issues the door code and starts the messaging automations. Priced by the listing's own rates; **availability is NOT checked** (call `GET /v1/availability/{propertyId}` first if that matters).\n\n`GET /v1/listings/{id}` \u2192 `capabilities.reservations` says which applies to a listing and exactly what it supports (`create`, `modify`, `cancel`, `quote`, `customPrice`, plus `notes`).\n\n### Fields by listing kind\n\n| Field | PMS listing | Direct-booking listing |\n|---|---|---|\n| `listingId`, `checkIn`, `checkOut`, `guest`, `guestCount`, `adults`, `children` | \u2713 | \u2713 |\n| `status` | `confirmed` (default) or `tentative` | \u2713 |\n| `totalPrice` | \u2713 where `capabilities.reservations.customPrice`; otherwise the PMS prices the stay | `422 unsupported_field` (priced from the listing's rates) |\n| `notes`, `unitId`, `sendConfirmationEmail` | \u2713 | `422 unsupported_field` |\n| `checkInTime`, `checkOutTime`, `currency`, `guestId` | `422 unsupported_field` (the PMS's own settings apply) | \u2713 |\n| `platform` | `direct` or `website` (`owner` \u2192 `422 pms_write_unsupported`; block owner stays in the PMS) | `direct`, `website` or `owner` |\n\nA field a listing cannot take is refused by name, never silently dropped. `platform` never accepts `airbnb` / `booking` / `vrbo`: those reservations are owned by the channel and arrive through sync.\n\n### Per-PMS limits\n\n| PMS | create | change | cancel | quote | `totalPrice` | Limits |\n|---|---|---|---|---|---|---|\n| Mews | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 | \u2014 |\n| Cloudbeds | \u2713 | \u2713 | \u2713 | \u2013 | \u2013 | Books at the rate plan's price; group bookings supported. |\n| Hostaway | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Direct-channel bookings only; a specific unit is refused; a date change keeps the booked total. |\n| Guesty | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Cancels direct and Vrbo bookings; other channel bookings are cancelled on the channel. |\n| Beds24 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs the `write:bookings` scope; a multi-room property needs `unitId`. |\n| BookingSync | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs `bookings_write`; fees and taxes are not itemized; no guest email. |\n| Lodgify | \u2713 | \u2713 | \u2713 (declines) | \u2713 | \u2713 | Cancel declines the booking; single-room bookings. |\n| Smoobu | \u2713 | \u2713 (no dates) | \u2713 | \u2713 | \u2713 | Dates cannot be changed through Smoobu's API \u2014 cancel and rebook, or change them in Smoobu. |\n| Hospitable | \u2713 | \u2713 | \u2713 | \u2713 (Direct plan) | \u2713 | Manual reservations only; needs `reservation:write`; adds no fees or taxes. |\n| iGMS | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 (required) | iGMS direct bookings only; a price is required; no tentative holds. |\n| OwnerRez | \u2713 | \u2713 | \u2013 | \u2713 | \u2013 | No cancel through OwnerRez's API; priced by the property's own rates; needs the `full` scope. |\n\nEvery PMS except Cloudbeds refuses group bookings, and every vacation-rental PMS refuses to change or cancel a booking that came from a channel (Airbnb, Booking.com, Vrbo\u2026) \u2014 that is done on the channel.\n\n**Verification.** Mews and Cloudbeds were run end to end on their vendors' sandboxes. Every other PMS is **verified against the vendor's API documentation only** \u2014 no live account has been written to yet. `capabilities.reservations.verifiedAgainst` says which.\n\n### Idempotency\n\n**Send `Idempotency-Key`.** A network timeout here is exactly the case it exists for. The key is also sent to the PMS as the booking's reference, so even a retry that reaches the PMS again finds the booking instead of making a second one (`409 pms_duplicate` with `existing`, or the existing booking returned). A completed answer is replayed with `Idempotency-Status: cached` and the PMS is not called again. `502 pms_error` (the PMS could not be reached) is NOT stored \u2014 retry with the same key. `502 reservation_created_in_pms_only` IS stored, unlike every other 5xx: the booking exists in the PMS and arrives with the next sync, so a retry replays that answer rather than booking twice.\n\n### Partial success\n\nWhen the PMS created the booking but a follow-up step did not apply (for example the notes, or a tentative state), the response is still `201`, with `pms.partial: true` and the steps in `pms.failedSections`. The booking exists \u2014 do not create it again.\n\n`X-Account-Id` restricts the listing to one connected account. Returns `403 listing_inactive` when the listing is inactive.",
|
|
14915
|
+
"description": "Creates a reservation \u2014 in the listing's PMS when it has one, otherwise as a direct booking in Repull.\n\n### Where the booking is made\n\n- **A listing managed in a connected PMS** (Mews, Cloudbeds, Hostaway, Guesty, Beds24, BookingSync, Lodgify, Smoobu, Hospitable, iGMS, OwnerRez, Track): the booking is created **in the PMS first**, then recorded in Repull from the PMS's own record, so the next sync lands on the same confirmation code and nothing is duplicated. A booking is **never** created only in Repull for such a listing \u2014 the PMS would keep selling the dates. What the PMS cannot do is refused (`422 pms_write_unsupported`), never faked. The PMS checks availability: taken dates answer `409 pms_unavailable`.\n- **Any other listing**: a direct booking made in Repull, with everything that hangs off one \u2014 the guest, the conversation, the calendar block and the `reservation.created` fan-out that issues the door code and starts the messaging automations. Priced by the listing's own rates; **availability is NOT checked** (call `GET /v1/availability/{propertyId}` first if that matters).\n\n`GET /v1/listings/{id}` \u2192 `capabilities.reservations` says which applies to a listing and exactly what it supports (`create`, `modify`, `cancel`, `quote`, `customPrice`, plus `notes`).\n\n### Fields by listing kind\n\n| Field | PMS listing | Direct-booking listing |\n|---|---|---|\n| `listingId`, `checkIn`, `checkOut`, `guest`, `guestCount`, `adults`, `children` | \u2713 | \u2713 |\n| `status` | `confirmed` (default) or `tentative` | \u2713 |\n| `totalPrice` | \u2713 where `capabilities.reservations.customPrice`; otherwise the PMS prices the stay | `422 unsupported_field` (priced from the listing's rates) |\n| `notes`, `unitId`, `sendConfirmationEmail` | \u2713 | `422 unsupported_field` |\n| `checkInTime`, `checkOutTime`, `currency`, `guestId` | `422 unsupported_field` (the PMS's own settings apply) | \u2713 |\n| `platform` | `direct` or `website` (`owner` \u2192 `422 pms_write_unsupported`; block owner stays in the PMS) | `direct`, `website` or `owner` |\n\nA field a listing cannot take is refused by name, never silently dropped. `platform` never accepts `airbnb` / `booking` / `vrbo`: those reservations are owned by the channel and arrive through sync.\n\n### Per-PMS limits\n\n| PMS | create | change | cancel | quote | `totalPrice` | Limits |\n|---|---|---|---|---|---|---|\n| Mews | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 | \u2014 |\n| Cloudbeds | \u2713 | \u2713 | \u2713 | \u2013 | \u2013 | Books at the rate plan's price; group bookings supported. |\n| Hostaway | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Direct-channel bookings only; a specific unit is refused; a date change keeps the booked total. |\n| Guesty | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Cancels direct and Vrbo bookings; other channel bookings are cancelled on the channel. |\n| Beds24 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs the `write:bookings` scope; a multi-room property needs `unitId`. |\n| BookingSync | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs `bookings_write`; fees and taxes are not itemized; no guest email. |\n| Lodgify | \u2713 | \u2713 | \u2713 (declines) | \u2713 | \u2713 | Cancel declines the booking; single-room bookings. |\n| Smoobu | \u2713 | \u2713 (no dates) | \u2713 | \u2713 | \u2713 | Dates cannot be changed through Smoobu's API \u2014 cancel and rebook, or change them in Smoobu. |\n| Hospitable | \u2713 | \u2713 | \u2713 | \u2713 (Direct plan) | \u2713 | Manual reservations only; needs `reservation:write`; adds no fees or taxes. |\n| iGMS | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 (required) | iGMS direct bookings only; a price is required; no tentative holds. |\n| OwnerRez | \u2713 | \u2713 | \u2013 | \u2713 | \u2013 | No cancel through OwnerRez's API; priced by the property's own rates; needs the `full` scope. |\n| Track | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Track decides Hold vs Confirmed from the property's channel mode; a set price on a Channel Key needs \"Allow Custom Pricing\"; a unit change needs `moveReasonId` on the connection; a date change re-prices at Track's current rates. |\n\nEvery PMS except Cloudbeds refuses group bookings, and every vacation-rental PMS refuses to change or cancel a booking that came from a channel (Airbnb, Booking.com, Vrbo\u2026) \u2014 that is done on the channel.\n\n**Verification.** Mews and Cloudbeds were run end to end on their vendors' sandboxes. Every other PMS is **verified against the vendor's API documentation only** \u2014 no live account has been written to yet. `capabilities.reservations.verifiedAgainst` says which.\n\n### Idempotency\n\n**Send `Idempotency-Key`.** A network timeout here is exactly the case it exists for. The key is also sent to the PMS as the booking's reference, so even a retry that reaches the PMS again finds the booking instead of making a second one (`409 pms_duplicate` with `existing`, or the existing booking returned). A completed answer is replayed with `Idempotency-Status: cached` and the PMS is not called again. `502 pms_error` (the PMS could not be reached) is NOT stored \u2014 retry with the same key. `502 reservation_created_in_pms_only` IS stored, unlike every other 5xx: the booking exists in the PMS and arrives with the next sync, so a retry replays that answer rather than booking twice.\n\n### Partial success\n\nWhen the PMS created the booking but a follow-up step did not apply (for example the notes, or a tentative state), the response is still `201`, with `pms.partial: true` and the steps in `pms.failedSections`. The booking exists \u2014 do not create it again.\n\n`X-Account-Id` restricts the listing to one connected account. Returns `403 listing_inactive` when the listing is inactive.",
|
|
14607
14916
|
"tags": [
|
|
14608
14917
|
"Reservations"
|
|
14609
14918
|
],
|
|
@@ -15524,7 +15833,7 @@
|
|
|
15524
15833
|
"post": {
|
|
15525
15834
|
"operationId": "createGuest",
|
|
15526
15835
|
"summary": "Create a guest",
|
|
15527
|
-
"description": "Creates a guest in the workspace, with contact normalisation applied (phone digits, email lowercased) and each contact stored as its own record.\n\n**This is find-or-create, and the response tells you which happened.** A guest already on file matching on email \u2014 then phone \u2014 AND name is returned instead of a duplicate being created. Read the `created` flag rather than inferring from the status: `201` with `created: true` means a new record was written, `200` with `created: false` means an existing guest matched. Quietly handing back an existing record as though it were new is exactly the ambiguity this flag removes.\n\nField names are camelCase, and an unrecognised field is rejected by name rather than silently dropped.\n\nSend `Idempotency-Key` to make a retry safe.",
|
|
15836
|
+
"description": "Creates a guest in the workspace, with contact normalisation applied (phone digits, email lowercased) and each contact stored as its own record.\n\n**This is find-or-create, and the response tells you which happened.** A guest already on file matching on email \u2014 then phone \u2014 AND name is returned instead of a duplicate being created. Read the `created` flag rather than inferring from the status: `201` with `created: true` means a new record was written, `200` with `created: false` means an existing guest matched. Quietly handing back an existing record as though it were new is exactly the ambiguity this flag removes.\n\nField names are camelCase, and an unrecognised field is rejected by name rather than silently dropped.\n\n**Creating the guest in a connected PMS too:** send `provider` (e.g. `guesty`). The guest is created in the PMS first and its id there comes back as `pms.externalId`; a PMS whose API cannot create guest profiles returns `422 pms_write_unsupported` naming it (Hostaway today) and nothing is created. `GET /v1/connect/{provider}` \u2192 `capabilities.pms.guests.create` says so beforehand.\n\nSend `Idempotency-Key` to make a retry safe.",
|
|
15528
15837
|
"tags": [
|
|
15529
15838
|
"Guests"
|
|
15530
15839
|
],
|
|
@@ -15648,6 +15957,61 @@
|
|
|
15648
15957
|
"$ref": "#/components/responses/InternalError"
|
|
15649
15958
|
}
|
|
15650
15959
|
}
|
|
15960
|
+
},
|
|
15961
|
+
"patch": {
|
|
15962
|
+
"operationId": "updateGuest",
|
|
15963
|
+
"summary": "Update a guest",
|
|
15964
|
+
"description": "Change a guest's name, email, phone or language. Email and phone are added as the guest's newest contact; earlier ones are kept.\n\n**Guests linked to a connected PMS** (created with `provider`, or imported from one) are changed in that PMS first. A PMS whose API cannot change guest profiles returns `422 pms_write_unsupported` naming it (Hostaway today) and nothing is written; `GET /v1/connect/{provider}` \u2192 `capabilities.pms.guests.update` says so beforehand. A revoked PMS connection is `403 connection_reauth_required`.\n\nSend `Idempotency-Key` to make a retry safe.",
|
|
15965
|
+
"tags": [
|
|
15966
|
+
"Guests"
|
|
15967
|
+
],
|
|
15968
|
+
"parameters": [
|
|
15969
|
+
{
|
|
15970
|
+
"name": "id",
|
|
15971
|
+
"in": "path",
|
|
15972
|
+
"required": true,
|
|
15973
|
+
"schema": {
|
|
15974
|
+
"type": "integer"
|
|
15975
|
+
}
|
|
15976
|
+
},
|
|
15977
|
+
{
|
|
15978
|
+
"$ref": "#/components/parameters/IdempotencyKey"
|
|
15979
|
+
}
|
|
15980
|
+
],
|
|
15981
|
+
"requestBody": {
|
|
15982
|
+
"required": true,
|
|
15983
|
+
"content": {
|
|
15984
|
+
"application/json": {
|
|
15985
|
+
"schema": {
|
|
15986
|
+
"$ref": "#/components/schemas/GuestUpdateRequest"
|
|
15987
|
+
}
|
|
15988
|
+
}
|
|
15989
|
+
}
|
|
15990
|
+
},
|
|
15991
|
+
"responses": {
|
|
15992
|
+
"200": {
|
|
15993
|
+
"description": "Guest updated (and in its PMS, when linked to one).",
|
|
15994
|
+
"content": {
|
|
15995
|
+
"application/json": {
|
|
15996
|
+
"schema": {
|
|
15997
|
+
"$ref": "#/components/schemas/GuestUpdateResponse"
|
|
15998
|
+
}
|
|
15999
|
+
}
|
|
16000
|
+
}
|
|
16001
|
+
},
|
|
16002
|
+
"401": {
|
|
16003
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
16004
|
+
},
|
|
16005
|
+
"403": {
|
|
16006
|
+
"$ref": "#/components/responses/ListingInactive"
|
|
16007
|
+
},
|
|
16008
|
+
"404": {
|
|
16009
|
+
"$ref": "#/components/responses/NotFound"
|
|
16010
|
+
},
|
|
16011
|
+
"422": {
|
|
16012
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
16013
|
+
}
|
|
16014
|
+
}
|
|
15651
16015
|
}
|
|
15652
16016
|
},
|
|
15653
16017
|
"/v1/conversations": {
|
|
@@ -17956,7 +18320,7 @@
|
|
|
17956
18320
|
"post": {
|
|
17957
18321
|
"operationId": "replyToReview",
|
|
17958
18322
|
"summary": "Reply to a review on any channel",
|
|
17959
|
-
"description": "Resolves the review, reads its channel and dispatches the reply. Channel-neutral: you do not need to know where the review came from.\n\nReplies work on Airbnb, Booking.com and VRBO. Each channel accepts one reply per review (VRBO: a second is `409 already_replied`; a review VRBO no longer takes a response to is `409 reply_not_allowed`). On VRBO the response is signed with a name \u2014 the connected account's host name, or `name` if you send it. A review from a channel without a reply API returns `422 unsupported_channel` naming the channels that do work.\n\nTo review a guest (Airbnb only), use `POST /v1/reviews/{id}/guest-review`.\n\n**Inactive listings:** a review of an inactive listing returns `403 listing_inactive` and no reply reaches the channel. Activate the listing first.",
|
|
18323
|
+
"description": "Resolves the review, reads its channel and dispatches the reply. Channel-neutral: you do not need to know where the review came from.\n\nReplies work on Airbnb, Booking.com and VRBO. Each channel accepts one reply per review (VRBO: a second is `409 already_replied`; a review VRBO no longer takes a response to is `409 reply_not_allowed`). On VRBO the response is signed with a name \u2014 the connected account's host name, or `name` if you send it. A review from a channel without a reply API returns `422 unsupported_channel` naming the channels that do work.\n\n**Reviews read from a PMS** (`pms` set on the review \u2014 Guesty, Hostaway, \u2026) are answered through that PMS. A PMS whose API has no reply returns `422 pms_write_unsupported` naming it (Hostaway today); `GET /v1/connect/{provider}` \u2192 `capabilities.pms.reviews.reply` says so beforehand. A revoked PMS connection is `403 connection_reauth_required`.\n\nTo review a guest (Airbnb only), use `POST /v1/reviews/{id}/guest-review`.\n\n**Inactive listings:** a review of an inactive listing returns `403 listing_inactive` and no reply reaches the channel. Activate the listing first.",
|
|
17960
18324
|
"tags": [
|
|
17961
18325
|
"Reviews"
|
|
17962
18326
|
],
|
|
@@ -18009,6 +18373,11 @@
|
|
|
18009
18373
|
"platform": {
|
|
18010
18374
|
"type": "string"
|
|
18011
18375
|
},
|
|
18376
|
+
"pms": {
|
|
18377
|
+
"type": "string",
|
|
18378
|
+
"nullable": true,
|
|
18379
|
+
"description": "The PMS the reply went through, when the review came from one."
|
|
18380
|
+
},
|
|
18012
18381
|
"response": {
|
|
18013
18382
|
"type": "string"
|
|
18014
18383
|
}
|
|
@@ -23697,7 +24066,7 @@
|
|
|
23697
24066
|
"put": {
|
|
23698
24067
|
"operationId": "updateListingContent",
|
|
23699
24068
|
"summary": "Update canonical listing content",
|
|
23700
|
-
"description": "Write your PMS's canonical listing content \u2014 title, description, amenities, address, occupancy, and policies \u2014 into a Repull listing, making it the source of truth. This is the flagship \"the PMS owns listing content, Repull distributes it\" enabler.\n\n**Partial update:** every field is optional. Only the fields you send are written; absent fields are left untouched. `amenities` is a FULL replacement of the amenity set (omit to leave untouched, send `[]` to clear).\n\n**Multilingual:** send `locale` to say which language this copy is in (`it`, `pt-BR`, \u2026). Canonical content is stored per locale, so each language keeps its own row instead of overwriting the English one. Omit it for English.\n\n**Local write only \u2014 NOT a channel publish.** This mutates Repull's own copy of the content. It does NOT push to Airbnb / Booking.com; it marks the channels dirty so a later publish knows what changed. Distribution stays a separate explicit step.\n\n**Photos are deferred:** a provided `photos` array is echoed back in the `deferred` field and NOT persisted (media ingestion is a follow-up).\n\nCross-tenant access (a listing that belongs to a different workspace) returns 404 \u2014 never 403. This endpoint is served even when the account is over the plan-listings cap, since editing content on a listing you already own never grows the portfolio.\n\nReturns `403 listing_inactive` when the listing is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
|
|
24069
|
+
"description": "Write your PMS's canonical listing content \u2014 title, description, amenities, address, occupancy, and policies \u2014 into a Repull listing, making it the source of truth. This is the flagship \"the PMS owns listing content, Repull distributes it\" enabler.\n\n**Listings managed in a connected PMS** (Guesty, Hostaway, \u2026): the PMS owns their content, so title, descriptions, check-in/out times, capacity, amenities, house rules, address and added photos are written to the PMS first; Repull keeps only what it accepted (refused sections are in `deferred`, its per-section outcome in `pms`). A section that PMS cannot write returns `422 pms_write_unsupported` naming it when nothing was applied (or is listed in `deferred` when other sections were); `GET /v1/listings/{id}` \u2192 `capabilities.pms.listings` says which sections it takes. A PMS whose connector writes no listing content at all (Mews, Cloudbeds, Lodgify, \u2026) keeps today's behaviour: the content is written to Repull only. Send photos with `photosMode: \"append\"` \u2014 replacing a PMS listing's photo set needs the PMS's own photo ids. A revoked PMS connection is `403 connection_reauth_required`.\n\n**Partial update:** every field is optional. Only the fields you send are written; absent fields are left untouched. `amenities` is a FULL replacement of the amenity set (omit to leave untouched, send `[]` to clear).\n\n**Multilingual:** send `locale` to say which language this copy is in (`it`, `pt-BR`, \u2026). Canonical content is stored per locale, so each language keeps its own row instead of overwriting the English one. Omit it for English.\n\n**Local write only \u2014 NOT a channel publish.** This mutates Repull's own copy of the content. It does NOT push to Airbnb / Booking.com; it marks the channels dirty so a later publish knows what changed. Distribution stays a separate explicit step.\n\n**Photos are deferred:** a provided `photos` array is echoed back in the `deferred` field and NOT persisted (media ingestion is a follow-up).\n\nCross-tenant access (a listing that belongs to a different workspace) returns 404 \u2014 never 403. This endpoint is served even when the account is over the plan-listings cap, since editing content on a listing you already own never grows the portfolio.\n\nReturns `403 listing_inactive` when the listing is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.",
|
|
23701
24070
|
"tags": [
|
|
23702
24071
|
"Listings"
|
|
23703
24072
|
],
|
|
@@ -29194,7 +29563,7 @@
|
|
|
29194
29563
|
"post": {
|
|
29195
29564
|
"operationId": "preapprove_conversation",
|
|
29196
29565
|
"summary": "Pre-approve an inquiry (Airbnb, VRBO)",
|
|
29197
|
-
"description": "Pre-approve the inquiry on this conversation: the guest who asked about dates may now book them at the listed price, without waiting on you. To change the dates, guests or price, send a special offer instead (`POST /v1/conversations/{id}/special-offers`).\n\nFind inquiries that need an answer with `GET /v1/inquiries` (default `status=open`); each carries the `conversationId` to use here.\n\nOne endpoint for every channel with pre-approvals: **Airbnb** (listings connected directly) and **VRBO**. A Booking.com or direct-booking conversation
|
|
29566
|
+
"description": "Pre-approve the inquiry on this conversation: the guest who asked about dates may now book them at the listed price, without waiting on you. To change the dates, guests or price, send a special offer instead (`POST /v1/conversations/{id}/special-offers`).\n\nFind inquiries that need an answer with `GET /v1/inquiries` (default `status=open`); each carries the `conversationId` to use here.\n\nOne endpoint for every channel with pre-approvals: **Airbnb** (listings connected directly) and **VRBO**. A Booking.com or direct-booking conversation returns `422 channel_not_supported` and nothing is sent \u2014 `GET /v1/conversations/{id}` \u2192 `capabilities.canPreApprove` says where it works.\n\n**An inquiry relayed by a PMS** (Guesty, Hostaway, \u2026) is pre-approved in that PMS. A PMS whose API cannot returns `422 pms_write_unsupported` naming it (Hostaway today); `GET /v1/connect/{provider}` \u2192 `capabilities.pms.reservations.preapprove` says so beforehand. The response then carries `pms`.\n\n`blockInstantBooking` is Airbnb only (VRBO has no such switch: `422 invalid_params`). `message` is sent to the guest with a VRBO pre-approval (a friendly default otherwise).\n\nThe inquiry is marked `pre_approved` everywhere, the same as pre-approving on the channel. Withdraw it with `DELETE /v1/conversations/{id}/pre-approval` (VRBO).\n\nA channel\u2019s refusal is never reported as a success: an inquiry that already moved on is `409 inquiry_no_longer_open`, an expired one `409 inquiry_expired`, a conversation that already has a booking `409 conversation_already_booked`.\n\nSend `Idempotency-Key`: a repeat with the same key replays the first response instead of acting twice (a `409 idempotency_key_in_use` while the first is still running). A 5xx, a `429 airbnb_rate_limited` or a `403 connection_reauth_required` is not stored \u2014 nothing was done \u2014 so retrying with the same key reaches Airbnb again.",
|
|
29198
29567
|
"tags": [
|
|
29199
29568
|
"Conversations"
|
|
29200
29569
|
],
|
|
@@ -29450,7 +29819,7 @@
|
|
|
29450
29819
|
"error": {
|
|
29451
29820
|
"code": "channel_not_supported",
|
|
29452
29821
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
29453
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
29822
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
29454
29823
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
29455
29824
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
29456
29825
|
"channel": "booking"
|
|
@@ -29694,7 +30063,7 @@
|
|
|
29694
30063
|
"error": {
|
|
29695
30064
|
"code": "channel_not_supported",
|
|
29696
30065
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
29697
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
30066
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
29698
30067
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
29699
30068
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
29700
30069
|
"channel": "booking"
|
|
@@ -30403,7 +30772,7 @@
|
|
|
30403
30772
|
"error": {
|
|
30404
30773
|
"code": "channel_not_supported",
|
|
30405
30774
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
30406
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
30775
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
30407
30776
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
30408
30777
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
30409
30778
|
"channel": "booking"
|
|
@@ -30829,7 +31198,7 @@
|
|
|
30829
31198
|
"error": {
|
|
30830
31199
|
"code": "channel_not_supported",
|
|
30831
31200
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
30832
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
31201
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
30833
31202
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
30834
31203
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
30835
31204
|
"channel": "booking"
|
|
@@ -31114,7 +31483,7 @@
|
|
|
31114
31483
|
"error": {
|
|
31115
31484
|
"code": "channel_not_supported",
|
|
31116
31485
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
31117
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
31486
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
31118
31487
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
31119
31488
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
31120
31489
|
"channel": "booking"
|
|
@@ -31453,7 +31822,7 @@
|
|
|
31453
31822
|
"post": {
|
|
31454
31823
|
"operationId": "accept_reservation_request",
|
|
31455
31824
|
"summary": "Accept a booking request",
|
|
31456
|
-
"description": "Accept a pending Airbnb booking request \u2014 a reservation with status `pending`, made on a listing without Instant Book. Find them with `GET /v1/reservations?status=pending`. Airbnb expires a request the host has not answered within 24 hours.\n\nAirbnb confirms asynchronously: the reservation\u2019s status moves to confirmed, and a `reservation.updated` webhook fires, when Airbnb\u2019s notification lands (usually within seconds). The response reports what Airbnb was asked to do.\n\n**Airbnb
|
|
31825
|
+
"description": "Accept a pending Airbnb booking request \u2014 a reservation with status `pending`, made on a listing without Instant Book. Find them with `GET /v1/reservations?status=pending`. Airbnb expires a request the host has not answered within 24 hours.\n\nAirbnb confirms asynchronously: the reservation\u2019s status moves to confirmed, and a `reservation.updated` webhook fires, when Airbnb\u2019s notification lands (usually within seconds). The response reports what Airbnb was asked to do.\n\n**Airbnb**, for listings connected to Airbnb directly; other channels have no request step (`422 channel_not_supported`). **A request relayed by a PMS** (Guesty, Hostaway, \u2026) is answered in that PMS, whatever channel it came from; a PMS whose API cannot answer requests returns `422 pms_write_unsupported` naming it (Hostaway today), and `GET /v1/connect/{provider}` \u2192 `capabilities.pms.reservations.respond` says so beforehand. The response then carries `pms`. A reservation that is not pending is refused before Airbnb is contacted (`409 reservation_not_pending`); one Airbnb says already moved on is `409 request_no_longer_pending`. Neither is worth retrying.\n\nTakes no body.\n\nSend `Idempotency-Key`: a repeat with the same key replays the first response instead of acting twice (a `409 idempotency_key_in_use` while the first is still running). A 5xx, a `429 airbnb_rate_limited` or a `403 connection_reauth_required` is not stored \u2014 nothing was done \u2014 so retrying with the same key reaches Airbnb again.",
|
|
31457
31826
|
"tags": [
|
|
31458
31827
|
"Reservations"
|
|
31459
31828
|
],
|
|
@@ -31684,7 +32053,7 @@
|
|
|
31684
32053
|
"error": {
|
|
31685
32054
|
"code": "channel_not_supported",
|
|
31686
32055
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
31687
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
32056
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
31688
32057
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
31689
32058
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
31690
32059
|
"channel": "booking"
|
|
@@ -31692,16 +32061,15 @@
|
|
|
31692
32061
|
}
|
|
31693
32062
|
},
|
|
31694
32063
|
"viaPms": {
|
|
31695
|
-
"summary": "
|
|
32064
|
+
"summary": "A booking relayed by a PMS whose API cannot answer requests",
|
|
31696
32065
|
"value": {
|
|
31697
32066
|
"error": {
|
|
31698
|
-
"code": "
|
|
31699
|
-
"message": "
|
|
31700
|
-
"fix": "
|
|
32067
|
+
"code": "pms_write_unsupported",
|
|
32068
|
+
"message": "Hostaway's API cannot accept or decline booking requests.",
|
|
32069
|
+
"fix": "Do it in Hostaway; the change reaches Repull with the next sync. `GET /v1/connect/hostaway` \u2192 `capabilities.pms` lists what Hostaway supports.",
|
|
31701
32070
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
31702
32071
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
31703
|
-
"
|
|
31704
|
-
"pms": "guesty"
|
|
32072
|
+
"provider": "hostaway"
|
|
31705
32073
|
}
|
|
31706
32074
|
}
|
|
31707
32075
|
},
|
|
@@ -32120,7 +32488,7 @@
|
|
|
32120
32488
|
"error": {
|
|
32121
32489
|
"code": "channel_not_supported",
|
|
32122
32490
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
32123
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
32491
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
32124
32492
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
32125
32493
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
32126
32494
|
"channel": "booking"
|
|
@@ -34308,7 +34676,7 @@
|
|
|
34308
34676
|
"error": {
|
|
34309
34677
|
"code": "channel_not_supported",
|
|
34310
34678
|
"message": "Reservation 233530 came from Booking.com. Booking requests can only be accepted or declined on Airbnb \u2014 other channels confirm instantly or have no request step.",
|
|
34311
|
-
"fix": "Pre-approvals and special offers work on Airbnb (connected directly
|
|
34679
|
+
"fix": "Pre-approvals and special offers work on Airbnb (connected directly) and VRBO; accepting/declining booking requests on Airbnb. Requests and inquiries relayed by a PMS are answered in that PMS (`pms_write_unsupported` when its API cannot). `GET /v1/conversations/{id}` \u2192 `capabilities` says what works on a conversation. Booking.com and direct bookings confirm without a request step.",
|
|
34312
34680
|
"docs_url": "https://repull.dev/docs/channels/airbnb/inquiries-and-requests",
|
|
34313
34681
|
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
|
|
34314
34682
|
"channel": "booking"
|
|
@@ -35656,7 +36024,7 @@
|
|
|
35656
36024
|
"post": {
|
|
35657
36025
|
"operationId": "quote_reservation",
|
|
35658
36026
|
"summary": "Quote a reservation in the PMS",
|
|
35659
|
-
"description": "Prices a stay and checks its availability **in the PMS that manages the listing**, without booking anything. It is the same check `POST /v1/reservations` makes before booking when no `totalPrice` is sent, so `available: true` with a `total` is what that create would be priced at (dates can still be taken in between).\n\n`available: false` is an answer, not an error: the PMS's reasons are in `restrictions` (minimum stay, closed to arrival, taken dates\u2026).\n\n- A listing **not managed in a PMS** answers `422 pms_not_linked`. Book it directly with `POST /v1/reservations`, or price it with `GET /v1/quotes`.\n- A PMS **without a quote API** (Mews, Cloudbeds, iGMS) answers `422 pms_write_unsupported`. You can still create the booking; on iGMS a `totalPrice` is required.\n\n`GET /v1/listings/{id}` \u2192 `capabilities.reservations.quote` says whether a listing can be quoted.\n\n### Per-PMS limits\n\n| PMS | create | change | cancel | quote | `totalPrice` | Limits |\n|---|---|---|---|---|---|---|\n| Mews | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 | \u2014 |\n| Cloudbeds | \u2713 | \u2713 | \u2713 | \u2013 | \u2013 | Books at the rate plan's price; group bookings supported. |\n| Hostaway | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Direct-channel bookings only; a specific unit is refused; a date change keeps the booked total. |\n| Guesty | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Cancels direct and Vrbo bookings; other channel bookings are cancelled on the channel. |\n| Beds24 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs the `write:bookings` scope; a multi-room property needs `unitId`. |\n| BookingSync | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs `bookings_write`; fees and taxes are not itemized; no guest email. |\n| Lodgify | \u2713 | \u2713 | \u2713 (declines) | \u2713 | \u2713 | Cancel declines the booking; single-room bookings. |\n| Smoobu | \u2713 | \u2713 (no dates) | \u2713 | \u2713 | \u2713 | Dates cannot be changed through Smoobu's API \u2014 cancel and rebook, or change them in Smoobu. |\n| Hospitable | \u2713 | \u2713 | \u2713 | \u2713 (Direct plan) | \u2713 | Manual reservations only; needs `reservation:write`; adds no fees or taxes. |\n| iGMS | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 (required) | iGMS direct bookings only; a price is required; no tentative holds. |\n| OwnerRez | \u2713 | \u2713 | \u2013 | \u2713 | \u2013 | No cancel through OwnerRez's API; priced by the property's own rates; needs the `full` scope. |\n\nEvery PMS except Cloudbeds refuses group bookings, and every vacation-rental PMS refuses to change or cancel a booking that came from a channel (Airbnb, Booking.com, Vrbo\u2026) \u2014 that is done on the channel.\n\n**Verification.** Mews and Cloudbeds were run end to end on their vendors' sandboxes. Every other PMS is **verified against the vendor's API documentation only** \u2014 no live account has been written to yet. `capabilities.reservations.verifiedAgainst` says which.\n\n`X-Account-Id` restricts the listing to one connected account. Returns `403 listing_inactive` when the listing is inactive.",
|
|
36027
|
+
"description": "Prices a stay and checks its availability **in the PMS that manages the listing**, without booking anything. It is the same check `POST /v1/reservations` makes before booking when no `totalPrice` is sent, so `available: true` with a `total` is what that create would be priced at (dates can still be taken in between).\n\n`available: false` is an answer, not an error: the PMS's reasons are in `restrictions` (minimum stay, closed to arrival, taken dates\u2026).\n\n- A listing **not managed in a PMS** answers `422 pms_not_linked`. Book it directly with `POST /v1/reservations`, or price it with `GET /v1/quotes`.\n- A PMS **without a quote API** (Mews, Cloudbeds, iGMS) answers `422 pms_write_unsupported`. You can still create the booking; on iGMS a `totalPrice` is required.\n\n`GET /v1/listings/{id}` \u2192 `capabilities.reservations.quote` says whether a listing can be quoted.\n\n### Per-PMS limits\n\n| PMS | create | change | cancel | quote | `totalPrice` | Limits |\n|---|---|---|---|---|---|---|\n| Mews | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 | \u2014 |\n| Cloudbeds | \u2713 | \u2713 | \u2713 | \u2013 | \u2013 | Books at the rate plan's price; group bookings supported. |\n| Hostaway | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Direct-channel bookings only; a specific unit is refused; a date change keeps the booked total. |\n| Guesty | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Cancels direct and Vrbo bookings; other channel bookings are cancelled on the channel. |\n| Beds24 | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs the `write:bookings` scope; a multi-room property needs `unitId`. |\n| BookingSync | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Needs `bookings_write`; fees and taxes are not itemized; no guest email. |\n| Lodgify | \u2713 | \u2713 | \u2713 (declines) | \u2713 | \u2713 | Cancel declines the booking; single-room bookings. |\n| Smoobu | \u2713 | \u2713 (no dates) | \u2713 | \u2713 | \u2713 | Dates cannot be changed through Smoobu's API \u2014 cancel and rebook, or change them in Smoobu. |\n| Hospitable | \u2713 | \u2713 | \u2713 | \u2713 (Direct plan) | \u2713 | Manual reservations only; needs `reservation:write`; adds no fees or taxes. |\n| iGMS | \u2713 | \u2713 | \u2713 | \u2013 | \u2713 (required) | iGMS direct bookings only; a price is required; no tentative holds. |\n| OwnerRez | \u2713 | \u2713 | \u2013 | \u2713 | \u2013 | No cancel through OwnerRez's API; priced by the property's own rates; needs the `full` scope. |\n| Track | \u2713 | \u2713 | \u2713 | \u2713 | \u2713 | Track decides Hold vs Confirmed from the property's channel mode; a set price on a Channel Key needs \"Allow Custom Pricing\"; a unit change needs `moveReasonId` on the connection; a date change re-prices at Track's current rates. |\n\nEvery PMS except Cloudbeds refuses group bookings, and every vacation-rental PMS refuses to change or cancel a booking that came from a channel (Airbnb, Booking.com, Vrbo\u2026) \u2014 that is done on the channel.\n\n**Verification.** Mews and Cloudbeds were run end to end on their vendors' sandboxes. Every other PMS is **verified against the vendor's API documentation only** \u2014 no live account has been written to yet. `capabilities.reservations.verifiedAgainst` says which.\n\n`X-Account-Id` restricts the listing to one connected account. Returns `403 listing_inactive` when the listing is inactive.",
|
|
35660
36028
|
"tags": [
|
|
35661
36029
|
"Reservations"
|
|
35662
36030
|
],
|
|
@@ -35940,6 +36308,380 @@
|
|
|
35940
36308
|
}
|
|
35941
36309
|
}
|
|
35942
36310
|
}
|
|
36311
|
+
},
|
|
36312
|
+
"/v1/connect/booking-extranet-login/recheck": {
|
|
36313
|
+
"post": {
|
|
36314
|
+
"operationId": "recheckBookingExtranetLogin",
|
|
36315
|
+
"summary": "Re-check Booking.com direct-login permissions",
|
|
36316
|
+
"description": "Re-runs the account import for a Booking.com direct-login connection after the host has granted the invited user full access in the Booking.com extranet (the `needs_permissions` state). Permissions are probed again and, once full access is in place, the connection continues to property details and room mapping \u2014 no new invitation is sent. Poll `GET /v1/connect/booking-extranet-login/status` for the result.\n\nCalled by the hosted Connect page. No API key \u2014 the session ID is the capability token.",
|
|
36317
|
+
"tags": [
|
|
36318
|
+
"Connect"
|
|
36319
|
+
],
|
|
36320
|
+
"security": [],
|
|
36321
|
+
"requestBody": {
|
|
36322
|
+
"required": true,
|
|
36323
|
+
"content": {
|
|
36324
|
+
"application/json": {
|
|
36325
|
+
"schema": {
|
|
36326
|
+
"type": "object",
|
|
36327
|
+
"properties": {
|
|
36328
|
+
"sessionId": {
|
|
36329
|
+
"type": "string",
|
|
36330
|
+
"description": "The Connect session ID (capability token)."
|
|
36331
|
+
},
|
|
36332
|
+
"accountId": {
|
|
36333
|
+
"type": "integer",
|
|
36334
|
+
"description": "The Booking.com direct-login connection id returned when the sign-in started."
|
|
36335
|
+
}
|
|
36336
|
+
},
|
|
36337
|
+
"required": [
|
|
36338
|
+
"sessionId",
|
|
36339
|
+
"accountId"
|
|
36340
|
+
]
|
|
36341
|
+
}
|
|
36342
|
+
}
|
|
36343
|
+
}
|
|
36344
|
+
},
|
|
36345
|
+
"responses": {
|
|
36346
|
+
"200": {
|
|
36347
|
+
"description": "Re-check queued",
|
|
36348
|
+
"content": {
|
|
36349
|
+
"application/json": {
|
|
36350
|
+
"schema": {
|
|
36351
|
+
"type": "object",
|
|
36352
|
+
"properties": {
|
|
36353
|
+
"ok": {
|
|
36354
|
+
"type": "boolean",
|
|
36355
|
+
"description": "Whether the re-check was queued."
|
|
36356
|
+
},
|
|
36357
|
+
"jobId": {
|
|
36358
|
+
"type": "string",
|
|
36359
|
+
"nullable": true,
|
|
36360
|
+
"description": "Id of the queued import job, when one was queued."
|
|
36361
|
+
}
|
|
36362
|
+
},
|
|
36363
|
+
"required": [
|
|
36364
|
+
"ok",
|
|
36365
|
+
"jobId"
|
|
36366
|
+
]
|
|
36367
|
+
}
|
|
36368
|
+
}
|
|
36369
|
+
}
|
|
36370
|
+
},
|
|
36371
|
+
"400": {
|
|
36372
|
+
"$ref": "#/components/responses/BadRequest"
|
|
36373
|
+
},
|
|
36374
|
+
"404": {
|
|
36375
|
+
"$ref": "#/components/responses/NotFound"
|
|
36376
|
+
},
|
|
36377
|
+
"409": {
|
|
36378
|
+
"$ref": "#/components/responses/Conflict"
|
|
36379
|
+
},
|
|
36380
|
+
"410": {
|
|
36381
|
+
"description": "The Connect session has expired (`session_expired`). Start a new session.",
|
|
36382
|
+
"content": {
|
|
36383
|
+
"application/json": {
|
|
36384
|
+
"schema": {
|
|
36385
|
+
"$ref": "#/components/schemas/Error"
|
|
36386
|
+
}
|
|
36387
|
+
}
|
|
36388
|
+
}
|
|
36389
|
+
},
|
|
36390
|
+
"500": {
|
|
36391
|
+
"$ref": "#/components/responses/InternalError"
|
|
36392
|
+
}
|
|
36393
|
+
}
|
|
36394
|
+
}
|
|
36395
|
+
},
|
|
36396
|
+
"/v1/connect/resume": {
|
|
36397
|
+
"get": {
|
|
36398
|
+
"operationId": "resumeConnect",
|
|
36399
|
+
"summary": "Open a connection's fix link",
|
|
36400
|
+
"description": "The target of a connection's `fixUrl`. Open it in the host's browser to send them back into Connect for an EXISTING connection \u2014 for example to grant the Booking.com extranet user full access after a `needs_permissions` state, or to reconnect a Smoobu account that still uses a legacy single API key with an API key + secret.\n\nEach open starts a fresh, short-lived Connect session bound to that connection and redirects (302) to the hosted Connect page, which shows the connection's current state. The link itself does not expire on its own schedule \u2014 store `fixUrl` and open it whenever the connection needs attention.\n\nNo API key \u2014 the signed `t` token is the capability. Supported for Booking.com extranet login and Smoobu connections.",
|
|
36401
|
+
"tags": [
|
|
36402
|
+
"Connect"
|
|
36403
|
+
],
|
|
36404
|
+
"security": [],
|
|
36405
|
+
"parameters": [
|
|
36406
|
+
{
|
|
36407
|
+
"name": "t",
|
|
36408
|
+
"in": "query",
|
|
36409
|
+
"required": true,
|
|
36410
|
+
"schema": {
|
|
36411
|
+
"type": "string"
|
|
36412
|
+
},
|
|
36413
|
+
"description": "The signed resume token, exactly as it appears in the connection's `fixUrl`."
|
|
36414
|
+
}
|
|
36415
|
+
],
|
|
36416
|
+
"responses": {
|
|
36417
|
+
"302": {
|
|
36418
|
+
"description": "Redirect to the hosted Connect page for a fresh session bound to the connection.",
|
|
36419
|
+
"headers": {
|
|
36420
|
+
"Location": {
|
|
36421
|
+
"description": "Hosted Connect page URL for the new session.",
|
|
36422
|
+
"schema": {
|
|
36423
|
+
"type": "string",
|
|
36424
|
+
"format": "uri"
|
|
36425
|
+
}
|
|
36426
|
+
}
|
|
36427
|
+
}
|
|
36428
|
+
},
|
|
36429
|
+
"400": {
|
|
36430
|
+
"description": "The link cannot be used: the token is missing, malformed or its signature does not verify (`invalid_resume_token`), the connection's channel has no hosted fix flow (`unsupported_channel`), or the connection id in the token is not valid (`bad_account`).",
|
|
36431
|
+
"content": {
|
|
36432
|
+
"application/json": {
|
|
36433
|
+
"schema": {
|
|
36434
|
+
"type": "object",
|
|
36435
|
+
"properties": {
|
|
36436
|
+
"error": {
|
|
36437
|
+
"type": "string",
|
|
36438
|
+
"enum": [
|
|
36439
|
+
"invalid_resume_token",
|
|
36440
|
+
"unsupported_channel",
|
|
36441
|
+
"bad_account"
|
|
36442
|
+
]
|
|
36443
|
+
},
|
|
36444
|
+
"reason": {
|
|
36445
|
+
"type": "string",
|
|
36446
|
+
"description": "Why the token was rejected (only with `invalid_resume_token`)."
|
|
36447
|
+
},
|
|
36448
|
+
"channel": {
|
|
36449
|
+
"type": "string",
|
|
36450
|
+
"description": "The token's channel (only with `unsupported_channel`)."
|
|
36451
|
+
}
|
|
36452
|
+
},
|
|
36453
|
+
"required": [
|
|
36454
|
+
"error"
|
|
36455
|
+
]
|
|
36456
|
+
}
|
|
36457
|
+
}
|
|
36458
|
+
}
|
|
36459
|
+
},
|
|
36460
|
+
"500": {
|
|
36461
|
+
"description": "The Connect session could not be started. Open the link again.",
|
|
36462
|
+
"content": {
|
|
36463
|
+
"application/json": {
|
|
36464
|
+
"schema": {
|
|
36465
|
+
"type": "object",
|
|
36466
|
+
"properties": {
|
|
36467
|
+
"error": {
|
|
36468
|
+
"type": "string",
|
|
36469
|
+
"enum": [
|
|
36470
|
+
"internal_error"
|
|
36471
|
+
]
|
|
36472
|
+
}
|
|
36473
|
+
},
|
|
36474
|
+
"required": [
|
|
36475
|
+
"error"
|
|
36476
|
+
]
|
|
36477
|
+
}
|
|
36478
|
+
}
|
|
36479
|
+
}
|
|
36480
|
+
}
|
|
36481
|
+
}
|
|
36482
|
+
}
|
|
36483
|
+
},
|
|
36484
|
+
"/v1/connect/track/credentials": {
|
|
36485
|
+
"post": {
|
|
36486
|
+
"operationId": "submitTrackCredentials",
|
|
36487
|
+
"summary": "Submit Track credentials for a Connect session",
|
|
36488
|
+
"description": "Completes a credentials-pattern connection for Track (TRACK Hospitality Software) with the property manager's Track domain and an API key + secret.\n\n**What syncs.** Units become listings; reservations (with their fee and tax breakdown) and guest message threads are imported, then polled for changes. Bookings can be created, quoted, changed and cancelled in Track \u2014 see `capabilities.reservations` on `GET /v1/connect/track`.\n\n**Which key.** A **Server Key** \u2014 created in Track under Configuration \u2192 Company Setup \u2192 API Keys \u2014 has full access and is recommended. A **Channel Key** \u2014 under Configuration \u2192 PMS Setup \u2192 Distribution Channels \u2014 only allows booking. `keyType` defaults to `server`.\n\nThe key is validated against Track before anything is stored, so an invalid key returns `invalid_credentials` rather than creating a dead connection. On success only the credential fields below are stored, and the first sync of listings and reservations is queued.\n\nTrack has no webhooks: after the first sync, reservation and message changes are picked up by polling about once a minute.\n\nReconnecting replaces the stored credentials on the workspace's existing Track connection \u2014 the `pmsConnectionId` stays the same.\n\nNo API key required when called with a `sessionId` \u2014 the session is the capability token.",
|
|
36489
|
+
"tags": [
|
|
36490
|
+
"Connect"
|
|
36491
|
+
],
|
|
36492
|
+
"requestBody": {
|
|
36493
|
+
"required": true,
|
|
36494
|
+
"content": {
|
|
36495
|
+
"application/json": {
|
|
36496
|
+
"schema": {
|
|
36497
|
+
"type": "object",
|
|
36498
|
+
"properties": {
|
|
36499
|
+
"sessionId": {
|
|
36500
|
+
"type": "string",
|
|
36501
|
+
"description": "Connect session id from `POST /v1/connect/track`. Omit when calling with your API key."
|
|
36502
|
+
},
|
|
36503
|
+
"writePolicy": {
|
|
36504
|
+
"type": "object",
|
|
36505
|
+
"description": "Optional: what the app may change in Track, set before the first sync. Same shape as `PATCH /v1/connect/{provider}/write-policy`; switches you leave out keep the provider default (everything on).",
|
|
36506
|
+
"example": {
|
|
36507
|
+
"reservations": {
|
|
36508
|
+
"api": false
|
|
36509
|
+
}
|
|
36510
|
+
}
|
|
36511
|
+
},
|
|
36512
|
+
"credentials": {
|
|
36513
|
+
"type": "object",
|
|
36514
|
+
"description": "The Track domain and an API key + secret.",
|
|
36515
|
+
"properties": {
|
|
36516
|
+
"domain": {
|
|
36517
|
+
"type": "string",
|
|
36518
|
+
"description": "Your Track domain: `acme.trackhs.com`, or just the subdomain `acme`. A full URL is accepted; only the host is kept.",
|
|
36519
|
+
"example": "acme.trackhs.com"
|
|
36520
|
+
},
|
|
36521
|
+
"apiKey": {
|
|
36522
|
+
"type": "string",
|
|
36523
|
+
"description": "Track API key."
|
|
36524
|
+
},
|
|
36525
|
+
"apiSecret": {
|
|
36526
|
+
"type": "string",
|
|
36527
|
+
"description": "Track API secret, shown next to the key in Track."
|
|
36528
|
+
},
|
|
36529
|
+
"keyType": {
|
|
36530
|
+
"type": "string",
|
|
36531
|
+
"enum": [
|
|
36532
|
+
"server",
|
|
36533
|
+
"channel"
|
|
36534
|
+
],
|
|
36535
|
+
"default": "server",
|
|
36536
|
+
"description": "`server` \u2014 a Server Key (Company Setup \u2192 API Keys), full access, recommended. `channel` \u2014 a Channel Key (PMS Setup \u2192 Distribution Channels), booking only."
|
|
36537
|
+
},
|
|
36538
|
+
"authMode": {
|
|
36539
|
+
"type": "string",
|
|
36540
|
+
"enum": [
|
|
36541
|
+
"hmac",
|
|
36542
|
+
"basic"
|
|
36543
|
+
],
|
|
36544
|
+
"default": "hmac",
|
|
36545
|
+
"description": "How requests to Track are signed. Leave the default unless Track support told you otherwise."
|
|
36546
|
+
},
|
|
36547
|
+
"hmacRealm": {
|
|
36548
|
+
"type": "string",
|
|
36549
|
+
"description": "HMAC realm. Defaults to `Acquia`, the realm Track's HMAC signing uses."
|
|
36550
|
+
},
|
|
36551
|
+
"secretIsBase64": {
|
|
36552
|
+
"type": "boolean",
|
|
36553
|
+
"default": true,
|
|
36554
|
+
"description": "Whether `apiSecret` is base64-encoded, as Track issues it. Set false to sign with the secret's raw text."
|
|
36555
|
+
},
|
|
36556
|
+
"paymentTypeId": {
|
|
36557
|
+
"type": "integer",
|
|
36558
|
+
"description": "The Track payment type that payments recorded through this connection are posted to."
|
|
36559
|
+
},
|
|
36560
|
+
"moveReasonId": {
|
|
36561
|
+
"type": "integer",
|
|
36562
|
+
"description": "The Track move reason used when a reservation is moved to another unit. Without it, unit changes are refused."
|
|
36563
|
+
}
|
|
36564
|
+
},
|
|
36565
|
+
"required": [
|
|
36566
|
+
"domain",
|
|
36567
|
+
"apiKey",
|
|
36568
|
+
"apiSecret"
|
|
36569
|
+
]
|
|
36570
|
+
}
|
|
36571
|
+
},
|
|
36572
|
+
"required": [
|
|
36573
|
+
"credentials"
|
|
36574
|
+
]
|
|
36575
|
+
},
|
|
36576
|
+
"example": {
|
|
36577
|
+
"credentials": {
|
|
36578
|
+
"domain": "acme.trackhs.com",
|
|
36579
|
+
"apiKey": "trk_live_\u2026",
|
|
36580
|
+
"apiSecret": "\u2026"
|
|
36581
|
+
}
|
|
36582
|
+
}
|
|
36583
|
+
}
|
|
36584
|
+
}
|
|
36585
|
+
},
|
|
36586
|
+
"responses": {
|
|
36587
|
+
"200": {
|
|
36588
|
+
"description": "Credentials accepted, the connection stored and its first sync queued",
|
|
36589
|
+
"content": {
|
|
36590
|
+
"application/json": {
|
|
36591
|
+
"schema": {
|
|
36592
|
+
"type": "object",
|
|
36593
|
+
"properties": {
|
|
36594
|
+
"provider": {
|
|
36595
|
+
"type": "string",
|
|
36596
|
+
"example": "track"
|
|
36597
|
+
},
|
|
36598
|
+
"connected": {
|
|
36599
|
+
"type": "boolean"
|
|
36600
|
+
},
|
|
36601
|
+
"pmsConnectionId": {
|
|
36602
|
+
"type": "string",
|
|
36603
|
+
"description": "Id of the stored connection."
|
|
36604
|
+
},
|
|
36605
|
+
"created": {
|
|
36606
|
+
"type": "boolean",
|
|
36607
|
+
"description": "False when an existing connection was updated."
|
|
36608
|
+
},
|
|
36609
|
+
"sessionId": {
|
|
36610
|
+
"type": "string",
|
|
36611
|
+
"nullable": true
|
|
36612
|
+
},
|
|
36613
|
+
"accountInfo": {
|
|
36614
|
+
"type": "object",
|
|
36615
|
+
"properties": {
|
|
36616
|
+
"domain": {
|
|
36617
|
+
"type": "string",
|
|
36618
|
+
"description": "The Track host the connection calls.",
|
|
36619
|
+
"example": "acme.trackhs.com"
|
|
36620
|
+
},
|
|
36621
|
+
"keyType": {
|
|
36622
|
+
"type": "string",
|
|
36623
|
+
"enum": [
|
|
36624
|
+
"server",
|
|
36625
|
+
"channel"
|
|
36626
|
+
]
|
|
36627
|
+
},
|
|
36628
|
+
"authMode": {
|
|
36629
|
+
"type": "string",
|
|
36630
|
+
"enum": [
|
|
36631
|
+
"hmac",
|
|
36632
|
+
"basic"
|
|
36633
|
+
]
|
|
36634
|
+
},
|
|
36635
|
+
"accountName": {
|
|
36636
|
+
"type": "string",
|
|
36637
|
+
"nullable": true
|
|
36638
|
+
}
|
|
36639
|
+
}
|
|
36640
|
+
},
|
|
36641
|
+
"firstSync": {
|
|
36642
|
+
"type": "object",
|
|
36643
|
+
"description": "Whether the first import of listings and reservations was queued. When it was not, the connection still stands and polling syncs it.",
|
|
36644
|
+
"properties": {
|
|
36645
|
+
"queued": {
|
|
36646
|
+
"type": "boolean"
|
|
36647
|
+
},
|
|
36648
|
+
"error": {
|
|
36649
|
+
"type": "string"
|
|
36650
|
+
}
|
|
36651
|
+
}
|
|
36652
|
+
},
|
|
36653
|
+
"writePolicy": {
|
|
36654
|
+
"$ref": "#/components/schemas/PmsWritePolicy"
|
|
36655
|
+
}
|
|
36656
|
+
}
|
|
36657
|
+
}
|
|
36658
|
+
}
|
|
36659
|
+
}
|
|
36660
|
+
},
|
|
36661
|
+
"400": {
|
|
36662
|
+
"$ref": "#/components/responses/BadRequest"
|
|
36663
|
+
},
|
|
36664
|
+
"401": {
|
|
36665
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
36666
|
+
},
|
|
36667
|
+
"404": {
|
|
36668
|
+
"$ref": "#/components/responses/NotFound"
|
|
36669
|
+
},
|
|
36670
|
+
"422": {
|
|
36671
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
36672
|
+
},
|
|
36673
|
+
"502": {
|
|
36674
|
+
"description": "Track could not be reached (`network_error`). Nothing was stored.",
|
|
36675
|
+
"content": {
|
|
36676
|
+
"application/json": {
|
|
36677
|
+
"schema": {
|
|
36678
|
+
"$ref": "#/components/schemas/Error"
|
|
36679
|
+
}
|
|
36680
|
+
}
|
|
36681
|
+
}
|
|
36682
|
+
}
|
|
36683
|
+
}
|
|
36684
|
+
}
|
|
35943
36685
|
}
|
|
35944
36686
|
}
|
|
35945
36687
|
}
|