repull 0.2.21 → 0.2.23
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 +69 -30
- data/lib/repull/api/atlas_api.rb +1 -1
- data/lib/repull/api/availability_api.rb +3 -3
- data/lib/repull/api/billing_api.rb +1 -1
- data/lib/repull/api/booking_com_api.rb +5 -5
- data/lib/repull/api/connect_api.rb +137 -1
- data/lib/repull/api/conversations_api.rb +3 -3
- data/lib/repull/api/guests_api.rb +3 -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 +70 -7
- 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 +71 -1
- 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 +2 -2
- 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 +281 -0
- data/lib/repull/models/airbnb_host_review_submit_category_ratings_inner.rb +261 -0
- data/lib/repull/models/airbnb_listing.rb +4 -4
- 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 +2 -2
- 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_permits_write_request_permits_inner_answers_value.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_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 +216 -217
- data/lib/repull/models/airbnb_transaction_fees.rb +164 -0
- data/lib/repull/models/airbnb_transaction_payout.rb +47 -6
- data/lib/repull/models/alteration_change.rb +1 -1
- data/lib/repull/models/alteration_webhook_object.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 +259 -0
- data/lib/repull/models/{airbnb_transaction_guest_breakdown.rb → cancel_reservation200_response_pms.rb} +28 -29
- data/lib/repull/models/cancel_reservation200_response_pms_errors_inner.rb +165 -0
- data/lib/repull/models/cancel_reservation_request.rb +148 -0
- data/lib/repull/models/channel_market_state_item.rb +2 -2
- 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_status.rb +1 -1
- data/lib/repull/models/connect_status_accounts_inner.rb +1 -1
- data/lib/repull/models/connection.rb +1 -1
- data/lib/repull/models/connection_list_response.rb +11 -2
- data/lib/repull/models/conversation.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_guests.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request.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_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_health200_response.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 +14 -5
- 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 +1 -1
- data/lib/repull/models/guest_create_response.rb +1 -1
- data/lib/repull/models/guest_create_response_contacts_inner.rb +1 -1
- data/lib/repull/models/guest_flag.rb +2 -2
- 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 +2 -2
- data/lib/repull/models/guest_reservations_summary.rb +1 -1
- 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/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 +28 -2
- data/lib/repull/models/list_booking_reservations200_response.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 +167 -0
- data/lib/repull/models/list_listing_units200_response_data_inner.rb +207 -0
- data/lib/repull/models/list_migrations200_response.rb +1 -1
- data/lib/repull/models/listing.rb +14 -2
- 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_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 +1 -1
- 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 +11 -2
- 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 +19 -3
- data/lib/repull/models/listing_photo_upload_url_response.rb +16 -6
- 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 +2 -2
- 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 +204 -0
- 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 +17 -6
- data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
- data/lib/repull/models/map_connect_booking_rooms_response.rb +29 -8
- 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 +3 -3
- 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 +281 -0
- data/lib/repull/models/payout_completed_payload.rb +257 -0
- data/lib/repull/models/plan_notice.rb +283 -0
- data/lib/repull/models/plumguide_listing.rb +1 -1
- data/lib/repull/models/plumguide_listing_list_response.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/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 +41 -5
- data/lib/repull/models/property_list_response.rb +11 -2
- 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/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 +1 -1
- 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 +12 -2
- 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_create_request.rb +1 -1
- data/lib/repull/models/reservation_create_response.rb +27 -7
- data/lib/repull/models/reservation_create_response_pms.rb +180 -0
- data/lib/repull/models/reservation_create_response_unit.rb +158 -0
- 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 +281 -0
- data/lib/repull/models/reservation_message_sent_payload.rb +263 -0
- data/lib/repull/models/reservation_message_sent_payload_from.rb +158 -0
- data/lib/repull/models/{airbnb_transaction_host_breakdown.rb → reservation_message_updated_event.rb} +128 -93
- data/lib/repull/models/reservation_message_updated_payload.rb +244 -0
- data/lib/repull/models/reservation_message_updated_payload_from.rb +157 -0
- data/lib/repull/models/reservation_money_line.rb +1 -1
- data/lib/repull/models/reservation_occupancy.rb +1 -1
- data/lib/repull/models/reservation_primary_guest.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 +159 -0
- 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/review.rb +2 -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/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 +1 -1
- 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/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 +204 -0
- data/lib/repull/models/submit_cloudbeds_credentials200_response_account_info.rb +170 -0
- data/lib/repull/models/submit_cloudbeds_credentials200_response_webhooks.rb +158 -0
- data/lib/repull/models/submit_cloudbeds_credentials_request.rb +174 -0
- data/lib/repull/models/submit_cloudbeds_credentials_request_credentials.rb +178 -0
- 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 +204 -0
- data/lib/repull/models/submit_mews_credentials200_response_account_info.rb +170 -0
- data/lib/repull/models/submit_mews_credentials_request.rb +174 -0
- data/lib/repull/models/submit_mews_credentials_request_credentials.rb +212 -0
- 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_vrbo_credentials_request.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions200_response.rb +34 -6
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner.rb +254 -0
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner_error.rb +191 -0
- data/lib/repull/models/sync_airbnb_transactions_request.rb +4 -3
- 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_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_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_listing.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 +7 -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 +5 -2
- 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_special_offer200_response.rb +1 -1
- data/lib/repull/version.rb +2 -2
- data/lib/repull.rb +34 -3
- data/openapi/v1.json +1429 -251
- metadata +35 -4
data/openapi/v1.json
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
"version": "1.0.0",
|
|
6
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` | 50 |\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
|
-
"email": "ivan@vanio.ai",
|
|
9
8
|
"url": "https://repull.dev"
|
|
10
9
|
},
|
|
11
10
|
"license": {
|
|
@@ -117,7 +116,7 @@
|
|
|
117
116
|
},
|
|
118
117
|
{
|
|
119
118
|
"name": "Markets",
|
|
120
|
-
"description": "Atlas market intelligence \u2014 per-city KPIs, comp distributions, calendar-level demand, and events. Sourced from Atlas
|
|
119
|
+
"description": "Atlas market intelligence \u2014 per-city KPIs, comp distributions, calendar-level demand, and events. Sourced from Atlas market data merged with the customer's own listing data."
|
|
121
120
|
},
|
|
122
121
|
{
|
|
123
122
|
"name": "Atlas",
|
|
@@ -237,7 +236,8 @@
|
|
|
237
236
|
"date",
|
|
238
237
|
"available",
|
|
239
238
|
"price",
|
|
240
|
-
"minNights"
|
|
239
|
+
"minNights",
|
|
240
|
+
"availableUnits"
|
|
241
241
|
],
|
|
242
242
|
"properties": {
|
|
243
243
|
"date": {
|
|
@@ -259,6 +259,12 @@
|
|
|
259
259
|
"type": "integer",
|
|
260
260
|
"description": "Minimum-stay requirement for a stay starting on this date. Falls back to the listing-level default min-nights when the calendar row carries none.",
|
|
261
261
|
"example": 2
|
|
262
|
+
},
|
|
263
|
+
"availableUnits": {
|
|
264
|
+
"type": "integer",
|
|
265
|
+
"minimum": 0,
|
|
266
|
+
"description": "Units still sellable that night. 1 or 0 for a single home. For a hotel-model listing (a Mews or Cloudbeds room type) the rooms of that type left, e.g. 3 of 5 \u2014 see `GET /v1/listings/{id}/units`. `available` is false whenever this is 0.",
|
|
267
|
+
"example": 1
|
|
262
268
|
}
|
|
263
269
|
}
|
|
264
270
|
},
|
|
@@ -605,6 +611,22 @@
|
|
|
605
611
|
"description": "Channel-side confirmation code (Airbnb HMxxx, Booking.com numeric, etc.).",
|
|
606
612
|
"example": "HMXYZ123"
|
|
607
613
|
},
|
|
614
|
+
"unit": {
|
|
615
|
+
"type": "object",
|
|
616
|
+
"nullable": true,
|
|
617
|
+
"description": "The physical room the stay was assigned, for a hotel-model PMS (Mews, Cloudbeds) where the listing is a room type. `null` when no room is assigned yet, and for every listing that is a single home.",
|
|
618
|
+
"properties": {
|
|
619
|
+
"id": {
|
|
620
|
+
"type": "string",
|
|
621
|
+
"description": "The room id, as listed by `GET /v1/listings/{id}/units`."
|
|
622
|
+
},
|
|
623
|
+
"name": {
|
|
624
|
+
"type": "string",
|
|
625
|
+
"nullable": true,
|
|
626
|
+
"example": "101"
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
},
|
|
608
630
|
"primaryGuest": {
|
|
609
631
|
"allOf": [
|
|
610
632
|
{
|
|
@@ -776,7 +798,7 @@
|
|
|
776
798
|
},
|
|
777
799
|
"GuestFlag": {
|
|
778
800
|
"type": "object",
|
|
779
|
-
"description": "A risk/operational flag attached to a guest profile (e.g. blacklist, do-not-host, VIP).
|
|
801
|
+
"description": "A risk/operational flag attached to a guest profile (e.g. blacklist, do-not-host, VIP).",
|
|
780
802
|
"properties": {
|
|
781
803
|
"type": {
|
|
782
804
|
"type": "string",
|
|
@@ -896,7 +918,7 @@
|
|
|
896
918
|
"riskLevel": {
|
|
897
919
|
"type": "string",
|
|
898
920
|
"nullable": true,
|
|
899
|
-
"description": "
|
|
921
|
+
"description": "Risk score (e.g. `low`, `medium`, `high`)."
|
|
900
922
|
},
|
|
901
923
|
"verificationLevel": {
|
|
902
924
|
"type": "string",
|
|
@@ -1195,11 +1217,11 @@
|
|
|
1195
1217
|
},
|
|
1196
1218
|
"isAutomated": {
|
|
1197
1219
|
"type": "boolean",
|
|
1198
|
-
"description": "`true` when the message was sent by
|
|
1220
|
+
"description": "`true` when the message was sent by an automation (template, schedule, etc.)."
|
|
1199
1221
|
},
|
|
1200
1222
|
"aiGenerated": {
|
|
1201
1223
|
"type": "boolean",
|
|
1202
|
-
"description": "`true` when the body was
|
|
1224
|
+
"description": "`true` when the body was written by AI (autopilot, draft)."
|
|
1203
1225
|
},
|
|
1204
1226
|
"sentAt": {
|
|
1205
1227
|
"type": "string",
|
|
@@ -1251,7 +1273,7 @@
|
|
|
1251
1273
|
},
|
|
1252
1274
|
"Review": {
|
|
1253
1275
|
"type": "object",
|
|
1254
|
-
"description": "A guest or host review unified across channels. Returned by `GET /v1/reviews` and `GET /v1/reviews/{id}`.
|
|
1276
|
+
"description": "A guest or host review unified across channels. Returned by `GET /v1/reviews` and `GET /v1/reviews/{id}`. Includes every channel's reviews once they have been imported.",
|
|
1255
1277
|
"properties": {
|
|
1256
1278
|
"id": {
|
|
1257
1279
|
"type": "string",
|
|
@@ -1947,7 +1969,7 @@
|
|
|
1947
1969
|
"type": "string",
|
|
1948
1970
|
"nullable": true,
|
|
1949
1971
|
"description": "Provider-side account ID (e.g. the Airbnb host ID).",
|
|
1950
|
-
"example": "
|
|
1972
|
+
"example": "10000001"
|
|
1951
1973
|
},
|
|
1952
1974
|
"createdAt": {
|
|
1953
1975
|
"type": "string",
|
|
@@ -2255,6 +2277,8 @@
|
|
|
2255
2277
|
"reservation.updated",
|
|
2256
2278
|
"reservation.cancelled",
|
|
2257
2279
|
"reservation.message.received",
|
|
2280
|
+
"reservation.message.sent",
|
|
2281
|
+
"reservation.message.updated",
|
|
2258
2282
|
"reservation.alteration.created",
|
|
2259
2283
|
"reservation.alteration.responded",
|
|
2260
2284
|
"reservation.request.created",
|
|
@@ -2275,6 +2299,7 @@
|
|
|
2275
2299
|
"ai.operation.failed",
|
|
2276
2300
|
"payment.completed",
|
|
2277
2301
|
"payment.refunded",
|
|
2302
|
+
"payout.completed",
|
|
2278
2303
|
"migration.completed",
|
|
2279
2304
|
"migration.failed",
|
|
2280
2305
|
"repull.ping",
|
|
@@ -2464,6 +2489,138 @@
|
|
|
2464
2489
|
}
|
|
2465
2490
|
}
|
|
2466
2491
|
},
|
|
2492
|
+
"ReservationMessageSentPayload": {
|
|
2493
|
+
"type": "object",
|
|
2494
|
+
"description": "Payload for `reservation.message.sent`: a host-side message was sent on a reservation thread. Same fields as `reservation.message.received`, plus `source`.",
|
|
2495
|
+
"properties": {
|
|
2496
|
+
"reservationId": {
|
|
2497
|
+
"type": "integer",
|
|
2498
|
+
"nullable": true,
|
|
2499
|
+
"example": 235970
|
|
2500
|
+
},
|
|
2501
|
+
"threadId": {
|
|
2502
|
+
"type": "string",
|
|
2503
|
+
"example": "161347"
|
|
2504
|
+
},
|
|
2505
|
+
"messageId": {
|
|
2506
|
+
"type": "string",
|
|
2507
|
+
"description": "Repull message id, as `GET /v1/conversations/{id}/messages` returns it.",
|
|
2508
|
+
"example": "1854462"
|
|
2509
|
+
},
|
|
2510
|
+
"externalMessageId": {
|
|
2511
|
+
"type": "string",
|
|
2512
|
+
"nullable": true,
|
|
2513
|
+
"description": "The channel's own message id. Dedupe on it.",
|
|
2514
|
+
"example": "32877308873"
|
|
2515
|
+
},
|
|
2516
|
+
"channel": {
|
|
2517
|
+
"type": "string",
|
|
2518
|
+
"example": "airbnb"
|
|
2519
|
+
},
|
|
2520
|
+
"source": {
|
|
2521
|
+
"type": "string",
|
|
2522
|
+
"description": "`channel`: sent in the channel's own app (e.g. the Airbnb app). `repull`: sent through Repull \u2014 the API, the dashboard, an automation or AI."
|
|
2523
|
+
},
|
|
2524
|
+
"from": {
|
|
2525
|
+
"type": "object",
|
|
2526
|
+
"properties": {
|
|
2527
|
+
"type": {
|
|
2528
|
+
"type": "string",
|
|
2529
|
+
"example": "host",
|
|
2530
|
+
"description": "`host` or `co-host`."
|
|
2531
|
+
},
|
|
2532
|
+
"name": {
|
|
2533
|
+
"type": "string",
|
|
2534
|
+
"nullable": true
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2537
|
+
},
|
|
2538
|
+
"body": {
|
|
2539
|
+
"type": "string"
|
|
2540
|
+
},
|
|
2541
|
+
"sentAt": {
|
|
2542
|
+
"type": "string",
|
|
2543
|
+
"format": "date-time"
|
|
2544
|
+
},
|
|
2545
|
+
"direction": {
|
|
2546
|
+
"type": "string"
|
|
2547
|
+
},
|
|
2548
|
+
"isAutomated": {
|
|
2549
|
+
"type": "boolean"
|
|
2550
|
+
},
|
|
2551
|
+
"aiGenerated": {
|
|
2552
|
+
"type": "boolean"
|
|
2553
|
+
},
|
|
2554
|
+
"attachments": {
|
|
2555
|
+
"type": "array",
|
|
2556
|
+
"items": {
|
|
2557
|
+
"$ref": "#/components/schemas/ConversationMessageAttachment"
|
|
2558
|
+
}
|
|
2559
|
+
}
|
|
2560
|
+
}
|
|
2561
|
+
},
|
|
2562
|
+
"ReservationMessageUpdatedPayload": {
|
|
2563
|
+
"type": "object",
|
|
2564
|
+
"description": "Payload for `reservation.message.updated`: a message was edited on the channel. `body` is the new text; `previousBody` what it replaced. Read receipts and reactions do not fire it.",
|
|
2565
|
+
"properties": {
|
|
2566
|
+
"reservationId": {
|
|
2567
|
+
"type": "integer",
|
|
2568
|
+
"nullable": true,
|
|
2569
|
+
"example": 235970
|
|
2570
|
+
},
|
|
2571
|
+
"threadId": {
|
|
2572
|
+
"type": "string",
|
|
2573
|
+
"example": "161347"
|
|
2574
|
+
},
|
|
2575
|
+
"messageId": {
|
|
2576
|
+
"type": "string",
|
|
2577
|
+
"example": "1854462"
|
|
2578
|
+
},
|
|
2579
|
+
"externalMessageId": {
|
|
2580
|
+
"type": "string",
|
|
2581
|
+
"nullable": true,
|
|
2582
|
+
"example": "32877308873"
|
|
2583
|
+
},
|
|
2584
|
+
"channel": {
|
|
2585
|
+
"type": "string",
|
|
2586
|
+
"example": "airbnb"
|
|
2587
|
+
},
|
|
2588
|
+
"from": {
|
|
2589
|
+
"type": "object",
|
|
2590
|
+
"properties": {
|
|
2591
|
+
"type": {
|
|
2592
|
+
"type": "string",
|
|
2593
|
+
"example": "host"
|
|
2594
|
+
},
|
|
2595
|
+
"name": {
|
|
2596
|
+
"type": "string",
|
|
2597
|
+
"nullable": true
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
},
|
|
2601
|
+
"body": {
|
|
2602
|
+
"type": "string",
|
|
2603
|
+
"description": "The text after the edit."
|
|
2604
|
+
},
|
|
2605
|
+
"previousBody": {
|
|
2606
|
+
"type": "string",
|
|
2607
|
+
"description": "The text before the edit."
|
|
2608
|
+
},
|
|
2609
|
+
"editedAt": {
|
|
2610
|
+
"type": "string",
|
|
2611
|
+
"format": "date-time",
|
|
2612
|
+
"description": "When the edit was made, as the channel reports it. Also the event's `revision`."
|
|
2613
|
+
},
|
|
2614
|
+
"sentAt": {
|
|
2615
|
+
"type": "string",
|
|
2616
|
+
"format": "date-time",
|
|
2617
|
+
"description": "When the message was first sent."
|
|
2618
|
+
},
|
|
2619
|
+
"direction": {
|
|
2620
|
+
"type": "string"
|
|
2621
|
+
}
|
|
2622
|
+
}
|
|
2623
|
+
},
|
|
2467
2624
|
"AlterationWebhookObject": {
|
|
2468
2625
|
"type": "object",
|
|
2469
2626
|
"description": "Lightweight alteration snapshot delivered as `data.object` on `reservation.alteration.*` events. Currently Airbnb only. Fetch full state (original vs new dates/guests/price) via `GET /v1/channels/airbnb/alterations` filtered by `reservation_code`.",
|
|
@@ -3430,6 +3587,40 @@
|
|
|
3430
3587
|
}
|
|
3431
3588
|
}
|
|
3432
3589
|
},
|
|
3590
|
+
"PayoutCompletedPayload": {
|
|
3591
|
+
"type": "object",
|
|
3592
|
+
"description": "Payload for `payout.completed`: one Airbnb payout and every line it paid. `payout` and each of `lines` are `AirbnbTransaction` objects, identical \u2014 ids included \u2014 to what `GET /v1/channels/airbnb/transactions?payout_id=` returns, so you can deduplicate on `transactionId` across webhooks and reads. The lines' signed `amount`s sum to `payout.payout.paidOutAmount`.",
|
|
3593
|
+
"required": [
|
|
3594
|
+
"channel",
|
|
3595
|
+
"accountId",
|
|
3596
|
+
"payout",
|
|
3597
|
+
"lines"
|
|
3598
|
+
],
|
|
3599
|
+
"properties": {
|
|
3600
|
+
"channel": {
|
|
3601
|
+
"type": "string"
|
|
3602
|
+
},
|
|
3603
|
+
"accountId": {
|
|
3604
|
+
"type": "string",
|
|
3605
|
+
"description": "The Airbnb account (host id) that was paid.",
|
|
3606
|
+
"example": "10000001"
|
|
3607
|
+
},
|
|
3608
|
+
"accountName": {
|
|
3609
|
+
"type": "string",
|
|
3610
|
+
"nullable": true
|
|
3611
|
+
},
|
|
3612
|
+
"payout": {
|
|
3613
|
+
"$ref": "#/components/schemas/AirbnbTransaction"
|
|
3614
|
+
},
|
|
3615
|
+
"lines": {
|
|
3616
|
+
"type": "array",
|
|
3617
|
+
"items": {
|
|
3618
|
+
"$ref": "#/components/schemas/AirbnbTransaction"
|
|
3619
|
+
},
|
|
3620
|
+
"description": "In payout order (`payout.lineIndex`)."
|
|
3621
|
+
}
|
|
3622
|
+
}
|
|
3623
|
+
},
|
|
3433
3624
|
"RepullPingPayload": {
|
|
3434
3625
|
"type": "object",
|
|
3435
3626
|
"description": "Payload for `repull.ping`. A diagnostic delivery used by the dashboard to verify endpoint reachability.",
|
|
@@ -3669,6 +3860,78 @@
|
|
|
3669
3860
|
}
|
|
3670
3861
|
}
|
|
3671
3862
|
},
|
|
3863
|
+
"ReservationMessageSentEvent": {
|
|
3864
|
+
"type": "object",
|
|
3865
|
+
"required": [
|
|
3866
|
+
"event",
|
|
3867
|
+
"eventId",
|
|
3868
|
+
"apiVersion",
|
|
3869
|
+
"timestamp",
|
|
3870
|
+
"data"
|
|
3871
|
+
],
|
|
3872
|
+
"properties": {
|
|
3873
|
+
"event": {
|
|
3874
|
+
"type": "string",
|
|
3875
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
3876
|
+
},
|
|
3877
|
+
"eventId": {
|
|
3878
|
+
"type": "string",
|
|
3879
|
+
"format": "uuid",
|
|
3880
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
3881
|
+
},
|
|
3882
|
+
"apiVersion": {
|
|
3883
|
+
"type": "string",
|
|
3884
|
+
"example": "2026-04"
|
|
3885
|
+
},
|
|
3886
|
+
"timestamp": {
|
|
3887
|
+
"type": "string",
|
|
3888
|
+
"format": "date-time",
|
|
3889
|
+
"description": "When this delivery was built."
|
|
3890
|
+
},
|
|
3891
|
+
"account": {
|
|
3892
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
3893
|
+
},
|
|
3894
|
+
"data": {
|
|
3895
|
+
"$ref": "#/components/schemas/ReservationMessageSentPayload"
|
|
3896
|
+
}
|
|
3897
|
+
}
|
|
3898
|
+
},
|
|
3899
|
+
"ReservationMessageUpdatedEvent": {
|
|
3900
|
+
"type": "object",
|
|
3901
|
+
"required": [
|
|
3902
|
+
"event",
|
|
3903
|
+
"eventId",
|
|
3904
|
+
"apiVersion",
|
|
3905
|
+
"timestamp",
|
|
3906
|
+
"data"
|
|
3907
|
+
],
|
|
3908
|
+
"properties": {
|
|
3909
|
+
"event": {
|
|
3910
|
+
"type": "string",
|
|
3911
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
3912
|
+
},
|
|
3913
|
+
"eventId": {
|
|
3914
|
+
"type": "string",
|
|
3915
|
+
"format": "uuid",
|
|
3916
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
3917
|
+
},
|
|
3918
|
+
"apiVersion": {
|
|
3919
|
+
"type": "string",
|
|
3920
|
+
"example": "2026-04"
|
|
3921
|
+
},
|
|
3922
|
+
"timestamp": {
|
|
3923
|
+
"type": "string",
|
|
3924
|
+
"format": "date-time",
|
|
3925
|
+
"description": "When this delivery was built."
|
|
3926
|
+
},
|
|
3927
|
+
"account": {
|
|
3928
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
3929
|
+
},
|
|
3930
|
+
"data": {
|
|
3931
|
+
"$ref": "#/components/schemas/ReservationMessageUpdatedPayload"
|
|
3932
|
+
}
|
|
3933
|
+
}
|
|
3934
|
+
},
|
|
3672
3935
|
"ReservationAlterationCreatedEvent": {
|
|
3673
3936
|
"type": "object",
|
|
3674
3937
|
"required": [
|
|
@@ -4353,6 +4616,42 @@
|
|
|
4353
4616
|
}
|
|
4354
4617
|
}
|
|
4355
4618
|
},
|
|
4619
|
+
"PayoutCompletedEvent": {
|
|
4620
|
+
"type": "object",
|
|
4621
|
+
"required": [
|
|
4622
|
+
"event",
|
|
4623
|
+
"eventId",
|
|
4624
|
+
"apiVersion",
|
|
4625
|
+
"timestamp",
|
|
4626
|
+
"data"
|
|
4627
|
+
],
|
|
4628
|
+
"properties": {
|
|
4629
|
+
"event": {
|
|
4630
|
+
"type": "string",
|
|
4631
|
+
"description": "The event name. This field is `event`, not `type`."
|
|
4632
|
+
},
|
|
4633
|
+
"eventId": {
|
|
4634
|
+
"type": "string",
|
|
4635
|
+
"format": "uuid",
|
|
4636
|
+
"description": "Stable across every delivery and replay of this logical event \u2014 dedupe on it."
|
|
4637
|
+
},
|
|
4638
|
+
"apiVersion": {
|
|
4639
|
+
"type": "string",
|
|
4640
|
+
"example": "2026-04"
|
|
4641
|
+
},
|
|
4642
|
+
"timestamp": {
|
|
4643
|
+
"type": "string",
|
|
4644
|
+
"format": "date-time",
|
|
4645
|
+
"description": "When this delivery was built."
|
|
4646
|
+
},
|
|
4647
|
+
"account": {
|
|
4648
|
+
"$ref": "#/components/schemas/WebhookEventAccount"
|
|
4649
|
+
},
|
|
4650
|
+
"data": {
|
|
4651
|
+
"$ref": "#/components/schemas/PayoutCompletedPayload"
|
|
4652
|
+
}
|
|
4653
|
+
}
|
|
4654
|
+
},
|
|
4356
4655
|
"PaymentRefundedEvent": {
|
|
4357
4656
|
"type": "object",
|
|
4358
4657
|
"required": [
|
|
@@ -4613,6 +4912,12 @@
|
|
|
4613
4912
|
{
|
|
4614
4913
|
"$ref": "#/components/schemas/ReservationMessageReceivedEvent"
|
|
4615
4914
|
},
|
|
4915
|
+
{
|
|
4916
|
+
"$ref": "#/components/schemas/ReservationMessageSentEvent"
|
|
4917
|
+
},
|
|
4918
|
+
{
|
|
4919
|
+
"$ref": "#/components/schemas/ReservationMessageUpdatedEvent"
|
|
4920
|
+
},
|
|
4616
4921
|
{
|
|
4617
4922
|
"$ref": "#/components/schemas/ReservationAlterationCreatedEvent"
|
|
4618
4923
|
},
|
|
@@ -4674,7 +4979,10 @@
|
|
|
4674
4979
|
"$ref": "#/components/schemas/PaymentRefundedEvent"
|
|
4675
4980
|
},
|
|
4676
4981
|
{
|
|
4677
|
-
"$ref": "#/components/schemas/
|
|
4982
|
+
"$ref": "#/components/schemas/PayoutCompletedEvent"
|
|
4983
|
+
},
|
|
4984
|
+
{
|
|
4985
|
+
"$ref": "#/components/schemas/RepullPingEvent"
|
|
4678
4986
|
},
|
|
4679
4987
|
{
|
|
4680
4988
|
"$ref": "#/components/schemas/UsageQuotaWarningEvent"
|
|
@@ -4693,6 +5001,8 @@
|
|
|
4693
5001
|
"reservation.updated": "#/components/schemas/ReservationUpdatedEvent",
|
|
4694
5002
|
"reservation.cancelled": "#/components/schemas/ReservationCancelledEvent",
|
|
4695
5003
|
"reservation.message.received": "#/components/schemas/ReservationMessageReceivedEvent",
|
|
5004
|
+
"reservation.message.sent": "#/components/schemas/ReservationMessageSentEvent",
|
|
5005
|
+
"reservation.message.updated": "#/components/schemas/ReservationMessageUpdatedEvent",
|
|
4696
5006
|
"reservation.alteration.created": "#/components/schemas/ReservationAlterationCreatedEvent",
|
|
4697
5007
|
"reservation.alteration.responded": "#/components/schemas/ReservationAlterationRespondedEvent",
|
|
4698
5008
|
"reservation.request.created": "#/components/schemas/ReservationRequestCreatedEvent",
|
|
@@ -4713,6 +5023,7 @@
|
|
|
4713
5023
|
"ai.operation.failed": "#/components/schemas/AiOperationFailedEvent",
|
|
4714
5024
|
"payment.completed": "#/components/schemas/PaymentCompletedEvent",
|
|
4715
5025
|
"payment.refunded": "#/components/schemas/PaymentRefundedEvent",
|
|
5026
|
+
"payout.completed": "#/components/schemas/PayoutCompletedEvent",
|
|
4716
5027
|
"repull.ping": "#/components/schemas/RepullPingEvent",
|
|
4717
5028
|
"usage.quota.warning": "#/components/schemas/UsageQuotaWarningEvent",
|
|
4718
5029
|
"migration.completed": "#/components/schemas/MigrationCompletedEvent",
|
|
@@ -4723,11 +5034,11 @@
|
|
|
4723
5034
|
},
|
|
4724
5035
|
"AirbnbListing": {
|
|
4725
5036
|
"type": "object",
|
|
4726
|
-
"description": "A
|
|
5037
|
+
"description": "A listing paired with its Airbnb connections. The list endpoint groups every Airbnb connection of the same `listingId` under a single `connections[]` array.",
|
|
4727
5038
|
"properties": {
|
|
4728
5039
|
"listingId": {
|
|
4729
5040
|
"type": "string",
|
|
4730
|
-
"description": "
|
|
5041
|
+
"description": "Repull listing id",
|
|
4731
5042
|
"example": "6248"
|
|
4732
5043
|
},
|
|
4733
5044
|
"name": {
|
|
@@ -4744,7 +5055,7 @@
|
|
|
4744
5055
|
"type": "string",
|
|
4745
5056
|
"format": "uri",
|
|
4746
5057
|
"nullable": true,
|
|
4747
|
-
"description": "Cover photo URL for the
|
|
5058
|
+
"description": "Cover photo URL for the listing. **Only present when the caller passes `?include=thumbnail`.** `null` when the listing has no cover photo stored \u2014 the listing is still returned."
|
|
4748
5059
|
},
|
|
4749
5060
|
"connections": {
|
|
4750
5061
|
"type": "array",
|
|
@@ -4756,7 +5067,7 @@
|
|
|
4756
5067
|
},
|
|
4757
5068
|
"AirbnbConnection": {
|
|
4758
5069
|
"type": "object",
|
|
4759
|
-
"description": "An Airbnb-side connection record for a
|
|
5070
|
+
"description": "An Airbnb-side connection record for a listing. The same property may appear under multiple connections if it has been linked from multiple Airbnb host accounts.",
|
|
4760
5071
|
"properties": {
|
|
4761
5072
|
"id": {
|
|
4762
5073
|
"type": "string",
|
|
@@ -4765,7 +5076,7 @@
|
|
|
4765
5076
|
"airbnbId": {
|
|
4766
5077
|
"type": "string",
|
|
4767
5078
|
"description": "Airbnb-side listing id",
|
|
4768
|
-
"example": "
|
|
5079
|
+
"example": "1234567890123456789"
|
|
4769
5080
|
},
|
|
4770
5081
|
"accountId": {
|
|
4771
5082
|
"type": "string",
|
|
@@ -4777,7 +5088,7 @@
|
|
|
4777
5088
|
"type": "string",
|
|
4778
5089
|
"nullable": true,
|
|
4779
5090
|
"description": "Display name of that connected Airbnb account.",
|
|
4780
|
-
"example": "
|
|
5091
|
+
"example": "Seaside Stays"
|
|
4781
5092
|
},
|
|
4782
5093
|
"hostId": {
|
|
4783
5094
|
"type": "string",
|
|
@@ -5022,7 +5333,7 @@
|
|
|
5022
5333
|
"type": "string",
|
|
5023
5334
|
"nullable": true,
|
|
5024
5335
|
"description": "Display name of that connected Airbnb account.",
|
|
5025
|
-
"example": "
|
|
5336
|
+
"example": "Seaside Stays"
|
|
5026
5337
|
},
|
|
5027
5338
|
"status": {
|
|
5028
5339
|
"type": "string",
|
|
@@ -5099,7 +5410,7 @@
|
|
|
5099
5410
|
"type": "string",
|
|
5100
5411
|
"nullable": true,
|
|
5101
5412
|
"description": "Display name of that connected Airbnb account.",
|
|
5102
|
-
"example": "
|
|
5413
|
+
"example": "Seaside Stays"
|
|
5103
5414
|
},
|
|
5104
5415
|
"guestName": {
|
|
5105
5416
|
"type": "string",
|
|
@@ -5193,7 +5504,7 @@
|
|
|
5193
5504
|
"type": "string",
|
|
5194
5505
|
"nullable": true,
|
|
5195
5506
|
"description": "Display name of that connected Airbnb account.",
|
|
5196
|
-
"example": "
|
|
5507
|
+
"example": "Seaside Stays"
|
|
5197
5508
|
},
|
|
5198
5509
|
"platform": {
|
|
5199
5510
|
"type": "string",
|
|
@@ -5325,6 +5636,82 @@
|
|
|
5325
5636
|
}
|
|
5326
5637
|
}
|
|
5327
5638
|
},
|
|
5639
|
+
"AirbnbHostReviewSubmit": {
|
|
5640
|
+
"type": "object",
|
|
5641
|
+
"description": "Your review of a guest. Airbnb requires `publicReview`, `isRevieweeRecommended`, and a rating for each of cleanliness, communication and respect_house_rules \u2014 through `rating`, `categoryRatings`, or both. Submitting publishes it and is final.",
|
|
5642
|
+
"required": [
|
|
5643
|
+
"publicReview",
|
|
5644
|
+
"isRevieweeRecommended"
|
|
5645
|
+
],
|
|
5646
|
+
"properties": {
|
|
5647
|
+
"publicReview": {
|
|
5648
|
+
"type": "string",
|
|
5649
|
+
"maxLength": 1000,
|
|
5650
|
+
"description": "Shown publicly on the guest's profile. `comment` is accepted as an alias.",
|
|
5651
|
+
"example": "Joanne was a great guest. The space was kept clean and communication was clear."
|
|
5652
|
+
},
|
|
5653
|
+
"rating": {
|
|
5654
|
+
"type": "integer",
|
|
5655
|
+
"minimum": 1,
|
|
5656
|
+
"maximum": 5,
|
|
5657
|
+
"description": "Used for every category not rated in `categoryRatings`.",
|
|
5658
|
+
"example": 5
|
|
5659
|
+
},
|
|
5660
|
+
"categoryRatings": {
|
|
5661
|
+
"type": "array",
|
|
5662
|
+
"description": "Per-category scores. Categories not listed take `rating`; without `rating`, all three must be listed.",
|
|
5663
|
+
"items": {
|
|
5664
|
+
"type": "object",
|
|
5665
|
+
"required": [
|
|
5666
|
+
"category",
|
|
5667
|
+
"rating"
|
|
5668
|
+
],
|
|
5669
|
+
"properties": {
|
|
5670
|
+
"category": {
|
|
5671
|
+
"type": "string",
|
|
5672
|
+
"enum": [
|
|
5673
|
+
"cleanliness",
|
|
5674
|
+
"communication",
|
|
5675
|
+
"respect_house_rules"
|
|
5676
|
+
]
|
|
5677
|
+
},
|
|
5678
|
+
"rating": {
|
|
5679
|
+
"type": "integer",
|
|
5680
|
+
"minimum": 1,
|
|
5681
|
+
"maximum": 5
|
|
5682
|
+
},
|
|
5683
|
+
"comment": {
|
|
5684
|
+
"type": "string",
|
|
5685
|
+
"maxLength": 50,
|
|
5686
|
+
"description": "Optional note for this category (Airbnb caps it at 50 characters)."
|
|
5687
|
+
}
|
|
5688
|
+
}
|
|
5689
|
+
}
|
|
5690
|
+
},
|
|
5691
|
+
"privateFeedback": {
|
|
5692
|
+
"type": "string",
|
|
5693
|
+
"maxLength": 1000,
|
|
5694
|
+
"description": "Optional. A note to the guest that is not published."
|
|
5695
|
+
},
|
|
5696
|
+
"isRevieweeRecommended": {
|
|
5697
|
+
"type": "boolean",
|
|
5698
|
+
"description": "Required. Whether you would host this guest again."
|
|
5699
|
+
}
|
|
5700
|
+
},
|
|
5701
|
+
"example": {
|
|
5702
|
+
"publicReview": "Joanne was a great guest. The space was kept clean and communication was clear.",
|
|
5703
|
+
"rating": 5,
|
|
5704
|
+
"categoryRatings": [
|
|
5705
|
+
{
|
|
5706
|
+
"category": "cleanliness",
|
|
5707
|
+
"rating": 5,
|
|
5708
|
+
"comment": "Left it spotless"
|
|
5709
|
+
}
|
|
5710
|
+
],
|
|
5711
|
+
"privateFeedback": "Thanks for being such a considerate guest!",
|
|
5712
|
+
"isRevieweeRecommended": true
|
|
5713
|
+
}
|
|
5714
|
+
},
|
|
5328
5715
|
"AirbnbReview": {
|
|
5329
5716
|
"type": "object",
|
|
5330
5717
|
"description": "An Airbnb review (guest \u2192 host or host \u2192 guest).",
|
|
@@ -5346,7 +5733,7 @@
|
|
|
5346
5733
|
"type": "string",
|
|
5347
5734
|
"nullable": true,
|
|
5348
5735
|
"description": "Display name of that connected Airbnb account.",
|
|
5349
|
-
"example": "
|
|
5736
|
+
"example": "Seaside Stays"
|
|
5350
5737
|
},
|
|
5351
5738
|
"rating": {
|
|
5352
5739
|
"type": "integer",
|
|
@@ -5900,6 +6287,9 @@
|
|
|
5900
6287
|
"PropertyListResponse": {
|
|
5901
6288
|
"type": "object",
|
|
5902
6289
|
"properties": {
|
|
6290
|
+
"planNotice": {
|
|
6291
|
+
"$ref": "#/components/schemas/PlanNotice"
|
|
6292
|
+
},
|
|
5903
6293
|
"data": {
|
|
5904
6294
|
"type": "array",
|
|
5905
6295
|
"items": {
|
|
@@ -5989,6 +6379,9 @@
|
|
|
5989
6379
|
"ConnectionListResponse": {
|
|
5990
6380
|
"type": "object",
|
|
5991
6381
|
"properties": {
|
|
6382
|
+
"planNotice": {
|
|
6383
|
+
"$ref": "#/components/schemas/PlanNotice"
|
|
6384
|
+
},
|
|
5992
6385
|
"data": {
|
|
5993
6386
|
"type": "array",
|
|
5994
6387
|
"items": {
|
|
@@ -6043,7 +6436,7 @@
|
|
|
6043
6436
|
"type": "string",
|
|
6044
6437
|
"nullable": true,
|
|
6045
6438
|
"description": "Display name of the connected account.",
|
|
6046
|
-
"example": "
|
|
6439
|
+
"example": "Seaside Stays"
|
|
6047
6440
|
},
|
|
6048
6441
|
"lastSyncedAt": {
|
|
6049
6442
|
"type": "string",
|
|
@@ -6130,234 +6523,183 @@
|
|
|
6130
6523
|
},
|
|
6131
6524
|
"AirbnbTransaction": {
|
|
6132
6525
|
"type": "object",
|
|
6133
|
-
"description": "One Airbnb
|
|
6526
|
+
"description": "One line of the Airbnb settlement ledger: a Payout row (`isPayout: true`) or a line it paid. Money is in the payout currency; `amount` is signed (negative = taken back, e.g. an adjustment offset against this payout). A payout's lines sum to its `payout.paidOutAmount`.",
|
|
6134
6527
|
"required": [
|
|
6135
|
-
"
|
|
6136
|
-
"
|
|
6137
|
-
"
|
|
6528
|
+
"transactionId",
|
|
6529
|
+
"status",
|
|
6530
|
+
"type",
|
|
6531
|
+
"isPayout",
|
|
6532
|
+
"fees",
|
|
6138
6533
|
"payout",
|
|
6139
|
-
"
|
|
6534
|
+
"onInactiveListing",
|
|
6535
|
+
"unavailableFields"
|
|
6140
6536
|
],
|
|
6141
6537
|
"properties": {
|
|
6142
|
-
"
|
|
6538
|
+
"transactionId": {
|
|
6143
6539
|
"type": "string",
|
|
6144
|
-
"description": "
|
|
6540
|
+
"description": "Stable id. A Payout row: Airbnb's payout id. A settled line: `<payoutId>:<type>:<confirmationCode>:<n>`. An upcoming line: `upcoming:<accountId>:<type>:<confirmationCode>:<date>:<n>`. Identical on every refresh; upsert on it.",
|
|
6541
|
+
"example": "M-HQLLNSWKUWK7R:reservation:HMRQ8FC4YN:1"
|
|
6145
6542
|
},
|
|
6146
|
-
"
|
|
6543
|
+
"accountId": {
|
|
6147
6544
|
"type": "string",
|
|
6148
6545
|
"nullable": true,
|
|
6149
|
-
"description": "
|
|
6546
|
+
"description": "The connected Airbnb account (host id, as a string \u2014 they exceed 2^53).",
|
|
6547
|
+
"example": "10000001"
|
|
6150
6548
|
},
|
|
6151
|
-
"
|
|
6549
|
+
"accountName": {
|
|
6152
6550
|
"type": "string",
|
|
6153
|
-
"nullable": true
|
|
6551
|
+
"nullable": true,
|
|
6552
|
+
"example": "Seaside Stays"
|
|
6154
6553
|
},
|
|
6155
|
-
"
|
|
6554
|
+
"status": {
|
|
6156
6555
|
"type": "string",
|
|
6157
|
-
"
|
|
6158
|
-
"nullable": true,
|
|
6159
|
-
"description": "Transaction date."
|
|
6556
|
+
"description": "`COMPLETED`: settled in a payout. `UPCOMING`: expected, not paid out yet."
|
|
6160
6557
|
},
|
|
6161
|
-
"
|
|
6558
|
+
"type": {
|
|
6162
6559
|
"type": "string",
|
|
6163
|
-
"
|
|
6164
|
-
"
|
|
6560
|
+
"description": "Airbnb's line type, verbatim: `Payout`, `Reservation`, `Adjustment`, `Resolution Payout`, `Resolution Adjustment`, `Cancellation Fee`, `Pass Through Tot`, \u2026",
|
|
6561
|
+
"example": "Reservation"
|
|
6165
6562
|
},
|
|
6166
|
-
"
|
|
6167
|
-
"type": "
|
|
6168
|
-
"
|
|
6169
|
-
"description": "Resolved Vanio reservation id when the confirmation code matched a reservation in this workspace; null otherwise."
|
|
6563
|
+
"isPayout": {
|
|
6564
|
+
"type": "boolean",
|
|
6565
|
+
"description": "`true` on the Payout row itself."
|
|
6170
6566
|
},
|
|
6171
|
-
"
|
|
6567
|
+
"date": {
|
|
6172
6568
|
"type": "string",
|
|
6569
|
+
"format": "date",
|
|
6173
6570
|
"nullable": true,
|
|
6174
|
-
"description": "
|
|
6175
|
-
"example": "1772489413932732258"
|
|
6571
|
+
"description": "The line's date as Airbnb reports it. Can be the day before its payout's date."
|
|
6176
6572
|
},
|
|
6177
|
-
"
|
|
6573
|
+
"currency": {
|
|
6178
6574
|
"type": "string",
|
|
6179
6575
|
"nullable": true,
|
|
6180
|
-
"
|
|
6181
|
-
"example": "Pomello"
|
|
6576
|
+
"example": "USD"
|
|
6182
6577
|
},
|
|
6183
|
-
"
|
|
6184
|
-
"type": "
|
|
6578
|
+
"amount": {
|
|
6579
|
+
"type": "number",
|
|
6185
6580
|
"nullable": true,
|
|
6186
|
-
"description": "Airbnb
|
|
6187
|
-
|
|
6188
|
-
"thread_id": {
|
|
6189
|
-
"type": "string",
|
|
6190
|
-
"nullable": true
|
|
6191
|
-
},
|
|
6192
|
-
"nights": {
|
|
6193
|
-
"type": "integer",
|
|
6194
|
-
"nullable": true
|
|
6195
|
-
},
|
|
6196
|
-
"reservation_start_date": {
|
|
6197
|
-
"type": "string",
|
|
6198
|
-
"format": "date",
|
|
6199
|
-
"nullable": true
|
|
6200
|
-
},
|
|
6201
|
-
"booked_at": {
|
|
6202
|
-
"type": "string",
|
|
6203
|
-
"format": "date-time",
|
|
6204
|
-
"nullable": true
|
|
6205
|
-
},
|
|
6206
|
-
"check_in": {
|
|
6207
|
-
"type": "string",
|
|
6208
|
-
"format": "date-time",
|
|
6209
|
-
"nullable": true
|
|
6210
|
-
},
|
|
6211
|
-
"check_out": {
|
|
6212
|
-
"type": "string",
|
|
6213
|
-
"format": "date-time",
|
|
6214
|
-
"nullable": true
|
|
6215
|
-
},
|
|
6216
|
-
"time_zone": {
|
|
6217
|
-
"type": "string",
|
|
6218
|
-
"nullable": true
|
|
6219
|
-
},
|
|
6220
|
-
"guest_name": {
|
|
6221
|
-
"type": "string",
|
|
6222
|
-
"nullable": true
|
|
6581
|
+
"description": "Signed amount this line contributes to its payout, after Airbnb's host service fee. On a Payout row, the amount paid out.",
|
|
6582
|
+
"example": 40.6
|
|
6223
6583
|
},
|
|
6224
|
-
"
|
|
6225
|
-
"type": "
|
|
6584
|
+
"grossAmount": {
|
|
6585
|
+
"type": "number",
|
|
6226
6586
|
"nullable": true,
|
|
6227
|
-
"description": "
|
|
6228
|
-
|
|
6229
|
-
"status_type": {
|
|
6230
|
-
"type": "string",
|
|
6231
|
-
"nullable": true
|
|
6587
|
+
"description": "Before Airbnb's host service fee: `amount - fees.hostServiceFee`.",
|
|
6588
|
+
"example": 48.05
|
|
6232
6589
|
},
|
|
6233
|
-
"
|
|
6590
|
+
"fees": {
|
|
6234
6591
|
"type": "object",
|
|
6235
6592
|
"required": [
|
|
6236
|
-
"
|
|
6237
|
-
"
|
|
6238
|
-
"paid_out_amount"
|
|
6593
|
+
"hostServiceFee",
|
|
6594
|
+
"cleaningFee"
|
|
6239
6595
|
],
|
|
6240
6596
|
"properties": {
|
|
6241
|
-
"
|
|
6242
|
-
"type": "
|
|
6243
|
-
"nullable": true
|
|
6244
|
-
},
|
|
6245
|
-
"payout_date": {
|
|
6246
|
-
"type": "string",
|
|
6247
|
-
"format": "date",
|
|
6597
|
+
"hostServiceFee": {
|
|
6598
|
+
"type": "number",
|
|
6248
6599
|
"nullable": true,
|
|
6249
|
-
"description": "
|
|
6600
|
+
"description": "Airbnb's host service fee on this line, as a deduction (negative). Already taken out of `amount`.",
|
|
6601
|
+
"example": -7.45
|
|
6250
6602
|
},
|
|
6251
|
-
"
|
|
6603
|
+
"cleaningFee": {
|
|
6252
6604
|
"type": "number",
|
|
6253
|
-
"nullable": true
|
|
6605
|
+
"nullable": true,
|
|
6606
|
+
"description": "Cleaning fee included in this line's gross.",
|
|
6607
|
+
"example": 40.57
|
|
6254
6608
|
}
|
|
6255
6609
|
}
|
|
6256
6610
|
},
|
|
6257
|
-
"
|
|
6258
|
-
"type": "string",
|
|
6259
|
-
"nullable": true
|
|
6260
|
-
},
|
|
6261
|
-
"host_currency": {
|
|
6262
|
-
"type": "string",
|
|
6263
|
-
"nullable": true
|
|
6264
|
-
},
|
|
6265
|
-
"amount": {
|
|
6266
|
-
"type": "number",
|
|
6267
|
-
"nullable": true,
|
|
6268
|
-
"description": "Top-level transaction amount."
|
|
6269
|
-
},
|
|
6270
|
-
"host_breakdown": {
|
|
6611
|
+
"payout": {
|
|
6271
6612
|
"type": "object",
|
|
6272
|
-
"description": "Host-side breakdown (all host currency).",
|
|
6273
6613
|
"required": [
|
|
6274
|
-
"
|
|
6614
|
+
"payoutId",
|
|
6615
|
+
"payoutIdSynthetic",
|
|
6616
|
+
"payoutDate",
|
|
6617
|
+
"lineIndex",
|
|
6618
|
+
"paidOutAmount"
|
|
6275
6619
|
],
|
|
6276
6620
|
"properties": {
|
|
6277
|
-
"
|
|
6278
|
-
"type": "
|
|
6279
|
-
"nullable": true,
|
|
6280
|
-
"description": "Nightly rate \u00d7 nights, net of stay-level discounts already applied by Airbnb."
|
|
6281
|
-
},
|
|
6282
|
-
"cleaning_fee": {
|
|
6283
|
-
"type": "number",
|
|
6284
|
-
"nullable": true
|
|
6285
|
-
},
|
|
6286
|
-
"host_service_fee_base": {
|
|
6287
|
-
"type": "number",
|
|
6288
|
-
"nullable": true,
|
|
6289
|
-
"description": "Airbnb host service fee, base component (negative = deduction)."
|
|
6290
|
-
},
|
|
6291
|
-
"host_service_fee_vat": {
|
|
6292
|
-
"type": "number",
|
|
6293
|
-
"nullable": true,
|
|
6294
|
-
"description": "Airbnb host service fee, VAT component (negative = deduction)."
|
|
6295
|
-
},
|
|
6296
|
-
"host_service_fee_total": {
|
|
6297
|
-
"type": "number",
|
|
6621
|
+
"payoutId": {
|
|
6622
|
+
"type": "string",
|
|
6298
6623
|
"nullable": true,
|
|
6299
|
-
"description": "
|
|
6300
|
-
|
|
6301
|
-
"airbnb_collected_tax": {
|
|
6302
|
-
"type": "number",
|
|
6303
|
-
"nullable": true
|
|
6624
|
+
"description": "The payout this line was settled in (its own id on a Payout row). `null` on an UPCOMING line.",
|
|
6625
|
+
"example": "M-HQLLNSWKUWK7R"
|
|
6304
6626
|
},
|
|
6305
|
-
"
|
|
6306
|
-
"type": "
|
|
6307
|
-
"
|
|
6627
|
+
"payoutIdSynthetic": {
|
|
6628
|
+
"type": "boolean",
|
|
6629
|
+
"description": "`true` when Airbnb sent no payout id (a payout netting to $0.00) and Repull derived a stable one."
|
|
6308
6630
|
},
|
|
6309
|
-
"
|
|
6310
|
-
"type": "
|
|
6631
|
+
"payoutDate": {
|
|
6632
|
+
"type": "string",
|
|
6633
|
+
"format": "date",
|
|
6311
6634
|
"nullable": true
|
|
6312
6635
|
},
|
|
6313
|
-
"
|
|
6314
|
-
"type": "
|
|
6315
|
-
"nullable": true
|
|
6636
|
+
"lineIndex": {
|
|
6637
|
+
"type": "integer",
|
|
6638
|
+
"nullable": true,
|
|
6639
|
+
"description": "Position within the payout, from 1. `null` on the Payout row and on UPCOMING lines."
|
|
6316
6640
|
},
|
|
6317
|
-
"
|
|
6641
|
+
"paidOutAmount": {
|
|
6318
6642
|
"type": "number",
|
|
6319
6643
|
"nullable": true,
|
|
6320
|
-
"description": "
|
|
6644
|
+
"description": "On the Payout row only: the amount paid out. Its lines sum to it."
|
|
6321
6645
|
}
|
|
6322
6646
|
}
|
|
6323
6647
|
},
|
|
6324
|
-
"
|
|
6325
|
-
"type": "
|
|
6326
|
-
"
|
|
6327
|
-
"
|
|
6328
|
-
"total_paid"
|
|
6329
|
-
],
|
|
6330
|
-
"properties": {
|
|
6331
|
-
"total_paid": {
|
|
6332
|
-
"type": "number",
|
|
6333
|
-
"nullable": true
|
|
6334
|
-
},
|
|
6335
|
-
"service_fee_base": {
|
|
6336
|
-
"type": "number",
|
|
6337
|
-
"nullable": true
|
|
6338
|
-
},
|
|
6339
|
-
"service_fee_vat": {
|
|
6340
|
-
"type": "number",
|
|
6341
|
-
"nullable": true
|
|
6342
|
-
}
|
|
6343
|
-
}
|
|
6648
|
+
"confirmationCode": {
|
|
6649
|
+
"type": "string",
|
|
6650
|
+
"nullable": true,
|
|
6651
|
+
"example": "HMRQ8FC4YN"
|
|
6344
6652
|
},
|
|
6345
|
-
"
|
|
6346
|
-
"type": "
|
|
6347
|
-
"
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
|
|
6653
|
+
"reservationId": {
|
|
6654
|
+
"type": "string",
|
|
6655
|
+
"nullable": true,
|
|
6656
|
+
"description": "Repull reservation id when the confirmation code matches a reservation in this workspace; `null` when it does not (explicitly unlinked)."
|
|
6657
|
+
},
|
|
6658
|
+
"listingId": {
|
|
6659
|
+
"type": "string",
|
|
6660
|
+
"nullable": true,
|
|
6661
|
+
"description": "Airbnb listing id."
|
|
6662
|
+
},
|
|
6663
|
+
"listingName": {
|
|
6664
|
+
"type": "string",
|
|
6665
|
+
"nullable": true
|
|
6666
|
+
},
|
|
6667
|
+
"onInactiveListing": {
|
|
6668
|
+
"type": "boolean",
|
|
6669
|
+
"description": "`true` when the line is on a listing that is inactive in Repull. Still returned, so the payout reconciles."
|
|
6670
|
+
},
|
|
6671
|
+
"guestName": {
|
|
6672
|
+
"type": "string",
|
|
6673
|
+
"nullable": true
|
|
6674
|
+
},
|
|
6675
|
+
"nights": {
|
|
6676
|
+
"type": "integer",
|
|
6677
|
+
"nullable": true
|
|
6678
|
+
},
|
|
6679
|
+
"reservationStartDate": {
|
|
6680
|
+
"type": "string",
|
|
6681
|
+
"format": "date",
|
|
6682
|
+
"nullable": true
|
|
6351
6683
|
},
|
|
6352
|
-
"
|
|
6684
|
+
"description": {
|
|
6685
|
+
"type": "string",
|
|
6353
6686
|
"nullable": true,
|
|
6354
|
-
"description": "
|
|
6687
|
+
"description": "Airbnb's description: the stay dates, the resolution, or on a Payout row the payout method."
|
|
6355
6688
|
},
|
|
6356
|
-
"
|
|
6689
|
+
"reference": {
|
|
6690
|
+
"type": "string",
|
|
6357
6691
|
"nullable": true,
|
|
6358
|
-
"description": "
|
|
6692
|
+
"description": "The resolution id on resolution payouts and adjustments; else `null`.",
|
|
6693
|
+
"example": "CLSF-06472635"
|
|
6694
|
+
},
|
|
6695
|
+
"unavailableFields": {
|
|
6696
|
+
"type": "array",
|
|
6697
|
+
"items": {
|
|
6698
|
+
"type": "string"
|
|
6699
|
+
},
|
|
6700
|
+
"description": "What Airbnb's transaction history does not carry, so it is never filled in: `taxes` (those Airbnb remits itself; pass-through tax paid to the host arrives as `Pass Through Tot` lines), `guest_paid_total`, `original_transaction_id`, `currency_conversion`, `management_fee`."
|
|
6359
6701
|
},
|
|
6360
|
-
"
|
|
6702
|
+
"syncedAt": {
|
|
6361
6703
|
"type": "string",
|
|
6362
6704
|
"format": "date-time",
|
|
6363
6705
|
"nullable": true
|
|
@@ -7483,11 +7825,52 @@
|
|
|
7483
7825
|
}
|
|
7484
7826
|
}
|
|
7485
7827
|
},
|
|
7828
|
+
"PlanNotice": {
|
|
7829
|
+
"type": "object",
|
|
7830
|
+
"description": "Added to the body of EVERY JSON response (success or error, except bare arrays and 5xx) while the workspace is connected to more listings than its plan lets it use \u2014 so a developer reading any payload, or an AI assistant relaying it, sees it. Connect keeps every listing it finds, but on a capped plan only as many as the plan allows are active; the rest are held back inactive and keep syncing. The same responses also carry the `X-Repull-Listings-Held-Back` and `X-Repull-Active-Listing-Limit` headers. Using a held-back listing answers `403 listing_inactive` with `reason: \"plan_limit\"`. Tell the user: they can see the held-back listings with `GET /v1/listings?status=all`, choose which are active with `POST /v1/listings/status`, or upgrade.",
|
|
7831
|
+
"required": [
|
|
7832
|
+
"code",
|
|
7833
|
+
"listingsHeldBack",
|
|
7834
|
+
"activeListingLimit",
|
|
7835
|
+
"message",
|
|
7836
|
+
"fix",
|
|
7837
|
+
"billingUrl"
|
|
7838
|
+
],
|
|
7839
|
+
"properties": {
|
|
7840
|
+
"code": {
|
|
7841
|
+
"type": "string"
|
|
7842
|
+
},
|
|
7843
|
+
"listingsHeldBack": {
|
|
7844
|
+
"type": "integer",
|
|
7845
|
+
"description": "Connected listings kept inactive because of the plan.",
|
|
7846
|
+
"example": 40
|
|
7847
|
+
},
|
|
7848
|
+
"activeListingLimit": {
|
|
7849
|
+
"type": "integer",
|
|
7850
|
+
"nullable": true,
|
|
7851
|
+
"description": "The plan's cap on active listings.",
|
|
7852
|
+
"example": 3
|
|
7853
|
+
},
|
|
7854
|
+
"message": {
|
|
7855
|
+
"type": "string",
|
|
7856
|
+
"example": "40 more connected listings are held inactive because your plan allows 3 active listings. They stay connected and keep syncing."
|
|
7857
|
+
},
|
|
7858
|
+
"fix": {
|
|
7859
|
+
"type": "string"
|
|
7860
|
+
},
|
|
7861
|
+
"billingUrl": {
|
|
7862
|
+
"type": "string",
|
|
7863
|
+
"format": "uri",
|
|
7864
|
+
"example": "https://repull.dev/dashboard/billing"
|
|
7865
|
+
}
|
|
7866
|
+
}
|
|
7867
|
+
},
|
|
7486
7868
|
"ListingPhotoUploadUrlRequest": {
|
|
7487
7869
|
"type": "object",
|
|
7488
7870
|
"required": [
|
|
7489
7871
|
"fileName",
|
|
7490
|
-
"fileType"
|
|
7872
|
+
"fileType",
|
|
7873
|
+
"fileSize"
|
|
7491
7874
|
],
|
|
7492
7875
|
"properties": {
|
|
7493
7876
|
"fileName": {
|
|
@@ -7502,8 +7885,8 @@
|
|
|
7502
7885
|
},
|
|
7503
7886
|
"fileSize": {
|
|
7504
7887
|
"type": "integer",
|
|
7505
|
-
"
|
|
7506
|
-
"
|
|
7888
|
+
"description": "File size in bytes. Required: the signed upload is issued for this size.",
|
|
7889
|
+
"example": 453631
|
|
7507
7890
|
}
|
|
7508
7891
|
}
|
|
7509
7892
|
},
|
|
@@ -7517,7 +7900,7 @@
|
|
|
7517
7900
|
"uploadUrl": {
|
|
7518
7901
|
"type": "string",
|
|
7519
7902
|
"format": "uri",
|
|
7520
|
-
"description": "PUT the raw file bytes here directly from the client. Not a Repull
|
|
7903
|
+
"description": "PUT the raw file bytes here directly from the client. Not a Repull API endpoint \u2014 a signed storage URL."
|
|
7521
7904
|
},
|
|
7522
7905
|
"token": {
|
|
7523
7906
|
"type": "string",
|
|
@@ -7535,6 +7918,10 @@
|
|
|
7535
7918
|
"expiresIn": {
|
|
7536
7919
|
"type": "integer",
|
|
7537
7920
|
"description": "Seconds until `uploadUrl` expires. Mint a new one via a fresh POST if the upload did not happen in time."
|
|
7921
|
+
},
|
|
7922
|
+
"nextStep": {
|
|
7923
|
+
"type": "string",
|
|
7924
|
+
"description": "What to do after uploading. Uploading does NOT attach the photo to the listing: send `publicUrl` in `photos` on `PUT /v1/listings/{id}/content` (with `photosMode: \"append\"` to keep existing photos)."
|
|
7538
7925
|
}
|
|
7539
7926
|
}
|
|
7540
7927
|
},
|
|
@@ -7886,12 +8273,45 @@
|
|
|
7886
8273
|
"type": "object",
|
|
7887
8274
|
"description": "A vacation rental listing in your Repull workspace.\n\nAn **inactive** listing appears only in `GET /v1/listings`, and only when `?status=` asks for it. Such a row carries identity fields only \u2014 `id`, `name`, `status`, `channels` \u2014 so `address`, `content`, `details`, `createdAt` and `updatedAt` are absent until the listing is activated. `GET /v1/listings/{id}` and every other listing endpoint answer `403 listing_inactive` for it. The one field you can add back is `thumbnailUrl`, by passing `?include=thumbnail` \u2014 enough to render an activate/deactivate picker with pictures from a single request.",
|
|
7888
8275
|
"properties": {
|
|
7889
|
-
"
|
|
7890
|
-
"type": "
|
|
7891
|
-
"description": "
|
|
7892
|
-
|
|
7893
|
-
|
|
7894
|
-
|
|
8276
|
+
"units": {
|
|
8277
|
+
"type": "array",
|
|
8278
|
+
"description": "`GET /v1/listings/{id}` only. The physical rooms under a hotel-model listing (a Mews or Cloudbeds room type); empty for a single home. Same items as `GET /v1/listings/{id}/units`.",
|
|
8279
|
+
"items": {
|
|
8280
|
+
"type": "object",
|
|
8281
|
+
"properties": {
|
|
8282
|
+
"id": {
|
|
8283
|
+
"type": "string"
|
|
8284
|
+
},
|
|
8285
|
+
"name": {
|
|
8286
|
+
"type": "string"
|
|
8287
|
+
},
|
|
8288
|
+
"active": {
|
|
8289
|
+
"type": "boolean"
|
|
8290
|
+
},
|
|
8291
|
+
"parentId": {
|
|
8292
|
+
"type": "string",
|
|
8293
|
+
"nullable": true
|
|
8294
|
+
},
|
|
8295
|
+
"housekeepingStatus": {
|
|
8296
|
+
"type": "string",
|
|
8297
|
+
"nullable": true
|
|
8298
|
+
},
|
|
8299
|
+
"floor": {
|
|
8300
|
+
"type": "string",
|
|
8301
|
+
"nullable": true
|
|
8302
|
+
},
|
|
8303
|
+
"source": {
|
|
8304
|
+
"type": "string"
|
|
8305
|
+
}
|
|
8306
|
+
}
|
|
8307
|
+
}
|
|
8308
|
+
},
|
|
8309
|
+
"id": {
|
|
8310
|
+
"type": "string",
|
|
8311
|
+
"description": "Repull listing id"
|
|
8312
|
+
},
|
|
8313
|
+
"name": {
|
|
8314
|
+
"type": "string",
|
|
7895
8315
|
"example": "I - Stafford Apartment"
|
|
7896
8316
|
},
|
|
7897
8317
|
"address": {
|
|
@@ -7964,6 +8384,9 @@
|
|
|
7964
8384
|
"ListingListResponse": {
|
|
7965
8385
|
"type": "object",
|
|
7966
8386
|
"properties": {
|
|
8387
|
+
"planNotice": {
|
|
8388
|
+
"$ref": "#/components/schemas/PlanNotice"
|
|
8389
|
+
},
|
|
7967
8390
|
"data": {
|
|
7968
8391
|
"type": "array",
|
|
7969
8392
|
"items": {
|
|
@@ -7987,7 +8410,7 @@
|
|
|
7987
8410
|
"currentPrice": {
|
|
7988
8411
|
"type": "number",
|
|
7989
8412
|
"nullable": true,
|
|
7990
|
-
"description": "Current calendar price
|
|
8413
|
+
"description": "Current calendar price before applying the recommendation."
|
|
7991
8414
|
},
|
|
7992
8415
|
"recommendedPrice": {
|
|
7993
8416
|
"type": "number",
|
|
@@ -10348,7 +10771,8 @@
|
|
|
10348
10771
|
},
|
|
10349
10772
|
"status": {
|
|
10350
10773
|
"type": "string",
|
|
10351
|
-
"
|
|
10774
|
+
"description": "Same vocabulary as `GET /v1/reservations/{id}`.",
|
|
10775
|
+
"example": "confirmed"
|
|
10352
10776
|
},
|
|
10353
10777
|
"checkIn": {
|
|
10354
10778
|
"type": "string",
|
|
@@ -10365,11 +10789,62 @@
|
|
|
10365
10789
|
"totalPrice": {
|
|
10366
10790
|
"type": "number",
|
|
10367
10791
|
"nullable": true,
|
|
10368
|
-
"description": "The price the pricing engine derived for the stay. Reservations created through this endpoint are NOT priced from the request \u2014 see the operation description."
|
|
10792
|
+
"description": "The price the pricing engine derived for the stay. Reservations created through this endpoint are NOT priced from the request \u2014 see the operation description. On a Mews or Cloudbeds listing, the PMS prices it from its own rate."
|
|
10369
10793
|
},
|
|
10370
10794
|
"currency": {
|
|
10371
10795
|
"type": "string",
|
|
10372
10796
|
"nullable": true
|
|
10797
|
+
},
|
|
10798
|
+
"unit": {
|
|
10799
|
+
"type": "object",
|
|
10800
|
+
"nullable": true,
|
|
10801
|
+
"description": "Mews or Cloudbeds listings only: the room the PMS assigned. Absent for every other listing.",
|
|
10802
|
+
"properties": {
|
|
10803
|
+
"id": {
|
|
10804
|
+
"type": "string"
|
|
10805
|
+
},
|
|
10806
|
+
"name": {
|
|
10807
|
+
"type": "string",
|
|
10808
|
+
"nullable": true
|
|
10809
|
+
}
|
|
10810
|
+
}
|
|
10811
|
+
},
|
|
10812
|
+
"pms": {
|
|
10813
|
+
"type": "object",
|
|
10814
|
+
"description": "Mews or Cloudbeds listings only: the booking was made in the PMS first, and this is what it applied.",
|
|
10815
|
+
"properties": {
|
|
10816
|
+
"provider": {
|
|
10817
|
+
"type": "string",
|
|
10818
|
+
"example": "mews"
|
|
10819
|
+
},
|
|
10820
|
+
"reservationId": {
|
|
10821
|
+
"type": "string",
|
|
10822
|
+
"description": "The PMS's own id for the booking."
|
|
10823
|
+
},
|
|
10824
|
+
"applied": {
|
|
10825
|
+
"type": "array",
|
|
10826
|
+
"items": {
|
|
10827
|
+
"type": "string"
|
|
10828
|
+
}
|
|
10829
|
+
},
|
|
10830
|
+
"errors": {
|
|
10831
|
+
"type": "array",
|
|
10832
|
+
"items": {
|
|
10833
|
+
"type": "object",
|
|
10834
|
+
"properties": {
|
|
10835
|
+
"section": {
|
|
10836
|
+
"type": "string"
|
|
10837
|
+
},
|
|
10838
|
+
"message": {
|
|
10839
|
+
"type": "string"
|
|
10840
|
+
},
|
|
10841
|
+
"code": {
|
|
10842
|
+
"type": "string"
|
|
10843
|
+
}
|
|
10844
|
+
}
|
|
10845
|
+
}
|
|
10846
|
+
}
|
|
10847
|
+
}
|
|
10373
10848
|
}
|
|
10374
10849
|
}
|
|
10375
10850
|
},
|
|
@@ -11138,7 +11613,11 @@
|
|
|
11138
11613
|
},
|
|
11139
11614
|
"mapped": {
|
|
11140
11615
|
"type": "integer",
|
|
11141
|
-
"description": "
|
|
11616
|
+
"description": "Rooms now linked to a listing."
|
|
11617
|
+
},
|
|
11618
|
+
"unmapped": {
|
|
11619
|
+
"type": "integer",
|
|
11620
|
+
"description": "Rooms submitted with `listingId: null` (\"don't map\"), which are left without a listing."
|
|
11142
11621
|
},
|
|
11143
11622
|
"sessionId": {
|
|
11144
11623
|
"type": "string"
|
|
@@ -11149,7 +11628,12 @@
|
|
|
11149
11628
|
"reservationsImported": {
|
|
11150
11629
|
"type": "integer",
|
|
11151
11630
|
"nullable": true,
|
|
11152
|
-
"description": "Reservations pulled from Booking.com once the rooms were mapped. Mapping triggers the same full property sync the dashboard's Sync button runs, because a reservation can only be resolved to a listing through a mapped room. `null` means the sync could not be run \u2014 the connection and mapping are still good, and the property can be synced from the dashboard."
|
|
11631
|
+
"description": "Reservations pulled from Booking.com once the rooms were mapped. Mapping triggers the same full property sync the dashboard's Sync button runs, because a reservation can only be resolved to a listing through a mapped room. `0` without a sync when no room was mapped. `null` means the sync could not be run \u2014 the connection and mapping are still good, and the property can be synced from the dashboard."
|
|
11632
|
+
},
|
|
11633
|
+
"reservationsFound": {
|
|
11634
|
+
"type": "integer",
|
|
11635
|
+
"nullable": true,
|
|
11636
|
+
"description": "How many reservations Booking.com returned for the property. Equal to `reservationsImported` unless some could not be attached to a listing \u2014 so `0` here means Booking.com had none. `null` when the sync could not run."
|
|
11153
11637
|
}
|
|
11154
11638
|
},
|
|
11155
11639
|
"required": [
|
|
@@ -11314,6 +11798,11 @@
|
|
|
11314
11798
|
"type": "integer",
|
|
11315
11799
|
"nullable": true,
|
|
11316
11800
|
"description": "Reservations Booking.com returned for the property and ran through the import after the room was mapped \u2014 the property's active bookings, which would otherwise never reach the listing. A reservation already present is left as it is, so this counts what was processed, not what was new, and re-sending never duplicates. Runs on every successful map, including a re-map to the same listing, so re-sending retries an import that did not run. `null` means the mapping succeeded but the import could not run; the room is still mapped. Absent after an unmap, when there is nothing to pull."
|
|
11801
|
+
},
|
|
11802
|
+
"reservationsFound": {
|
|
11803
|
+
"type": "integer",
|
|
11804
|
+
"nullable": true,
|
|
11805
|
+
"description": "How many reservations Booking.com returned for the property. Equal to `reservationsImported` unless some could not be attached \u2014 so `0` here means Booking.com had none. Same `null` / absent rules as `reservationsImported`."
|
|
11317
11806
|
}
|
|
11318
11807
|
}
|
|
11319
11808
|
},
|
|
@@ -11366,7 +11855,7 @@
|
|
|
11366
11855
|
},
|
|
11367
11856
|
"verified": {
|
|
11368
11857
|
"type": "boolean",
|
|
11369
|
-
"description": "True when the result was confirmed by reading the listing back from Airbnb
|
|
11858
|
+
"description": "True when the result was confirmed by reading the listing back from Airbnb, on `unlist` and `relist` alike: Airbnb accepting the call is not proof the listing came down or went live. `false` means the read-back could not run \u2014 an unknown, not a success. A read-back that shows the wrong state is returned as an error, not as `verified: false`."
|
|
11370
11859
|
}
|
|
11371
11860
|
}
|
|
11372
11861
|
},
|
|
@@ -11616,7 +12105,7 @@
|
|
|
11616
12105
|
},
|
|
11617
12106
|
"verified": {
|
|
11618
12107
|
"type": "boolean",
|
|
11619
|
-
"description": "Airbnb only
|
|
12108
|
+
"description": "Airbnb only: the listing was READ BACK afterwards and is in the state asked for \u2014 down after `offline`, live after `online`. Airbnb can accept a deactivation and leave a listing live, or accept an activation and keep it offline; either is returned as a failure, never as success. `false` means the read-back could not run \u2014 an unknown, not a success."
|
|
11620
12109
|
}
|
|
11621
12110
|
}
|
|
11622
12111
|
},
|
|
@@ -12330,7 +12819,7 @@
|
|
|
12330
12819
|
"$ref": "#/components/schemas/Error"
|
|
12331
12820
|
},
|
|
12332
12821
|
"examples": {
|
|
12333
|
-
"
|
|
12822
|
+
"onInactiveListing": {
|
|
12334
12823
|
"summary": "The listing is inactive",
|
|
12335
12824
|
"value": {
|
|
12336
12825
|
"error": {
|
|
@@ -12525,7 +13014,7 @@
|
|
|
12525
13014
|
}
|
|
12526
13015
|
}
|
|
12527
13016
|
},
|
|
12528
|
-
"
|
|
13017
|
+
"onInactiveListing": {
|
|
12529
13018
|
"summary": "The listing is inactive",
|
|
12530
13019
|
"value": {
|
|
12531
13020
|
"error": {
|
|
@@ -12986,7 +13475,7 @@
|
|
|
12986
13475
|
"get": {
|
|
12987
13476
|
"operationId": "get_availability",
|
|
12988
13477
|
"summary": "Get property availability",
|
|
12989
|
-
"description": "Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape \u2014 `{ date, available, price, minNights }` \u2014 projected from the property calendar.\n\nThe `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) \u2014 omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days.\n\n**`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` \u2014 their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 \u2014 404 means the property id does not exist or belongs to a different workspace.\n\nThis endpoint is read-only, and the projected per-date shape carries **availability, price, and min-nights only** \u2014 it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes.\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.",
|
|
13478
|
+
"description": "Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape \u2014 `{ date, available, price, minNights, availableUnits }` \u2014 projected from the property calendar. `availableUnits` is 1 or 0 for a single home, and the rooms of the type left for a hotel-model listing (a Mews or Cloudbeds room type).\n\nThe `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) \u2014 omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days.\n\n**`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` \u2014 their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 \u2014 404 means the property id does not exist or belongs to a different workspace.\n\nThis endpoint is read-only, and the projected per-date shape carries **availability, units left, price, and min-nights only** \u2014 it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes.\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.",
|
|
12990
13479
|
"tags": [
|
|
12991
13480
|
"Availability"
|
|
12992
13481
|
],
|
|
@@ -13637,7 +14126,7 @@
|
|
|
13637
14126
|
"get": {
|
|
13638
14127
|
"operationId": "getGuest",
|
|
13639
14128
|
"summary": "Get guest profile",
|
|
13640
|
-
"description": "Returns the full guest profile \u2014 base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates
|
|
14129
|
+
"description": "Returns the full guest profile \u2014 base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates.\n\n**Inactive listings:** a guest whose every reservation is on an inactive listing returns `403 listing_inactive` naming those listings (the guest is kept, so this is not a 404). Otherwise the reservation aggregates exclude reservations on inactive listings. A guest with no reservations is always readable.",
|
|
13641
14130
|
"tags": [
|
|
13642
14131
|
"Guests"
|
|
13643
14132
|
],
|
|
@@ -13711,7 +14200,7 @@
|
|
|
13711
14200
|
"get": {
|
|
13712
14201
|
"operationId": "listConversations",
|
|
13713
14202
|
"summary": "List conversations",
|
|
13714
|
-
"description": "Cursor-paginated list of message threads owned by the workspace.
|
|
14203
|
+
"description": "Cursor-paginated list of message threads owned by the workspace. Use `pagination.nextCursor` from one response as the `cursor` query param of the next request.\n\n`?offset=` is also accepted as a first-class alias for shallow paging (0..10000) \u2014 see the `offset` parameter below. Mutually exclusive with `cursor`.\n\nFilters: `platform` (`airbnb`|`booking`|`vrbo`|`website`|`email`), `status` (`open`|`archived` \u2014 `archived` is a stable no-op until the bit lands on `message_threads`).\n\n**Inactive listings:** conversations that belong to an inactive listing (by the thread's listing or its reservation's listing) are left out of the page and of `pagination.total`. Inactive listings keep syncing; activate the listing to use it here.",
|
|
13715
14204
|
"tags": [
|
|
13716
14205
|
"Conversations"
|
|
13717
14206
|
],
|
|
@@ -14349,7 +14838,7 @@
|
|
|
14349
14838
|
"get": {
|
|
14350
14839
|
"operationId": "listReviews",
|
|
14351
14840
|
"summary": "List reviews",
|
|
14352
|
-
"description": "Cursor-paginated guest + host review stream for the workspace.
|
|
14841
|
+
"description": "Cursor-paginated guest + host review stream for the workspace. This surface returns the complete cross-channel history \u2014 separate from `/v1/channels/airbnb/reviews` which hits Airbnb live.\n\n`?offset=` is also accepted as a first-class alias for shallow paging (0..10000) \u2014 see the `offset` parameter below. Mutually exclusive with `cursor`.\n\nFilters: `platform` (`airbnb`|`booking`|`vrbo`), `listing_id` (internal Repull listing id), `rating_min` / `rating_max` (inclusive bounds, 0..5), `status` (`responded`|`unanswered`|`all`), `reviewer_role` (`guest` (default) | `host` | `all`).\n\n**Inactive listings:** reviews of inactive listings are left out of the page and of `pagination.total`. Filtering by an inactive `listing_id` returns `403 listing_inactive`. Inactive listings keep syncing; activate the listing to use it here.",
|
|
14353
14842
|
"tags": [
|
|
14354
14843
|
"Reviews"
|
|
14355
14844
|
],
|
|
@@ -16877,7 +17366,7 @@
|
|
|
16877
17366
|
"get": {
|
|
16878
17367
|
"operationId": "get_airbnb_listing",
|
|
16879
17368
|
"summary": "Get Airbnb listing",
|
|
16880
|
-
"description": "Fetch all Airbnb connection rows for a single
|
|
17369
|
+
"description": "Fetch all Airbnb connection rows for a single Repull listing id. A property may be linked from multiple Airbnb hosts \u2014 every match is returned. Pass `?include=amenities` to enrich each row with its current Airbnb amenities.\n\nEach row carries `syncCategory` \u2014 Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) \u2014 and `writable`, which is `false` exactly when that category is `none`, meaning Airbnb refuses every write to the listing and Repull returns `403 listing_not_api_connected` without sending anything. `GET /v1/channels/airbnb/listings` reports both fields for the whole portfolio in one call.\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.",
|
|
16881
17370
|
"tags": [
|
|
16882
17371
|
"Airbnb"
|
|
16883
17372
|
],
|
|
@@ -16919,7 +17408,7 @@
|
|
|
16919
17408
|
"post": {
|
|
16920
17409
|
"operationId": "airbnb_listing_action",
|
|
16921
17410
|
"summary": "Listing action (delete/push/publish/unlist/relist)",
|
|
16922
|
-
"description": "Apply a state action to a listing by id. The path `id` is the canonical Repull listing id.\n\n**`delete` here never touches Airbnb. Read this before you call it.**\n\n| | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) |\n|---|---|---|\n| What it changes | The Repull record | The live Airbnb listing |\n| Calls Airbnb | **No. Never.** | Yes |\n| The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings |\n| Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged |\n| API access to the listing | `403 listing_inactive` until reactivated | Unchanged \u2014 you can still read and write it |\n| Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` |\n| Data kept | Yes, and it keeps syncing | Yes |\n\nNeither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** \u2014 the word `delete` on this route means \"deactivate the Repull record\" and nothing else
|
|
17411
|
+
"description": "Apply a state action to a listing by id. The path `id` is the canonical Repull listing id.\n\n**`delete` here never touches Airbnb. Read this before you call it.**\n\n| | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) |\n|---|---|---|\n| What it changes | The Repull record | The live Airbnb listing |\n| Calls Airbnb | **No. Never.** | Yes |\n| The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings |\n| Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged |\n| API access to the listing | `403 listing_inactive` until reactivated | Unchanged \u2014 you can still read and write it |\n| Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` |\n| Data kept | Yes, and it keeps syncing | Yes |\n\nNeither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** \u2014 the word `delete` on this route means \"deactivate the Repull record\" and nothing else.\n\n`delete` is idempotent. To take a listing off the market on every channel at once \u2014 Airbnb and Booking.com together \u2014 use `POST /v1/listings/{id}/offline`.\n\n`unlist` calls Airbnb and **takes the live listing down**: it is deactivated with a valid deactivation reason and then READ BACK, so \"Airbnb accepted the call but the listing is still live\" is reported as a failure rather than a success. Requires `airbnbConnectionId` \u2014 a listing can be connected to more than one Airbnb listing, and taking down the wrong one is not undoable through this API. `relist` puts it back up (re-enables sync and makes the listing available again); it does not push content.\n\n`relist` goes through the channel-publish billing gate and `unlist` does not, so on a workspace whose subscription has lapsed a listing can be taken down and not put back until billing is sorted out. That refusal comes back as `402` with the action that fixes it \u2014 never as an Airbnb error, because retrying and reconnecting Airbnb do nothing for it.\n\n`push` / `publish` push the listing's content to Airbnb via the same host-side sync orchestrator as `POST /v1/listings/{id}/publish/airbnb` \u2014 pass `airbnbConnectionId` to update an already-mapped Airbnb listing, or `hostId` to create + publish a new one under that host. `force` re-pushes every field, ignoring dirty-field tracking. The result is per-section: see `AirbnbPublishResult`.\n\nAny other action (e.g. `pull`) returns a structured 422 naming the supported actions.\n\nReturns `403 listing_inactive` for `push`/`publish`/`unlist`/`relist` when the listing is inactive. `delete` (deactivation) is always accepted.",
|
|
16923
17412
|
"tags": [
|
|
16924
17413
|
"Airbnb"
|
|
16925
17414
|
],
|
|
@@ -18316,8 +18805,8 @@
|
|
|
18316
18805
|
"/v1/channels/airbnb/reviews/{id}": {
|
|
18317
18806
|
"put": {
|
|
18318
18807
|
"operationId": "edit_airbnb_review",
|
|
18319
|
-
"summary": "
|
|
18320
|
-
"description": "
|
|
18808
|
+
"summary": "Submit your review of a guest (publishes, final)",
|
|
18809
|
+
"description": "Submit your review of a guest \u2014 the review with `reviewerRole: \"host\"`. **Submitting publishes it and is final:** Airbnb has no draft and does not allow edits; a second submission is `409 review_already_submitted`. Airbnb accepts it up to 14 days after checkout (`expiresAt`).\n\nRequired: `publicReview`, `isRevieweeRecommended` (whether you would host the guest again), and a 1\u20135 rating for **each** of `cleanliness`, `communication` and `respect_house_rules` \u2014 send `rating` to use one score for all three, `categoryRatings` to score them individually, or both (`rating` fills any category you did not rate). Optional: `privateFeedback`, a note to the guest that is not published. A request missing a required piece is refused with `422 invalid_params` naming it, before anything is sent to Airbnb.\n\n```json\n{\n \"publicReview\": \"Joanne was a great guest.\",\n \"rating\": 5,\n \"privateFeedback\": \"Thanks for leaving the place so tidy!\",\n \"isRevieweeRecommended\": true\n}\n```\n\nA guest's review of you (`reviewerRole: \"guest\"`) cannot be written here \u2014 `409 not_host_review`; reply to it with `POST /v1/channels/airbnb/reviews/{id}/respond`. After the window closes: `409 review_window_closed`. Full guide: https://repull.dev/docs/channels/airbnb/reviews",
|
|
18321
18810
|
"tags": [
|
|
18322
18811
|
"Airbnb"
|
|
18323
18812
|
],
|
|
@@ -18329,7 +18818,7 @@
|
|
|
18329
18818
|
"schema": {
|
|
18330
18819
|
"type": "string"
|
|
18331
18820
|
},
|
|
18332
|
-
"description": "
|
|
18821
|
+
"description": "The review's `id` or `externalReviewId`, both as returned by `GET /v1/reviews`."
|
|
18333
18822
|
}
|
|
18334
18823
|
],
|
|
18335
18824
|
"requestBody": {
|
|
@@ -18337,7 +18826,7 @@
|
|
|
18337
18826
|
"content": {
|
|
18338
18827
|
"application/json": {
|
|
18339
18828
|
"schema": {
|
|
18340
|
-
"$ref": "#/components/schemas/
|
|
18829
|
+
"$ref": "#/components/schemas/AirbnbHostReviewSubmit"
|
|
18341
18830
|
}
|
|
18342
18831
|
}
|
|
18343
18832
|
}
|
|
@@ -18757,25 +19246,105 @@
|
|
|
18757
19246
|
"/v1/channels/airbnb/transactions": {
|
|
18758
19247
|
"get": {
|
|
18759
19248
|
"operationId": "list_airbnb_transactions",
|
|
18760
|
-
"summary": "List Airbnb transactions",
|
|
18761
|
-
"description": "
|
|
19249
|
+
"summary": "List Airbnb transactions (settlement ledger)",
|
|
19250
|
+
"description": "The Airbnb settlement ledger for this workspace: every payout Airbnb sent to the host, each followed by the lines it paid \u2014 reservations and their installments, adjustments, resolution payouts and adjustments, cancellation fees. A payout's lines' signed `amount`s sum to its `payout.paidOutAmount` exactly, negative lines included (an adjustment offset against a later payout appears under that payout). `status: UPCOMING` lines are expected earnings not paid out yet; they belong to no payout.\n\n**Ids are stable.** Airbnb sends no line id and no payout id on lines, so Repull derives them deterministically: a Payout row's id is Airbnb's payout id; a line's is `<payoutId>:<type>:<confirmationCode>:<n>`. The same line has the same id on every refresh and every page, so you can upsert on `transactionId`. A payout that nets to $0.00 has no Airbnb id; it gets a derived `Z-<date>-<hash>` id with `payout.payoutIdSynthetic: true`.\n\n**Order:** newest first by the payout's date; each Payout row is followed by its lines in Airbnb's order (`payout.lineIndex`).\n\n**Dates:** `start_date` / `end_date` match the payout's date for settled lines (a line can be dated the day before its payout, and is still returned with it) and the line's own date for UPCOMING lines.\n\n**Pure DB read** \u2014 never calls Airbnb. Refresh with `POST` on this path. `dataFreshness` reports when each account's ledger was last refreshed.\n\nLines on listings that are inactive in Repull are included and flagged `onInactiveListing: true`, so every payout reconciles. Lines Repull cannot match to a reservation keep `reservationId: null`.\n\n**Not in Airbnb's transaction history** (listed in `unavailableFields`): taxes Airbnb collects and remits itself, and the guest-paid total (see the reservation's financial breakdown); pass-through occupancy tax paid to the host does appear, as its own `Pass Through Tot` lines, the original line a refund or reversal reverses (it names the stay and the resolution), and currency-conversion amounts (only the payout currency is reported).",
|
|
18762
19251
|
"tags": [
|
|
18763
19252
|
"Airbnb"
|
|
18764
19253
|
],
|
|
18765
19254
|
"parameters": [
|
|
18766
19255
|
{
|
|
18767
19256
|
"$ref": "#/components/parameters/AirbnbAccountId"
|
|
19257
|
+
},
|
|
19258
|
+
{
|
|
19259
|
+
"name": "start_date",
|
|
19260
|
+
"in": "query",
|
|
19261
|
+
"required": false,
|
|
19262
|
+
"description": "Inclusive lower bound on the payout's date (the line's own date for UPCOMING lines). YYYY-MM-DD.",
|
|
19263
|
+
"schema": {
|
|
19264
|
+
"type": "string",
|
|
19265
|
+
"format": "date"
|
|
19266
|
+
}
|
|
19267
|
+
},
|
|
19268
|
+
{
|
|
19269
|
+
"name": "end_date",
|
|
19270
|
+
"in": "query",
|
|
19271
|
+
"required": false,
|
|
19272
|
+
"description": "Inclusive upper bound, as `start_date`.",
|
|
19273
|
+
"schema": {
|
|
19274
|
+
"type": "string",
|
|
19275
|
+
"format": "date"
|
|
19276
|
+
}
|
|
19277
|
+
},
|
|
19278
|
+
{
|
|
19279
|
+
"name": "status",
|
|
19280
|
+
"in": "query",
|
|
19281
|
+
"required": false,
|
|
19282
|
+
"description": "`COMPLETED` (settled) or `UPCOMING` (expected).",
|
|
19283
|
+
"schema": {
|
|
19284
|
+
"type": "string",
|
|
19285
|
+
"enum": [
|
|
19286
|
+
"COMPLETED",
|
|
19287
|
+
"UPCOMING"
|
|
19288
|
+
]
|
|
19289
|
+
}
|
|
19290
|
+
},
|
|
19291
|
+
{
|
|
19292
|
+
"name": "type",
|
|
19293
|
+
"in": "query",
|
|
19294
|
+
"required": false,
|
|
19295
|
+
"description": "Airbnb's line type, exact match ignoring case \u2014 e.g. `Payout`, `Reservation`, `Adjustment`, `Resolution Payout`.",
|
|
19296
|
+
"schema": {
|
|
19297
|
+
"type": "string"
|
|
19298
|
+
}
|
|
19299
|
+
},
|
|
19300
|
+
{
|
|
19301
|
+
"name": "payout_id",
|
|
19302
|
+
"in": "query",
|
|
19303
|
+
"required": false,
|
|
19304
|
+
"description": "One payout: its Payout row and all its lines.",
|
|
19305
|
+
"schema": {
|
|
19306
|
+
"type": "string"
|
|
19307
|
+
}
|
|
19308
|
+
},
|
|
19309
|
+
{
|
|
19310
|
+
"name": "confirmation_code",
|
|
19311
|
+
"in": "query",
|
|
19312
|
+
"required": false,
|
|
19313
|
+
"description": "Every line for one reservation \u2014 each installment, adjustment and resolution.",
|
|
19314
|
+
"schema": {
|
|
19315
|
+
"type": "string"
|
|
19316
|
+
}
|
|
19317
|
+
},
|
|
19318
|
+
{
|
|
19319
|
+
"name": "limit",
|
|
19320
|
+
"in": "query",
|
|
19321
|
+
"schema": {
|
|
19322
|
+
"type": "integer",
|
|
19323
|
+
"default": 100,
|
|
19324
|
+
"minimum": 1,
|
|
19325
|
+
"maximum": 500
|
|
19326
|
+
},
|
|
19327
|
+
"description": "Lines per page. Hard cap is 500."
|
|
19328
|
+
},
|
|
19329
|
+
{
|
|
19330
|
+
"name": "cursor",
|
|
19331
|
+
"in": "query",
|
|
19332
|
+
"schema": {
|
|
19333
|
+
"type": "string"
|
|
19334
|
+
},
|
|
19335
|
+
"description": "Opaque cursor returned by the previous response's `pagination.nextCursor`. Omit to fetch the first page."
|
|
18768
19336
|
}
|
|
18769
19337
|
],
|
|
18770
19338
|
"responses": {
|
|
18771
19339
|
"200": {
|
|
18772
|
-
"description": "
|
|
19340
|
+
"description": "Ledger lines",
|
|
18773
19341
|
"content": {
|
|
18774
19342
|
"application/json": {
|
|
18775
19343
|
"schema": {
|
|
18776
19344
|
"type": "object",
|
|
18777
19345
|
"required": [
|
|
18778
19346
|
"data",
|
|
19347
|
+
"pagination",
|
|
18779
19348
|
"dataFreshness"
|
|
18780
19349
|
],
|
|
18781
19350
|
"properties": {
|
|
@@ -18785,6 +19354,9 @@
|
|
|
18785
19354
|
"$ref": "#/components/schemas/AirbnbTransaction"
|
|
18786
19355
|
}
|
|
18787
19356
|
},
|
|
19357
|
+
"pagination": {
|
|
19358
|
+
"$ref": "#/components/schemas/Pagination"
|
|
19359
|
+
},
|
|
18788
19360
|
"dataFreshness": {
|
|
18789
19361
|
"$ref": "#/components/schemas/AirbnbDataFreshness"
|
|
18790
19362
|
}
|
|
@@ -18799,6 +19371,16 @@
|
|
|
18799
19371
|
"404": {
|
|
18800
19372
|
"$ref": "#/components/responses/AirbnbAccountNotFound"
|
|
18801
19373
|
},
|
|
19374
|
+
"422": {
|
|
19375
|
+
"description": "A filter or body field is malformed (dates are YYYY-MM-DD; status is COMPLETED or UPCOMING).",
|
|
19376
|
+
"content": {
|
|
19377
|
+
"application/json": {
|
|
19378
|
+
"schema": {
|
|
19379
|
+
"$ref": "#/components/schemas/Error"
|
|
19380
|
+
}
|
|
19381
|
+
}
|
|
19382
|
+
}
|
|
19383
|
+
},
|
|
18802
19384
|
"500": {
|
|
18803
19385
|
"$ref": "#/components/responses/InternalError"
|
|
18804
19386
|
}
|
|
@@ -18806,11 +19388,16 @@
|
|
|
18806
19388
|
},
|
|
18807
19389
|
"post": {
|
|
18808
19390
|
"operationId": "sync_airbnb_transactions",
|
|
18809
|
-
"summary": "
|
|
18810
|
-
"description": "
|
|
19391
|
+
"summary": "Refresh Airbnb transactions",
|
|
19392
|
+
"description": "Pull the transaction history from Airbnb into the ledger `GET` serves. Every connected Airbnb account is refreshed, or only `?account_id=`. Without dates: settled lines from the last 12 months and the forecast for the next 12. Safe to repeat: settled lines are upserted on their stable ids, never duplicated or removed; the UPCOMING forecast inside the fetched window is replaced, so a line that has since been paid out moves to its payout. Each account reports its own outcome in `accounts[]`: one account Airbnb refuses (a revoked host, a listing Airbnb no longer serves) is reported there with Airbnb's reason and does not stop the others. When every account fails, the response is Airbnb's answer with its usual code.",
|
|
18811
19393
|
"tags": [
|
|
18812
19394
|
"Airbnb"
|
|
18813
19395
|
],
|
|
19396
|
+
"parameters": [
|
|
19397
|
+
{
|
|
19398
|
+
"$ref": "#/components/parameters/AirbnbAccountId"
|
|
19399
|
+
}
|
|
19400
|
+
],
|
|
18814
19401
|
"requestBody": {
|
|
18815
19402
|
"required": false,
|
|
18816
19403
|
"content": {
|
|
@@ -18821,19 +19408,20 @@
|
|
|
18821
19408
|
"start_date": {
|
|
18822
19409
|
"type": "string",
|
|
18823
19410
|
"format": "date",
|
|
18824
|
-
"description": "Inclusive lower bound
|
|
19411
|
+
"description": "Inclusive lower bound (YYYY-MM-DD)."
|
|
18825
19412
|
},
|
|
18826
19413
|
"end_date": {
|
|
18827
19414
|
"type": "string",
|
|
18828
19415
|
"format": "date",
|
|
18829
|
-
"description": "Inclusive upper bound
|
|
19416
|
+
"description": "Inclusive upper bound (YYYY-MM-DD)."
|
|
18830
19417
|
},
|
|
18831
19418
|
"transaction_type": {
|
|
18832
19419
|
"type": "string",
|
|
18833
19420
|
"enum": [
|
|
18834
19421
|
"COMPLETED",
|
|
18835
19422
|
"UPCOMING"
|
|
18836
|
-
]
|
|
19423
|
+
],
|
|
19424
|
+
"description": "Refresh only settled or only upcoming lines. Both when omitted."
|
|
18837
19425
|
}
|
|
18838
19426
|
}
|
|
18839
19427
|
}
|
|
@@ -18842,14 +19430,15 @@
|
|
|
18842
19430
|
},
|
|
18843
19431
|
"responses": {
|
|
18844
19432
|
"200": {
|
|
18845
|
-
"description": "
|
|
19433
|
+
"description": "Refresh result",
|
|
18846
19434
|
"content": {
|
|
18847
19435
|
"application/json": {
|
|
18848
19436
|
"schema": {
|
|
18849
19437
|
"type": "object",
|
|
18850
19438
|
"required": [
|
|
18851
19439
|
"synced",
|
|
18852
|
-
"count"
|
|
19440
|
+
"count",
|
|
19441
|
+
"accounts"
|
|
18853
19442
|
],
|
|
18854
19443
|
"properties": {
|
|
18855
19444
|
"synced": {
|
|
@@ -18857,7 +19446,52 @@
|
|
|
18857
19446
|
},
|
|
18858
19447
|
"count": {
|
|
18859
19448
|
"type": "integer",
|
|
18860
|
-
"description": "
|
|
19449
|
+
"description": "Ledger lines written, Payout rows included."
|
|
19450
|
+
},
|
|
19451
|
+
"accounts": {
|
|
19452
|
+
"type": "array",
|
|
19453
|
+
"items": {
|
|
19454
|
+
"type": "object",
|
|
19455
|
+
"required": [
|
|
19456
|
+
"accountId",
|
|
19457
|
+
"count",
|
|
19458
|
+
"payouts",
|
|
19459
|
+
"upcomingRemoved"
|
|
19460
|
+
],
|
|
19461
|
+
"properties": {
|
|
19462
|
+
"accountId": {
|
|
19463
|
+
"type": "string",
|
|
19464
|
+
"description": "Airbnb host id."
|
|
19465
|
+
},
|
|
19466
|
+
"count": {
|
|
19467
|
+
"type": "integer"
|
|
19468
|
+
},
|
|
19469
|
+
"payouts": {
|
|
19470
|
+
"type": "integer",
|
|
19471
|
+
"description": "Payouts in the refreshed window."
|
|
19472
|
+
},
|
|
19473
|
+
"upcomingRemoved": {
|
|
19474
|
+
"type": "integer",
|
|
19475
|
+
"description": "UPCOMING lines Airbnb no longer lists (paid out or cancelled) and were removed."
|
|
19476
|
+
},
|
|
19477
|
+
"error": {
|
|
19478
|
+
"type": "object",
|
|
19479
|
+
"required": [
|
|
19480
|
+
"code",
|
|
19481
|
+
"message"
|
|
19482
|
+
],
|
|
19483
|
+
"description": "Present only when this account was not refreshed. `code` is `connection_reauth_required`, `airbnb_rejected`, `airbnb_rate_limited`, `airbnb_error`, or `time_budget` (the request ran out of time before reaching it: refresh it alone with `?account_id=`).",
|
|
19484
|
+
"properties": {
|
|
19485
|
+
"code": {
|
|
19486
|
+
"type": "string"
|
|
19487
|
+
},
|
|
19488
|
+
"message": {
|
|
19489
|
+
"type": "string"
|
|
19490
|
+
}
|
|
19491
|
+
}
|
|
19492
|
+
}
|
|
19493
|
+
}
|
|
19494
|
+
}
|
|
18861
19495
|
}
|
|
18862
19496
|
}
|
|
18863
19497
|
}
|
|
@@ -18867,6 +19501,19 @@
|
|
|
18867
19501
|
"401": {
|
|
18868
19502
|
"$ref": "#/components/responses/Unauthorized"
|
|
18869
19503
|
},
|
|
19504
|
+
"403": {
|
|
19505
|
+
"description": "`connection_reauth_required`: Airbnb no longer accepts this account's connection. Reconnect it.",
|
|
19506
|
+
"content": {
|
|
19507
|
+
"application/json": {
|
|
19508
|
+
"schema": {
|
|
19509
|
+
"$ref": "#/components/schemas/Error"
|
|
19510
|
+
}
|
|
19511
|
+
}
|
|
19512
|
+
}
|
|
19513
|
+
},
|
|
19514
|
+
"404": {
|
|
19515
|
+
"$ref": "#/components/responses/AirbnbAccountNotFound"
|
|
19516
|
+
},
|
|
18870
19517
|
"409": {
|
|
18871
19518
|
"description": "No connected Airbnb account for this workspace.",
|
|
18872
19519
|
"content": {
|
|
@@ -18877,8 +19524,38 @@
|
|
|
18877
19524
|
}
|
|
18878
19525
|
}
|
|
18879
19526
|
},
|
|
19527
|
+
"422": {
|
|
19528
|
+
"description": "A body field is malformed, or `airbnb_rejected`: Airbnb refused the request for every account.",
|
|
19529
|
+
"content": {
|
|
19530
|
+
"application/json": {
|
|
19531
|
+
"schema": {
|
|
19532
|
+
"$ref": "#/components/schemas/Error"
|
|
19533
|
+
}
|
|
19534
|
+
}
|
|
19535
|
+
}
|
|
19536
|
+
},
|
|
19537
|
+
"429": {
|
|
19538
|
+
"description": "`airbnb_rate_limited`: Airbnb is throttling this account. Retry after `retry_after` seconds.",
|
|
19539
|
+
"content": {
|
|
19540
|
+
"application/json": {
|
|
19541
|
+
"schema": {
|
|
19542
|
+
"$ref": "#/components/schemas/Error"
|
|
19543
|
+
}
|
|
19544
|
+
}
|
|
19545
|
+
}
|
|
19546
|
+
},
|
|
18880
19547
|
"500": {
|
|
18881
19548
|
"$ref": "#/components/responses/InternalError"
|
|
19549
|
+
},
|
|
19550
|
+
"502": {
|
|
19551
|
+
"description": "`airbnb_error`: Airbnb did not complete the request. Retry with backoff.",
|
|
19552
|
+
"content": {
|
|
19553
|
+
"application/json": {
|
|
19554
|
+
"schema": {
|
|
19555
|
+
"$ref": "#/components/schemas/Error"
|
|
19556
|
+
}
|
|
19557
|
+
}
|
|
19558
|
+
}
|
|
18882
19559
|
}
|
|
18883
19560
|
}
|
|
18884
19561
|
}
|
|
@@ -20440,7 +21117,7 @@
|
|
|
20440
21117
|
"post": {
|
|
20441
21118
|
"operationId": "create_airbnb_offer",
|
|
20442
21119
|
"summary": "Create Airbnb special offer or pre-approval",
|
|
20443
|
-
"description": "Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** \u2014 calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in
|
|
21120
|
+
"description": "Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** \u2014 calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in Repull, are `POST /v1/conversations/{id}/pre-approval` and `POST /v1/conversations/{id}/special-offers` \u2014 prefer those unless you only hold Airbnb ids.\n\n- `type: \"preapproval\"` \u2014 let the guest book the dates and price they asked about. Requires `thread_id`; optional `block_instant_booking`.\n- `type: \"offer\"` \u2014 your own terms. Requires `thread_id`, `listing_id` (the **Airbnb** listing id, as a string), `start_date`, `nights`, `total_price` (whole stay, listing currency) and `guest_details` with `number_of_guests` (or `number_of_adults`; Airbnb counts adults + children).\n\nThe body is validated before anything reaches Airbnb (a `422 invalid_params` names the field), and unknown fields are refused. The legacy spellings `threadId` and `blockInstantBooking` still work. The request is sent as the Airbnb account that owns the thread or listing.\n\nAirbnb refusals are mapped rather than returned as a 500: `409 inquiry_no_longer_open` / `inquiry_expired` when the inquiry moved on, `422 airbnb_rejected` with Airbnb\u2019s reason otherwise, `403 connection_reauth_required` when the grant does not allow it.\n\nReturns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated.\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.",
|
|
20444
21121
|
"tags": [
|
|
20445
21122
|
"Airbnb"
|
|
20446
21123
|
],
|
|
@@ -21192,7 +21869,7 @@
|
|
|
21192
21869
|
"post": {
|
|
21193
21870
|
"operationId": "createListing",
|
|
21194
21871
|
"summary": "Create a Repull listing",
|
|
21195
|
-
"description": "Create a new vacation-rental listing under the authenticated workspace. The listing is stored
|
|
21872
|
+
"description": "Create a new vacation-rental listing under the authenticated workspace. The listing is stored as a canonical Repull listing and can be published to multiple channels (Airbnb, Booking.com) via the publish endpoints.",
|
|
21196
21873
|
"tags": [
|
|
21197
21874
|
"Listings"
|
|
21198
21875
|
],
|
|
@@ -21536,7 +22213,24 @@
|
|
|
21536
22213
|
"$ref": "#/components/responses/ListingInactive"
|
|
21537
22214
|
},
|
|
21538
22215
|
"404": {
|
|
21539
|
-
"
|
|
22216
|
+
"description": "`not_found`: the listing does not exist in this workspace. `no_connection`: no Airbnb account is connected \u2014 connect one with `POST /v1/connect/airbnb`, then send its `hostId`.",
|
|
22217
|
+
"content": {
|
|
22218
|
+
"application/json": {
|
|
22219
|
+
"schema": {
|
|
22220
|
+
"$ref": "#/components/schemas/Error"
|
|
22221
|
+
}
|
|
22222
|
+
}
|
|
22223
|
+
}
|
|
22224
|
+
},
|
|
22225
|
+
"422": {
|
|
22226
|
+
"description": "`invalid_params`: neither `airbnbConnectionId` nor `hostId` was sent. The error names the values that work for this listing \u2014 its existing Airbnb connection ids, or the connected accounts' `hostId`s \u2014 in `valid_values`.",
|
|
22227
|
+
"content": {
|
|
22228
|
+
"application/json": {
|
|
22229
|
+
"schema": {
|
|
22230
|
+
"$ref": "#/components/schemas/Error"
|
|
22231
|
+
}
|
|
22232
|
+
}
|
|
22233
|
+
}
|
|
21540
22234
|
}
|
|
21541
22235
|
}
|
|
21542
22236
|
}
|
|
@@ -21545,7 +22239,7 @@
|
|
|
21545
22239
|
"post": {
|
|
21546
22240
|
"operationId": "publishListingToBooking",
|
|
21547
22241
|
"summary": "Publish a listing to Booking.com",
|
|
21548
|
-
"description": "Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room \u2014 claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`.\n\n**Which property the content lands in.** A listing can be mapped to more than one Booking.com property; the same unit re-listed under a new property keeps its old mapping, and workspaces routinely sit on five or six. When the listing has exactly one property you need send nothing. When it has several, name one with `hotelId` in the body (or `?hotel_id=` \u2014 the same value, accepted either way, body wins if you send both). Omit it on such a listing and the push is refused with **`409 ambiguous_booking_mapping`**, listing the candidate ids: content pushed into a property chosen for you lands on the wrong listing and reports success, which is worse than a refusal. `GET /v1/channels/booking/properties` lists every property with the listings mapped under it. Naming a property this listing is not mapped to is a `404` that names the ones it is.\n\nThe property that actually received the content comes back as `result.hotelId`.\n\n**A publish is not one call to Booking.com.** It is several independent Content API calls \u2014 details, description, amenities, rooms, photos, pricing \u2014 and each can fail on its own. `result.published` is true only when every attempted section landed; `result.sections` lists the ones that did and `result.errors[]` carries Booking.com's own reason, per section, for the ones that did not. A property whose Content API credentials do not cover a section answers 403 for that section alone. **A partial publish is normal and is not rolled back**: what succeeded stays applied. Fix the failing sections and publish again \u2014 re-publishing an unchanged section is harmless.\n\nA listing with no Booking.com property mapped at all is not an error: the call returns `result.published: false` with `result.reason` and `result.hotelId: null`, and nothing is pushed.\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.",
|
|
22242
|
+
"description": "Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room \u2014 claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`.\n\n**Which property the content lands in.** A listing can be mapped to more than one Booking.com property; the same unit re-listed under a new property keeps its old mapping, and workspaces routinely sit on five or six. When the listing has exactly one property you need send nothing. When it has several, name one with `hotelId` in the body (or `?hotel_id=` \u2014 the same value, accepted either way, body wins if you send both). Omit it on such a listing and the push is refused with **`409 ambiguous_booking_mapping`**, listing the candidate ids: content pushed into a property chosen for you lands on the wrong listing and reports success, which is worse than a refusal. `GET /v1/channels/booking/properties` lists every property with the listings mapped under it. Naming a property this listing is not mapped to is a `404` that names the ones it is.\n\nThe property that actually received the content comes back as `result.hotelId`.\n\n**A publish is not one call to Booking.com.** It is several independent Content API calls \u2014 details, description, amenities, rooms, photos, pricing \u2014 and each can fail on its own. `result.published` is true only when every attempted section landed; `result.sections` lists the ones that did and `result.errors[]` carries Booking.com's own reason, per section, for the ones that did not. A property whose Content API credentials do not cover a section answers 403 for that section alone. **A partial publish is normal and is not rolled back**: what succeeded stays applied. Fix the failing sections and publish again \u2014 re-publishing an unchanged section is harmless.\n\nA listing with no Booking.com property mapped at all is not an error: the call returns `result.published: false` with `result.reason` and `result.hotelId: null`, and nothing is pushed.\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.\n\nA listing with no Booking.com room linked is refused with `409 listing_not_on_booking` and the next step, rather than answered with `published: false`.",
|
|
21549
22243
|
"tags": [
|
|
21550
22244
|
"Listings"
|
|
21551
22245
|
],
|
|
@@ -21603,11 +22297,18 @@
|
|
|
21603
22297
|
"$ref": "#/components/responses/NotFound"
|
|
21604
22298
|
},
|
|
21605
22299
|
"409": {
|
|
21606
|
-
"
|
|
21607
|
-
|
|
21608
|
-
|
|
21609
|
-
|
|
21610
|
-
|
|
22300
|
+
"description": "`listing_not_on_booking`: no Booking.com room is linked to this listing. `fix` names the next step for this workspace \u2014 link a room (`POST /v1/channels/booking/listings/map`) or create a property (`POST /v1/channels/booking/setup`, `create-property`). Also `ambiguous_booking_mapping` when the listing is on several properties and no `hotelId` was sent.",
|
|
22301
|
+
"content": {
|
|
22302
|
+
"application/json": {
|
|
22303
|
+
"schema": {
|
|
22304
|
+
"$ref": "#/components/schemas/Error"
|
|
22305
|
+
}
|
|
22306
|
+
}
|
|
22307
|
+
}
|
|
22308
|
+
}
|
|
22309
|
+
}
|
|
22310
|
+
}
|
|
22311
|
+
},
|
|
21611
22312
|
"/v1/listings/{id}/publish-status": {
|
|
21612
22313
|
"get": {
|
|
21613
22314
|
"operationId": "getListingPublishStatus",
|
|
@@ -21653,7 +22354,7 @@
|
|
|
21653
22354
|
"post": {
|
|
21654
22355
|
"operationId": "createListingPhotoUploadUrl",
|
|
21655
22356
|
"summary": "Mint a direct-to-storage photo upload URL",
|
|
21656
|
-
"description": "Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` \u2014 the file bytes never pass through the Repull API
|
|
22357
|
+
"description": "Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` \u2014 the file bytes never pass through the Repull API.** This endpoint only mints the URL; do not POST the file itself here, it will not be accepted.\n\nFlow: (1) POST here with `fileName`, `fileType` and `fileSize` (bytes) to get `{ uploadUrl, token, path, publicUrl, expiresIn }`; (2) PUT the raw file bytes to `uploadUrl` from the client; (3) **attach it** \u2014 uploading does not put the photo on the listing: send `publicUrl` in `photos` on `PUT /v1/listings/{id}/content` (with `photosMode: \"append\"` to keep existing photos). The response's `nextStep` says the same.\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.",
|
|
21657
22358
|
"tags": [
|
|
21658
22359
|
"Listings"
|
|
21659
22360
|
],
|
|
@@ -21874,7 +22575,7 @@
|
|
|
21874
22575
|
"schema": {
|
|
21875
22576
|
"type": "boolean"
|
|
21876
22577
|
},
|
|
21877
|
-
"description": "Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
22578
|
+
"description": "Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read \u2014 its `roomsToSell` is often 0 for rooms that are on sale."
|
|
21878
22579
|
}
|
|
21879
22580
|
],
|
|
21880
22581
|
"responses": {
|
|
@@ -22437,7 +23138,7 @@
|
|
|
22437
23138
|
"schema": {
|
|
22438
23139
|
"type": "boolean"
|
|
22439
23140
|
},
|
|
22440
|
-
"description": "Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
23141
|
+
"description": "Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read \u2014 its `roomsToSell` is often 0 for rooms that are on sale."
|
|
22441
23142
|
},
|
|
22442
23143
|
{
|
|
22443
23144
|
"name": "hotel_id",
|
|
@@ -23553,7 +24254,7 @@
|
|
|
23553
24254
|
"$ref": "#/components/responses/ListingInactive"
|
|
23554
24255
|
},
|
|
23555
24256
|
"502": {
|
|
23556
|
-
"description": "Upstream
|
|
24257
|
+
"description": "Upstream market-data failure"
|
|
23557
24258
|
}
|
|
23558
24259
|
}
|
|
23559
24260
|
},
|
|
@@ -23732,7 +24433,7 @@
|
|
|
23732
24433
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
23733
24434
|
},
|
|
23734
24435
|
"502": {
|
|
23735
|
-
"description": "Upstream
|
|
24436
|
+
"description": "Upstream market-data failure",
|
|
23736
24437
|
"content": {
|
|
23737
24438
|
"application/json": {
|
|
23738
24439
|
"schema": {
|
|
@@ -23832,7 +24533,7 @@
|
|
|
23832
24533
|
"$ref": "#/components/responses/UnprocessableEntity"
|
|
23833
24534
|
},
|
|
23834
24535
|
"502": {
|
|
23835
|
-
"description": "Upstream
|
|
24536
|
+
"description": "Upstream market-data failure",
|
|
23836
24537
|
"content": {
|
|
23837
24538
|
"application/json": {
|
|
23838
24539
|
"schema": {
|
|
@@ -23930,7 +24631,7 @@
|
|
|
23930
24631
|
"$ref": "#/components/responses/NotFound"
|
|
23931
24632
|
},
|
|
23932
24633
|
"502": {
|
|
23933
|
-
"description": "Upstream
|
|
24634
|
+
"description": "Upstream market-data failure",
|
|
23934
24635
|
"content": {
|
|
23935
24636
|
"application/json": {
|
|
23936
24637
|
"schema": {
|
|
@@ -24010,7 +24711,7 @@
|
|
|
24010
24711
|
"$ref": "#/components/responses/NotFound"
|
|
24011
24712
|
},
|
|
24012
24713
|
"502": {
|
|
24013
|
-
"description": "Upstream
|
|
24714
|
+
"description": "Upstream market-data failure",
|
|
24014
24715
|
"content": {
|
|
24015
24716
|
"application/json": {
|
|
24016
24717
|
"schema": {
|
|
@@ -24045,7 +24746,7 @@
|
|
|
24045
24746
|
"$ref": "#/components/responses/Unauthorized"
|
|
24046
24747
|
},
|
|
24047
24748
|
"502": {
|
|
24048
|
-
"description": "Upstream
|
|
24749
|
+
"description": "Upstream market-data failure"
|
|
24049
24750
|
}
|
|
24050
24751
|
}
|
|
24051
24752
|
}
|
|
@@ -24142,7 +24843,7 @@
|
|
|
24142
24843
|
"$ref": "#/components/responses/Unauthorized"
|
|
24143
24844
|
},
|
|
24144
24845
|
"502": {
|
|
24145
|
-
"description": "Upstream
|
|
24846
|
+
"description": "Upstream market-data failure",
|
|
24146
24847
|
"content": {
|
|
24147
24848
|
"application/json": {
|
|
24148
24849
|
"schema": {
|
|
@@ -24656,6 +25357,9 @@
|
|
|
24656
25357
|
},
|
|
24657
25358
|
"range": {
|
|
24658
25359
|
"type": "string"
|
|
25360
|
+
},
|
|
25361
|
+
"planNotice": {
|
|
25362
|
+
"$ref": "#/components/schemas/PlanNotice"
|
|
24659
25363
|
}
|
|
24660
25364
|
}
|
|
24661
25365
|
}
|
|
@@ -30212,6 +30916,480 @@
|
|
|
30212
30916
|
}
|
|
30213
30917
|
}
|
|
30214
30918
|
}
|
|
30919
|
+
},
|
|
30920
|
+
"/v1/connect/cloudbeds/credentials": {
|
|
30921
|
+
"post": {
|
|
30922
|
+
"operationId": "submitCloudbedsCredentials",
|
|
30923
|
+
"summary": "Submit Cloudbeds credentials for a Connect session",
|
|
30924
|
+
"description": "Completes a credentials-pattern connection for Cloudbeds with a property (or organization) API key, created in Cloudbeds under Apps & Marketplace \u2192 API Credentials.\n\nIn Cloudbeds a listing is a room type and its rooms are units. A booking with several rooms becomes one reservation per room.\n\nThe key is validated and the properties it can see are read before anything is stored. On success Repull subscribes to the property's Cloudbeds webhooks (reservations, guests, room blocks) and queues the first sync.\n\nCloudbeds keys expire if unused for 30 days; the connection's regular sync keeps them alive.\n\nNo API key required when called with a `sessionId` \u2014 the session is the capability token.",
|
|
30925
|
+
"tags": [
|
|
30926
|
+
"Connect"
|
|
30927
|
+
],
|
|
30928
|
+
"requestBody": {
|
|
30929
|
+
"required": true,
|
|
30930
|
+
"content": {
|
|
30931
|
+
"application/json": {
|
|
30932
|
+
"schema": {
|
|
30933
|
+
"type": "object",
|
|
30934
|
+
"properties": {
|
|
30935
|
+
"sessionId": {
|
|
30936
|
+
"type": "string",
|
|
30937
|
+
"description": "Connect session id from `POST /v1/connect/cloudbeds`. Omit when calling with your API key."
|
|
30938
|
+
},
|
|
30939
|
+
"credentials": {
|
|
30940
|
+
"type": "object",
|
|
30941
|
+
"properties": {
|
|
30942
|
+
"apiKey": {
|
|
30943
|
+
"type": "string",
|
|
30944
|
+
"description": "Cloudbeds API key."
|
|
30945
|
+
},
|
|
30946
|
+
"propertyIds": {
|
|
30947
|
+
"type": "array",
|
|
30948
|
+
"items": {
|
|
30949
|
+
"type": "string"
|
|
30950
|
+
},
|
|
30951
|
+
"description": "Organization keys only: limit the connection to these properties. Omit to use every property the key can see."
|
|
30952
|
+
}
|
|
30953
|
+
},
|
|
30954
|
+
"required": [
|
|
30955
|
+
"apiKey"
|
|
30956
|
+
],
|
|
30957
|
+
"description": "A Cloudbeds API key (starts with `cbat_`)."
|
|
30958
|
+
}
|
|
30959
|
+
},
|
|
30960
|
+
"required": [
|
|
30961
|
+
"credentials"
|
|
30962
|
+
]
|
|
30963
|
+
}
|
|
30964
|
+
}
|
|
30965
|
+
}
|
|
30966
|
+
},
|
|
30967
|
+
"responses": {
|
|
30968
|
+
"200": {
|
|
30969
|
+
"description": "Credentials accepted, the connection stored and its first sync queued",
|
|
30970
|
+
"content": {
|
|
30971
|
+
"application/json": {
|
|
30972
|
+
"schema": {
|
|
30973
|
+
"type": "object",
|
|
30974
|
+
"properties": {
|
|
30975
|
+
"provider": {
|
|
30976
|
+
"type": "string",
|
|
30977
|
+
"example": "cloudbeds"
|
|
30978
|
+
},
|
|
30979
|
+
"connected": {
|
|
30980
|
+
"type": "boolean"
|
|
30981
|
+
},
|
|
30982
|
+
"pmsConnectionId": {
|
|
30983
|
+
"type": "string",
|
|
30984
|
+
"description": "Id of the stored connection."
|
|
30985
|
+
},
|
|
30986
|
+
"created": {
|
|
30987
|
+
"type": "boolean",
|
|
30988
|
+
"description": "False when an existing connection was updated."
|
|
30989
|
+
},
|
|
30990
|
+
"sessionId": {
|
|
30991
|
+
"type": "string",
|
|
30992
|
+
"nullable": true
|
|
30993
|
+
},
|
|
30994
|
+
"accountInfo": {
|
|
30995
|
+
"type": "object",
|
|
30996
|
+
"properties": {
|
|
30997
|
+
"externalAccountId": {
|
|
30998
|
+
"type": "string",
|
|
30999
|
+
"description": "The Cloudbeds property id these credentials belong to."
|
|
31000
|
+
},
|
|
31001
|
+
"accountName": {
|
|
31002
|
+
"type": "string",
|
|
31003
|
+
"nullable": true
|
|
31004
|
+
},
|
|
31005
|
+
"propertyIds": {
|
|
31006
|
+
"type": "array",
|
|
31007
|
+
"items": {
|
|
31008
|
+
"type": "string"
|
|
31009
|
+
},
|
|
31010
|
+
"description": "Every property the credentials cover."
|
|
31011
|
+
}
|
|
31012
|
+
}
|
|
31013
|
+
},
|
|
31014
|
+
"webhooks": {
|
|
31015
|
+
"type": "object",
|
|
31016
|
+
"properties": {
|
|
31017
|
+
"registered": {
|
|
31018
|
+
"type": "integer",
|
|
31019
|
+
"description": "Webhook subscriptions created at the PMS (Cloudbeds). Mews webhooks are enabled once per integration by Mews, so this is 0 there."
|
|
31020
|
+
},
|
|
31021
|
+
"error": {
|
|
31022
|
+
"type": "string",
|
|
31023
|
+
"description": "Why subscribing failed, if it did. The connection still syncs by polling."
|
|
31024
|
+
}
|
|
31025
|
+
}
|
|
31026
|
+
}
|
|
31027
|
+
}
|
|
31028
|
+
}
|
|
31029
|
+
}
|
|
31030
|
+
}
|
|
31031
|
+
},
|
|
31032
|
+
"400": {
|
|
31033
|
+
"$ref": "#/components/responses/BadRequest"
|
|
31034
|
+
},
|
|
31035
|
+
"401": {
|
|
31036
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
31037
|
+
},
|
|
31038
|
+
"404": {
|
|
31039
|
+
"$ref": "#/components/responses/NotFound"
|
|
31040
|
+
},
|
|
31041
|
+
"422": {
|
|
31042
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
31043
|
+
}
|
|
31044
|
+
}
|
|
31045
|
+
}
|
|
31046
|
+
},
|
|
31047
|
+
"/v1/connect/mews/credentials": {
|
|
31048
|
+
"post": {
|
|
31049
|
+
"operationId": "submitMewsCredentials",
|
|
31050
|
+
"summary": "Submit Mews credentials for a Connect session",
|
|
31051
|
+
"description": "Completes a credentials-pattern connection for Mews. The property enables Repull in Mews and shares its Connector API access token.\n\nIn Mews a listing is a room type and its rooms are units: rates, restrictions and availability live on the room type, and each reservation names the room it was assigned.\n\nThe token is validated against Mews and the property it belongs to is read before anything is stored, so a bad token returns `invalid_credentials` rather than a dead connection. The first sync (listings, rooms, reservations) is queued on success.\n\nTo try it without a Mews customer, send the demo access token from Mews's documentation with `environment: \"demo\"`.\n\nNo API key required when called with a `sessionId` \u2014 the session is the capability token.",
|
|
31052
|
+
"tags": [
|
|
31053
|
+
"Connect"
|
|
31054
|
+
],
|
|
31055
|
+
"requestBody": {
|
|
31056
|
+
"required": true,
|
|
31057
|
+
"content": {
|
|
31058
|
+
"application/json": {
|
|
31059
|
+
"schema": {
|
|
31060
|
+
"type": "object",
|
|
31061
|
+
"properties": {
|
|
31062
|
+
"sessionId": {
|
|
31063
|
+
"type": "string",
|
|
31064
|
+
"description": "Connect session id from `POST /v1/connect/mews`. Omit when calling with your API key."
|
|
31065
|
+
},
|
|
31066
|
+
"credentials": {
|
|
31067
|
+
"type": "object",
|
|
31068
|
+
"properties": {
|
|
31069
|
+
"accessToken": {
|
|
31070
|
+
"type": "string",
|
|
31071
|
+
"description": "The property's Connector API access token."
|
|
31072
|
+
},
|
|
31073
|
+
"environment": {
|
|
31074
|
+
"type": "string",
|
|
31075
|
+
"enum": [
|
|
31076
|
+
"production",
|
|
31077
|
+
"demo"
|
|
31078
|
+
],
|
|
31079
|
+
"default": "production",
|
|
31080
|
+
"description": "`demo` targets Mews's public demo environment."
|
|
31081
|
+
}
|
|
31082
|
+
},
|
|
31083
|
+
"required": [
|
|
31084
|
+
"accessToken"
|
|
31085
|
+
],
|
|
31086
|
+
"description": "The property's Mews Connector API access token."
|
|
31087
|
+
}
|
|
31088
|
+
},
|
|
31089
|
+
"required": [
|
|
31090
|
+
"credentials"
|
|
31091
|
+
]
|
|
31092
|
+
}
|
|
31093
|
+
}
|
|
31094
|
+
}
|
|
31095
|
+
},
|
|
31096
|
+
"responses": {
|
|
31097
|
+
"200": {
|
|
31098
|
+
"description": "Credentials accepted, the connection stored and its first sync queued",
|
|
31099
|
+
"content": {
|
|
31100
|
+
"application/json": {
|
|
31101
|
+
"schema": {
|
|
31102
|
+
"type": "object",
|
|
31103
|
+
"properties": {
|
|
31104
|
+
"provider": {
|
|
31105
|
+
"type": "string",
|
|
31106
|
+
"example": "mews"
|
|
31107
|
+
},
|
|
31108
|
+
"connected": {
|
|
31109
|
+
"type": "boolean"
|
|
31110
|
+
},
|
|
31111
|
+
"pmsConnectionId": {
|
|
31112
|
+
"type": "string",
|
|
31113
|
+
"description": "Id of the stored connection."
|
|
31114
|
+
},
|
|
31115
|
+
"created": {
|
|
31116
|
+
"type": "boolean",
|
|
31117
|
+
"description": "False when an existing connection was updated."
|
|
31118
|
+
},
|
|
31119
|
+
"sessionId": {
|
|
31120
|
+
"type": "string",
|
|
31121
|
+
"nullable": true
|
|
31122
|
+
},
|
|
31123
|
+
"accountInfo": {
|
|
31124
|
+
"type": "object",
|
|
31125
|
+
"properties": {
|
|
31126
|
+
"externalAccountId": {
|
|
31127
|
+
"type": "string",
|
|
31128
|
+
"description": "The Mews property id these credentials belong to."
|
|
31129
|
+
},
|
|
31130
|
+
"accountName": {
|
|
31131
|
+
"type": "string",
|
|
31132
|
+
"nullable": true
|
|
31133
|
+
},
|
|
31134
|
+
"propertyIds": {
|
|
31135
|
+
"type": "array",
|
|
31136
|
+
"items": {
|
|
31137
|
+
"type": "string"
|
|
31138
|
+
},
|
|
31139
|
+
"description": "Every property the credentials cover."
|
|
31140
|
+
}
|
|
31141
|
+
}
|
|
31142
|
+
},
|
|
31143
|
+
"webhooks": {
|
|
31144
|
+
"type": "object",
|
|
31145
|
+
"properties": {
|
|
31146
|
+
"registered": {
|
|
31147
|
+
"type": "integer",
|
|
31148
|
+
"description": "Webhook subscriptions created at the PMS (Cloudbeds). Mews webhooks are enabled once per integration by Mews, so this is 0 there."
|
|
31149
|
+
},
|
|
31150
|
+
"error": {
|
|
31151
|
+
"type": "string",
|
|
31152
|
+
"description": "Why subscribing failed, if it did. The connection still syncs by polling."
|
|
31153
|
+
}
|
|
31154
|
+
}
|
|
31155
|
+
}
|
|
31156
|
+
}
|
|
31157
|
+
}
|
|
31158
|
+
}
|
|
31159
|
+
}
|
|
31160
|
+
},
|
|
31161
|
+
"400": {
|
|
31162
|
+
"$ref": "#/components/responses/BadRequest"
|
|
31163
|
+
},
|
|
31164
|
+
"401": {
|
|
31165
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
31166
|
+
},
|
|
31167
|
+
"404": {
|
|
31168
|
+
"$ref": "#/components/responses/NotFound"
|
|
31169
|
+
},
|
|
31170
|
+
"422": {
|
|
31171
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
31172
|
+
}
|
|
31173
|
+
}
|
|
31174
|
+
}
|
|
31175
|
+
},
|
|
31176
|
+
"/v1/listings/{id}/units": {
|
|
31177
|
+
"get": {
|
|
31178
|
+
"operationId": "listListingUnits",
|
|
31179
|
+
"summary": "List a listing's units (rooms)",
|
|
31180
|
+
"description": "The physical rooms under a listing. For a hotel-model PMS (Mews, Cloudbeds) a listing is a room type: prices, restrictions and availability are set on the room type, and each reservation is assigned one of these rooms (`reservation.unit.id`). A room can belong to more than one room type.\n\nAny other listing is a single home, which is its own unit, and returns an empty list.",
|
|
31181
|
+
"tags": [
|
|
31182
|
+
"Listings"
|
|
31183
|
+
],
|
|
31184
|
+
"parameters": [
|
|
31185
|
+
{
|
|
31186
|
+
"name": "id",
|
|
31187
|
+
"in": "path",
|
|
31188
|
+
"required": true,
|
|
31189
|
+
"schema": {
|
|
31190
|
+
"type": "integer"
|
|
31191
|
+
},
|
|
31192
|
+
"description": "Listing id."
|
|
31193
|
+
}
|
|
31194
|
+
],
|
|
31195
|
+
"responses": {
|
|
31196
|
+
"200": {
|
|
31197
|
+
"description": "The listing's units",
|
|
31198
|
+
"content": {
|
|
31199
|
+
"application/json": {
|
|
31200
|
+
"schema": {
|
|
31201
|
+
"type": "object",
|
|
31202
|
+
"properties": {
|
|
31203
|
+
"listingId": {
|
|
31204
|
+
"type": "integer"
|
|
31205
|
+
},
|
|
31206
|
+
"total": {
|
|
31207
|
+
"type": "integer"
|
|
31208
|
+
},
|
|
31209
|
+
"data": {
|
|
31210
|
+
"type": "array",
|
|
31211
|
+
"items": {
|
|
31212
|
+
"type": "object",
|
|
31213
|
+
"properties": {
|
|
31214
|
+
"id": {
|
|
31215
|
+
"type": "string",
|
|
31216
|
+
"description": "The PMS's id for the room; `reservation.unit.id` refers to it."
|
|
31217
|
+
},
|
|
31218
|
+
"name": {
|
|
31219
|
+
"type": "string",
|
|
31220
|
+
"example": "101"
|
|
31221
|
+
},
|
|
31222
|
+
"active": {
|
|
31223
|
+
"type": "boolean"
|
|
31224
|
+
},
|
|
31225
|
+
"parentId": {
|
|
31226
|
+
"type": "string",
|
|
31227
|
+
"nullable": true,
|
|
31228
|
+
"description": "A sub-space's parent room (a bed in a dorm), else null."
|
|
31229
|
+
},
|
|
31230
|
+
"housekeepingStatus": {
|
|
31231
|
+
"type": "string",
|
|
31232
|
+
"nullable": true,
|
|
31233
|
+
"description": "The PMS's housekeeping state, verbatim (e.g. `Dirty`, `Clean`, `Inspected`)."
|
|
31234
|
+
},
|
|
31235
|
+
"floor": {
|
|
31236
|
+
"type": "string",
|
|
31237
|
+
"nullable": true
|
|
31238
|
+
},
|
|
31239
|
+
"source": {
|
|
31240
|
+
"type": "string",
|
|
31241
|
+
"example": "mews"
|
|
31242
|
+
}
|
|
31243
|
+
}
|
|
31244
|
+
}
|
|
31245
|
+
}
|
|
31246
|
+
}
|
|
31247
|
+
}
|
|
31248
|
+
}
|
|
31249
|
+
}
|
|
31250
|
+
},
|
|
31251
|
+
"401": {
|
|
31252
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
31253
|
+
},
|
|
31254
|
+
"404": {
|
|
31255
|
+
"$ref": "#/components/responses/NotFound"
|
|
31256
|
+
},
|
|
31257
|
+
"422": {
|
|
31258
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
31259
|
+
}
|
|
31260
|
+
}
|
|
31261
|
+
}
|
|
31262
|
+
},
|
|
31263
|
+
"/v1/reservations/{id}/cancel": {
|
|
31264
|
+
"post": {
|
|
31265
|
+
"operationId": "cancel_reservation",
|
|
31266
|
+
"summary": "Cancel a reservation",
|
|
31267
|
+
"description": "Cancels a reservation where it lives.\n\n- **Mews or Cloudbeds** (hotel-model PMS): cancelled in the PMS, then read back, so Repull and the PMS agree. No cancellation fee is charged.\n- **Direct, website or owner bookings**: cancelled in Repull \u2014 the nights are released and `reservation.cancelled` fires.\n- **A channel booking** (Airbnb, Booking.com, VRBO) or a booking owned by another PMS: `409 reservation_owned_by_channel`. Cancel it there; the cancellation reaches Repull with the next sync.\n\nCancelling an already-cancelled reservation is not an error: the response carries `alreadyCancelled: true`.\n\nReturns `403 listing_inactive` when the listing is inactive.",
|
|
31268
|
+
"tags": [
|
|
31269
|
+
"Reservations"
|
|
31270
|
+
],
|
|
31271
|
+
"parameters": [
|
|
31272
|
+
{
|
|
31273
|
+
"name": "id",
|
|
31274
|
+
"in": "path",
|
|
31275
|
+
"required": true,
|
|
31276
|
+
"schema": {
|
|
31277
|
+
"type": "integer"
|
|
31278
|
+
},
|
|
31279
|
+
"description": "Reservation id."
|
|
31280
|
+
}
|
|
31281
|
+
],
|
|
31282
|
+
"requestBody": {
|
|
31283
|
+
"required": false,
|
|
31284
|
+
"content": {
|
|
31285
|
+
"application/json": {
|
|
31286
|
+
"schema": {
|
|
31287
|
+
"type": "object",
|
|
31288
|
+
"properties": {
|
|
31289
|
+
"reason": {
|
|
31290
|
+
"type": "string",
|
|
31291
|
+
"description": "Why it was cancelled; recorded on the reservation (and in the PMS's notes)."
|
|
31292
|
+
}
|
|
31293
|
+
}
|
|
31294
|
+
}
|
|
31295
|
+
}
|
|
31296
|
+
}
|
|
31297
|
+
},
|
|
31298
|
+
"responses": {
|
|
31299
|
+
"200": {
|
|
31300
|
+
"description": "Cancelled",
|
|
31301
|
+
"content": {
|
|
31302
|
+
"application/json": {
|
|
31303
|
+
"schema": {
|
|
31304
|
+
"type": "object",
|
|
31305
|
+
"properties": {
|
|
31306
|
+
"id": {
|
|
31307
|
+
"type": "string"
|
|
31308
|
+
},
|
|
31309
|
+
"confirmationCode": {
|
|
31310
|
+
"type": "string",
|
|
31311
|
+
"nullable": true
|
|
31312
|
+
},
|
|
31313
|
+
"listingId": {
|
|
31314
|
+
"type": "string",
|
|
31315
|
+
"nullable": true
|
|
31316
|
+
},
|
|
31317
|
+
"status": {
|
|
31318
|
+
"type": "string",
|
|
31319
|
+
"enum": [
|
|
31320
|
+
"cancelled"
|
|
31321
|
+
]
|
|
31322
|
+
},
|
|
31323
|
+
"checkIn": {
|
|
31324
|
+
"type": "string",
|
|
31325
|
+
"format": "date",
|
|
31326
|
+
"nullable": true
|
|
31327
|
+
},
|
|
31328
|
+
"checkOut": {
|
|
31329
|
+
"type": "string",
|
|
31330
|
+
"format": "date",
|
|
31331
|
+
"nullable": true
|
|
31332
|
+
},
|
|
31333
|
+
"updatedAt": {
|
|
31334
|
+
"type": "string",
|
|
31335
|
+
"nullable": true
|
|
31336
|
+
},
|
|
31337
|
+
"alreadyCancelled": {
|
|
31338
|
+
"type": "boolean",
|
|
31339
|
+
"description": "Present and true when the reservation was already cancelled."
|
|
31340
|
+
},
|
|
31341
|
+
"pms": {
|
|
31342
|
+
"type": "object",
|
|
31343
|
+
"description": "Present when the cancellation was made in a PMS.",
|
|
31344
|
+
"properties": {
|
|
31345
|
+
"provider": {
|
|
31346
|
+
"type": "string",
|
|
31347
|
+
"example": "mews"
|
|
31348
|
+
},
|
|
31349
|
+
"applied": {
|
|
31350
|
+
"type": "array",
|
|
31351
|
+
"items": {
|
|
31352
|
+
"type": "string"
|
|
31353
|
+
}
|
|
31354
|
+
},
|
|
31355
|
+
"errors": {
|
|
31356
|
+
"type": "array",
|
|
31357
|
+
"items": {
|
|
31358
|
+
"type": "object",
|
|
31359
|
+
"properties": {
|
|
31360
|
+
"section": {
|
|
31361
|
+
"type": "string"
|
|
31362
|
+
},
|
|
31363
|
+
"message": {
|
|
31364
|
+
"type": "string"
|
|
31365
|
+
},
|
|
31366
|
+
"code": {
|
|
31367
|
+
"type": "string"
|
|
31368
|
+
}
|
|
31369
|
+
}
|
|
31370
|
+
}
|
|
31371
|
+
}
|
|
31372
|
+
}
|
|
31373
|
+
}
|
|
31374
|
+
}
|
|
31375
|
+
}
|
|
31376
|
+
}
|
|
31377
|
+
}
|
|
31378
|
+
},
|
|
31379
|
+
"401": {
|
|
31380
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
31381
|
+
},
|
|
31382
|
+
"404": {
|
|
31383
|
+
"$ref": "#/components/responses/NotFound"
|
|
31384
|
+
},
|
|
31385
|
+
"409": {
|
|
31386
|
+
"description": "The reservation belongs to a channel or another PMS (`reservation_owned_by_channel`), or the PMS connection is gone (`no_connection`)."
|
|
31387
|
+
},
|
|
31388
|
+
"422": {
|
|
31389
|
+
"$ref": "#/components/responses/UnprocessableEntity"
|
|
31390
|
+
}
|
|
31391
|
+
}
|
|
31392
|
+
}
|
|
30215
31393
|
}
|
|
30216
31394
|
}
|
|
30217
31395
|
}
|