repull 0.2.20 → 0.2.22
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 +54 -15
- 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 +207 -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 +9 -9
- 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 +3 -3
- 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_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 +2 -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 +170 -0
- data/lib/repull/models/get_listing_markups200_response_airbnb_inner.rb +159 -0
- data/lib/repull/models/get_listing_markups200_response_booking_inner.rb +171 -0
- 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 +235 -0
- 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 +36 -3
- data/openapi/v1.json +1672 -270
- metadata +37 -4
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
|
@@ -810,6 +810,74 @@ module Repull
|
|
|
810
810
|
return data, status_code, headers
|
|
811
811
|
end
|
|
812
812
|
|
|
813
|
+
# Submit Cloudbeds credentials for a Connect session
|
|
814
|
+
# Completes a credentials-pattern connection for Cloudbeds with a property (or organization) API key, created in Cloudbeds under Apps & Marketplace → API Credentials. In Cloudbeds a listing is a room type and its rooms are units. A booking with several rooms becomes one reservation per room. The 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. Cloudbeds keys expire if unused for 30 days; the connection's regular sync keeps them alive. No API key required when called with a `sessionId` — the session is the capability token.
|
|
815
|
+
# @param submit_cloudbeds_credentials_request [SubmitCloudbedsCredentialsRequest]
|
|
816
|
+
# @param [Hash] opts the optional parameters
|
|
817
|
+
# @return [SubmitCloudbedsCredentials200Response]
|
|
818
|
+
def submit_cloudbeds_credentials(submit_cloudbeds_credentials_request, opts = {})
|
|
819
|
+
data, _status_code, _headers = submit_cloudbeds_credentials_with_http_info(submit_cloudbeds_credentials_request, opts)
|
|
820
|
+
data
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
# Submit Cloudbeds credentials for a Connect session
|
|
824
|
+
# Completes a credentials-pattern connection for Cloudbeds with a property (or organization) API key, created in Cloudbeds under Apps & Marketplace → API Credentials. In Cloudbeds a listing is a room type and its rooms are units. A booking with several rooms becomes one reservation per room. The 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. Cloudbeds keys expire if unused for 30 days; the connection's regular sync keeps them alive. No API key required when called with a `sessionId` — the session is the capability token.
|
|
825
|
+
# @param submit_cloudbeds_credentials_request [SubmitCloudbedsCredentialsRequest]
|
|
826
|
+
# @param [Hash] opts the optional parameters
|
|
827
|
+
# @return [Array<(SubmitCloudbedsCredentials200Response, Integer, Hash)>] SubmitCloudbedsCredentials200Response data, response status code and response headers
|
|
828
|
+
def submit_cloudbeds_credentials_with_http_info(submit_cloudbeds_credentials_request, opts = {})
|
|
829
|
+
if @api_client.config.debugging
|
|
830
|
+
@api_client.config.logger.debug 'Calling API: ConnectApi.submit_cloudbeds_credentials ...'
|
|
831
|
+
end
|
|
832
|
+
# verify the required parameter 'submit_cloudbeds_credentials_request' is set
|
|
833
|
+
if @api_client.config.client_side_validation && submit_cloudbeds_credentials_request.nil?
|
|
834
|
+
fail ArgumentError, "Missing the required parameter 'submit_cloudbeds_credentials_request' when calling ConnectApi.submit_cloudbeds_credentials"
|
|
835
|
+
end
|
|
836
|
+
# resource path
|
|
837
|
+
local_var_path = '/v1/connect/cloudbeds/credentials'
|
|
838
|
+
|
|
839
|
+
# query parameters
|
|
840
|
+
query_params = opts[:query_params] || {}
|
|
841
|
+
|
|
842
|
+
# header parameters
|
|
843
|
+
header_params = opts[:header_params] || {}
|
|
844
|
+
# HTTP header 'Accept' (if needed)
|
|
845
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
846
|
+
# HTTP header 'Content-Type'
|
|
847
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
848
|
+
if !content_type.nil?
|
|
849
|
+
header_params['Content-Type'] = content_type
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
# form parameters
|
|
853
|
+
form_params = opts[:form_params] || {}
|
|
854
|
+
|
|
855
|
+
# http body (model)
|
|
856
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(submit_cloudbeds_credentials_request)
|
|
857
|
+
|
|
858
|
+
# return_type
|
|
859
|
+
return_type = opts[:debug_return_type] || 'SubmitCloudbedsCredentials200Response'
|
|
860
|
+
|
|
861
|
+
# auth_names
|
|
862
|
+
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
863
|
+
|
|
864
|
+
new_options = opts.merge(
|
|
865
|
+
:operation => :"ConnectApi.submit_cloudbeds_credentials",
|
|
866
|
+
:header_params => header_params,
|
|
867
|
+
:query_params => query_params,
|
|
868
|
+
:form_params => form_params,
|
|
869
|
+
:body => post_body,
|
|
870
|
+
:auth_names => auth_names,
|
|
871
|
+
:return_type => return_type
|
|
872
|
+
)
|
|
873
|
+
|
|
874
|
+
data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
|
|
875
|
+
if @api_client.config.debugging
|
|
876
|
+
@api_client.config.logger.debug "API called: ConnectApi#submit_cloudbeds_credentials\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
877
|
+
end
|
|
878
|
+
return data, status_code, headers
|
|
879
|
+
end
|
|
880
|
+
|
|
813
881
|
# Submit Guesty credentials for a Connect session
|
|
814
882
|
# Completes a credentials-pattern connection for Guesty. Client ID + secret from Guesty → Integrations → Open API. The credentials are validated against Guesty before anything is persisted, so an invalid pair returns `invalid_credentials` rather than creating a dead connection. On success the `pms_connections` row is written and the Connect session moves to its terminal state. No API key required when called with a `sessionId` — the session is the capability token.
|
|
815
883
|
# @param submit_guesty_credentials_request [SubmitGuestyCredentialsRequest]
|
|
@@ -1150,6 +1218,74 @@ module Repull
|
|
|
1150
1218
|
return data, status_code, headers
|
|
1151
1219
|
end
|
|
1152
1220
|
|
|
1221
|
+
# Submit Mews credentials for a Connect session
|
|
1222
|
+
# Completes a credentials-pattern connection for Mews. The property enables Repull in Mews and shares its Connector API access token. In 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. The 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. To try it without a Mews customer, send the demo access token from Mews's documentation with `environment: \"demo\"`. No API key required when called with a `sessionId` — the session is the capability token.
|
|
1223
|
+
# @param submit_mews_credentials_request [SubmitMewsCredentialsRequest]
|
|
1224
|
+
# @param [Hash] opts the optional parameters
|
|
1225
|
+
# @return [SubmitMewsCredentials200Response]
|
|
1226
|
+
def submit_mews_credentials(submit_mews_credentials_request, opts = {})
|
|
1227
|
+
data, _status_code, _headers = submit_mews_credentials_with_http_info(submit_mews_credentials_request, opts)
|
|
1228
|
+
data
|
|
1229
|
+
end
|
|
1230
|
+
|
|
1231
|
+
# Submit Mews credentials for a Connect session
|
|
1232
|
+
# Completes a credentials-pattern connection for Mews. The property enables Repull in Mews and shares its Connector API access token. In 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. The 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. To try it without a Mews customer, send the demo access token from Mews's documentation with `environment: \"demo\"`. No API key required when called with a `sessionId` — the session is the capability token.
|
|
1233
|
+
# @param submit_mews_credentials_request [SubmitMewsCredentialsRequest]
|
|
1234
|
+
# @param [Hash] opts the optional parameters
|
|
1235
|
+
# @return [Array<(SubmitMewsCredentials200Response, Integer, Hash)>] SubmitMewsCredentials200Response data, response status code and response headers
|
|
1236
|
+
def submit_mews_credentials_with_http_info(submit_mews_credentials_request, opts = {})
|
|
1237
|
+
if @api_client.config.debugging
|
|
1238
|
+
@api_client.config.logger.debug 'Calling API: ConnectApi.submit_mews_credentials ...'
|
|
1239
|
+
end
|
|
1240
|
+
# verify the required parameter 'submit_mews_credentials_request' is set
|
|
1241
|
+
if @api_client.config.client_side_validation && submit_mews_credentials_request.nil?
|
|
1242
|
+
fail ArgumentError, "Missing the required parameter 'submit_mews_credentials_request' when calling ConnectApi.submit_mews_credentials"
|
|
1243
|
+
end
|
|
1244
|
+
# resource path
|
|
1245
|
+
local_var_path = '/v1/connect/mews/credentials'
|
|
1246
|
+
|
|
1247
|
+
# query parameters
|
|
1248
|
+
query_params = opts[:query_params] || {}
|
|
1249
|
+
|
|
1250
|
+
# header parameters
|
|
1251
|
+
header_params = opts[:header_params] || {}
|
|
1252
|
+
# HTTP header 'Accept' (if needed)
|
|
1253
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
1254
|
+
# HTTP header 'Content-Type'
|
|
1255
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
1256
|
+
if !content_type.nil?
|
|
1257
|
+
header_params['Content-Type'] = content_type
|
|
1258
|
+
end
|
|
1259
|
+
|
|
1260
|
+
# form parameters
|
|
1261
|
+
form_params = opts[:form_params] || {}
|
|
1262
|
+
|
|
1263
|
+
# http body (model)
|
|
1264
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(submit_mews_credentials_request)
|
|
1265
|
+
|
|
1266
|
+
# return_type
|
|
1267
|
+
return_type = opts[:debug_return_type] || 'SubmitMewsCredentials200Response'
|
|
1268
|
+
|
|
1269
|
+
# auth_names
|
|
1270
|
+
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
1271
|
+
|
|
1272
|
+
new_options = opts.merge(
|
|
1273
|
+
:operation => :"ConnectApi.submit_mews_credentials",
|
|
1274
|
+
:header_params => header_params,
|
|
1275
|
+
:query_params => query_params,
|
|
1276
|
+
:form_params => form_params,
|
|
1277
|
+
:body => post_body,
|
|
1278
|
+
:auth_names => auth_names,
|
|
1279
|
+
:return_type => return_type
|
|
1280
|
+
)
|
|
1281
|
+
|
|
1282
|
+
data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
|
|
1283
|
+
if @api_client.config.debugging
|
|
1284
|
+
@api_client.config.logger.debug "API called: ConnectApi#submit_mews_credentials\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
1285
|
+
end
|
|
1286
|
+
return data, status_code, headers
|
|
1287
|
+
end
|
|
1288
|
+
|
|
1153
1289
|
# Submit OwnerRez credentials for a Connect session
|
|
1154
1290
|
# Completes a credentials-pattern connection for OwnerRez. Username + API token from OwnerRez → Settings → API. The credentials are validated against OwnerRez before anything is persisted, so an invalid pair returns `invalid_credentials` rather than creating a dead connection. On success the `pms_connections` row is written and the Connect session moves to its terminal state. No API key required when called with a `sessionId` — the session is the capability token.
|
|
1155
1291
|
# @param submit_ownerrez_credentials_request [SubmitOwnerrezCredentialsRequest]
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
|
@@ -334,7 +334,7 @@ module Repull
|
|
|
334
334
|
end
|
|
335
335
|
|
|
336
336
|
# List conversations
|
|
337
|
-
# Cursor-paginated list of message threads owned by the workspace.
|
|
337
|
+
# 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. `?offset=` is also accepted as a first-class alias for shallow paging (0..10000) — see the `offset` parameter below. Mutually exclusive with `cursor`. Filters: `platform` (`airbnb`|`booking`|`vrbo`|`website`|`email`), `status` (`open`|`archived` — `archived` is a stable no-op until the bit lands on `message_threads`). **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.
|
|
338
338
|
# @param [Hash] opts the optional parameters
|
|
339
339
|
# @option opts [String] :x_schema Apply a custom or built-in schema to transform the response. Built-in: `native` (default), `calry`, `calry-v1`. Custom: any schema name created via `POST /v1/schema/custom`. Unknown / inactive schema names fall back to `native`.
|
|
340
340
|
# @option opts [String] :cursor Opaque cursor returned in the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
@@ -349,7 +349,7 @@ module Repull
|
|
|
349
349
|
end
|
|
350
350
|
|
|
351
351
|
# List conversations
|
|
352
|
-
# Cursor-paginated list of message threads owned by the workspace.
|
|
352
|
+
# 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. `?offset=` is also accepted as a first-class alias for shallow paging (0..10000) — see the `offset` parameter below. Mutually exclusive with `cursor`. Filters: `platform` (`airbnb`|`booking`|`vrbo`|`website`|`email`), `status` (`open`|`archived` — `archived` is a stable no-op until the bit lands on `message_threads`). **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.
|
|
353
353
|
# @param [Hash] opts the optional parameters
|
|
354
354
|
# @option opts [String] :x_schema Apply a custom or built-in schema to transform the response. Built-in: `native` (default), `calry`, `calry-v1`. Custom: any schema name created via `POST /v1/schema/custom`. Unknown / inactive schema names fall back to `native`.
|
|
355
355
|
# @option opts [String] :cursor Opaque cursor returned in the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
|
@@ -95,7 +95,7 @@ module Repull
|
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
# Get guest profile
|
|
98
|
-
# Returns the full guest profile — base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates.
|
|
98
|
+
# Returns the full guest profile — base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates. **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.
|
|
99
99
|
# @param id [Integer]
|
|
100
100
|
# @param [Hash] opts the optional parameters
|
|
101
101
|
# @option opts [String] :x_schema Apply a custom or built-in schema to transform the response. Built-in: `native` (default), `calry`, `calry-v1`. Custom: any schema name created via `POST /v1/schema/custom`. Unknown / inactive schema names fall back to `native`.
|
|
@@ -106,7 +106,7 @@ module Repull
|
|
|
106
106
|
end
|
|
107
107
|
|
|
108
108
|
# Get guest profile
|
|
109
|
-
# Returns the full guest profile — base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates.
|
|
109
|
+
# Returns the full guest profile — base list-row fields plus contacts, flags, notes, risk metadata, and reservation aggregates. **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.
|
|
110
110
|
# @param id [Integer]
|
|
111
111
|
# @param [Hash] opts the optional parameters
|
|
112
112
|
# @option opts [String] :x_schema Apply a custom or built-in schema to transform the response. Built-in: `native` (default), `calry`, `calry-v1`. Custom: any schema name created via `POST /v1/schema/custom`. Unknown / inactive schema names fall back to `native`.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
data/lib/repull/api/kv_api.rb
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
#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. ## Designed for AI agents Every 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: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You 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}$`. The 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. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **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 — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When 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: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 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. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
Generator version: 7.22.0
|
|
10
10
|
|
|
@@ -20,7 +20,7 @@ module Repull
|
|
|
20
20
|
@api_client = api_client
|
|
21
21
|
end
|
|
22
22
|
# Create a Repull listing
|
|
23
|
-
# Create a new vacation-rental listing under the authenticated workspace. The listing is stored
|
|
23
|
+
# 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.
|
|
24
24
|
# @param listing_create_request [ListingCreateRequest]
|
|
25
25
|
# @param [Hash] opts the optional parameters
|
|
26
26
|
# @return [ListingCreateResponse]
|
|
@@ -30,7 +30,7 @@ module Repull
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
# Create a Repull listing
|
|
33
|
-
# Create a new vacation-rental listing under the authenticated workspace. The listing is stored
|
|
33
|
+
# 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.
|
|
34
34
|
# @param listing_create_request [ListingCreateRequest]
|
|
35
35
|
# @param [Hash] opts the optional parameters
|
|
36
36
|
# @return [Array<(ListingCreateResponse, Integer, Hash)>] ListingCreateResponse data, response status code and response headers
|
|
@@ -88,7 +88,7 @@ module Repull
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
# Mint a direct-to-storage photo upload URL
|
|
91
|
-
# Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` — the file bytes never pass through the Repull API
|
|
91
|
+
# Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` — 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. Flow: (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** — 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. Returns `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.
|
|
92
92
|
# @param id [Integer] Repull listing id
|
|
93
93
|
# @param listing_photo_upload_url_request [ListingPhotoUploadUrlRequest]
|
|
94
94
|
# @param [Hash] opts the optional parameters
|
|
@@ -99,7 +99,7 @@ module Repull
|
|
|
99
99
|
end
|
|
100
100
|
|
|
101
101
|
# Mint a direct-to-storage photo upload URL
|
|
102
|
-
# Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` — the file bytes never pass through the Repull API
|
|
102
|
+
# Mints a short-lived signed upload URL + token for a listing photo. **The client PUTs the raw file bytes directly to the returned `uploadUrl` — 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. Flow: (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** — 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. Returns `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.
|
|
103
103
|
# @param id [Integer] Repull listing id
|
|
104
104
|
# @param listing_photo_upload_url_request [ListingPhotoUploadUrlRequest]
|
|
105
105
|
# @param [Hash] opts the optional parameters
|
|
@@ -437,6 +437,69 @@ module Repull
|
|
|
437
437
|
return data, status_code, headers
|
|
438
438
|
end
|
|
439
439
|
|
|
440
|
+
# Get a listing's channel markups
|
|
441
|
+
# The markup each channel adds to this listing's price. A listing's price on a channel is its own nightly price plus the channel's markup: a $200 night with a 35% Airbnb markup is sent to Airbnb as $270. The calendar keeps the listing's own price (`GET /v1/availability/{propertyId}` returns it); the markup is added only when a price is sent to the channel. - **Airbnb** — one markup per listing. - **Booking.com** — one markup per **property**, shared by every listing priced through it (`listingIds` names them). Returns `404 not_found` for a listing that does not exist or is not in this workspace, and `403 listing_inactive` for an inactive one.
|
|
442
|
+
# @param id [String] Repull listing id.
|
|
443
|
+
# @param [Hash] opts the optional parameters
|
|
444
|
+
# @return [GetListingMarkups200Response]
|
|
445
|
+
def get_listing_markups(id, opts = {})
|
|
446
|
+
data, _status_code, _headers = get_listing_markups_with_http_info(id, opts)
|
|
447
|
+
data
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
# Get a listing's channel markups
|
|
451
|
+
# The markup each channel adds to this listing's price. A listing's price on a channel is its own nightly price plus the channel's markup: a $200 night with a 35% Airbnb markup is sent to Airbnb as $270. The calendar keeps the listing's own price (`GET /v1/availability/{propertyId}` returns it); the markup is added only when a price is sent to the channel. - **Airbnb** — one markup per listing. - **Booking.com** — one markup per **property**, shared by every listing priced through it (`listingIds` names them). Returns `404 not_found` for a listing that does not exist or is not in this workspace, and `403 listing_inactive` for an inactive one.
|
|
452
|
+
# @param id [String] Repull listing id.
|
|
453
|
+
# @param [Hash] opts the optional parameters
|
|
454
|
+
# @return [Array<(GetListingMarkups200Response, Integer, Hash)>] GetListingMarkups200Response data, response status code and response headers
|
|
455
|
+
def get_listing_markups_with_http_info(id, opts = {})
|
|
456
|
+
if @api_client.config.debugging
|
|
457
|
+
@api_client.config.logger.debug 'Calling API: ListingsApi.get_listing_markups ...'
|
|
458
|
+
end
|
|
459
|
+
# verify the required parameter 'id' is set
|
|
460
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
461
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling ListingsApi.get_listing_markups"
|
|
462
|
+
end
|
|
463
|
+
# resource path
|
|
464
|
+
local_var_path = '/v1/listings/{id}/markups'.sub('{id}', CGI.escape(id.to_s))
|
|
465
|
+
|
|
466
|
+
# query parameters
|
|
467
|
+
query_params = opts[:query_params] || {}
|
|
468
|
+
|
|
469
|
+
# header parameters
|
|
470
|
+
header_params = opts[:header_params] || {}
|
|
471
|
+
# HTTP header 'Accept' (if needed)
|
|
472
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
473
|
+
|
|
474
|
+
# form parameters
|
|
475
|
+
form_params = opts[:form_params] || {}
|
|
476
|
+
|
|
477
|
+
# http body (model)
|
|
478
|
+
post_body = opts[:debug_body]
|
|
479
|
+
|
|
480
|
+
# return_type
|
|
481
|
+
return_type = opts[:debug_return_type] || 'GetListingMarkups200Response'
|
|
482
|
+
|
|
483
|
+
# auth_names
|
|
484
|
+
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
485
|
+
|
|
486
|
+
new_options = opts.merge(
|
|
487
|
+
:operation => :"ListingsApi.get_listing_markups",
|
|
488
|
+
:header_params => header_params,
|
|
489
|
+
:query_params => query_params,
|
|
490
|
+
:form_params => form_params,
|
|
491
|
+
:body => post_body,
|
|
492
|
+
:auth_names => auth_names,
|
|
493
|
+
:return_type => return_type
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
|
|
497
|
+
if @api_client.config.debugging
|
|
498
|
+
@api_client.config.logger.debug "API called: ListingsApi#get_listing_markups\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
499
|
+
end
|
|
500
|
+
return data, status_code, headers
|
|
501
|
+
end
|
|
502
|
+
|
|
440
503
|
# Per-channel publish status
|
|
441
504
|
# Returns connection state and sync activity per channel. `channels` is sync activity (empty until first push). `connections` is connection state (populated as soon as a channel is linked). Recommended polling cadence: at most once per 30s per listing — for bulk views, prefer `GET /v1/listings` and filter client-side. **When a push fails, this endpoint says why.** `channels[].pushError` carries the channel's own reason for the last failed push, verbatim — `\"Links and contact info can't be shared\"`, `\"Check-in start time must be before end time\"`, `\"property_type_group must be one of […]\"`. It is free text written by the channel, so render it next to the retry button rather than parsing it. `null` when the last push succeeded or none has run; pair it with `pushStatus` to tell those two apart. **It also says what you will not be allowed to change.** The `airbnb` entry in `connections` carries `lockedFields` — attributes Airbnb has locked on this listing. Airbnb does not refuse a write to one: it answers 200, reports the field as locked, and applies nothing, so a locked write is indistinguishable from a successful one unless you looked first. Read it before you let someone edit. Airbnb-only; no other channel has the concept, and no other entry carries the field. Returns `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.
|
|
442
505
|
# @param id [Integer]
|
|
@@ -563,6 +626,69 @@ module Repull
|
|
|
563
626
|
return data, status_code, headers
|
|
564
627
|
end
|
|
565
628
|
|
|
629
|
+
# List a listing's units (rooms)
|
|
630
|
+
# 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. Any other listing is a single home, which is its own unit, and returns an empty list.
|
|
631
|
+
# @param id [Integer] Listing id.
|
|
632
|
+
# @param [Hash] opts the optional parameters
|
|
633
|
+
# @return [ListListingUnits200Response]
|
|
634
|
+
def list_listing_units(id, opts = {})
|
|
635
|
+
data, _status_code, _headers = list_listing_units_with_http_info(id, opts)
|
|
636
|
+
data
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
# List a listing's units (rooms)
|
|
640
|
+
# 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. Any other listing is a single home, which is its own unit, and returns an empty list.
|
|
641
|
+
# @param id [Integer] Listing id.
|
|
642
|
+
# @param [Hash] opts the optional parameters
|
|
643
|
+
# @return [Array<(ListListingUnits200Response, Integer, Hash)>] ListListingUnits200Response data, response status code and response headers
|
|
644
|
+
def list_listing_units_with_http_info(id, opts = {})
|
|
645
|
+
if @api_client.config.debugging
|
|
646
|
+
@api_client.config.logger.debug 'Calling API: ListingsApi.list_listing_units ...'
|
|
647
|
+
end
|
|
648
|
+
# verify the required parameter 'id' is set
|
|
649
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
650
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling ListingsApi.list_listing_units"
|
|
651
|
+
end
|
|
652
|
+
# resource path
|
|
653
|
+
local_var_path = '/v1/listings/{id}/units'.sub('{id}', CGI.escape(id.to_s))
|
|
654
|
+
|
|
655
|
+
# query parameters
|
|
656
|
+
query_params = opts[:query_params] || {}
|
|
657
|
+
|
|
658
|
+
# header parameters
|
|
659
|
+
header_params = opts[:header_params] || {}
|
|
660
|
+
# HTTP header 'Accept' (if needed)
|
|
661
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
662
|
+
|
|
663
|
+
# form parameters
|
|
664
|
+
form_params = opts[:form_params] || {}
|
|
665
|
+
|
|
666
|
+
# http body (model)
|
|
667
|
+
post_body = opts[:debug_body]
|
|
668
|
+
|
|
669
|
+
# return_type
|
|
670
|
+
return_type = opts[:debug_return_type] || 'ListListingUnits200Response'
|
|
671
|
+
|
|
672
|
+
# auth_names
|
|
673
|
+
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
674
|
+
|
|
675
|
+
new_options = opts.merge(
|
|
676
|
+
:operation => :"ListingsApi.list_listing_units",
|
|
677
|
+
:header_params => header_params,
|
|
678
|
+
:query_params => query_params,
|
|
679
|
+
:form_params => form_params,
|
|
680
|
+
:body => post_body,
|
|
681
|
+
:auth_names => auth_names,
|
|
682
|
+
:return_type => return_type
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
|
|
686
|
+
if @api_client.config.debugging
|
|
687
|
+
@api_client.config.logger.debug "API called: ListingsApi#list_listing_units\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
688
|
+
end
|
|
689
|
+
return data, status_code, headers
|
|
690
|
+
end
|
|
691
|
+
|
|
566
692
|
# List listings
|
|
567
693
|
# Cursor-paginated list of listings owned by the authenticated workspace. Use `pagination.nextCursor` from one response as the `cursor` query param of the next request to walk the full set. `?offset=` is also accepted as a first-class alias for shallow paging (0..10000) — see the `offset` parameter below. Mutually exclusive with `cursor`. Filters: `q` (substring on name/street/city), `status`, `channel`. **Optional expansions:** Pass `?include=content` to enrich each row with the rich content slab (summary, description, space, house rules, etc. — sourced from `listings_descriptions` for the `en` locale). Pass `?include=details` for the structural slab (bedrooms, bathrooms, person capacity, check-in window, wifi, house manual, etc.). Both default to `null` per row when the underlying `listings_descriptions` / `listings_details` row is missing — distinct from the field being absent (which signals the expansion was not requested). Pass `?include=thumbnail` to guarantee `thumbnailUrl` on every returned row — including the reduced inactive ones. Combine comma-separated, e.g. `?include=content,thumbnail`. The default response stays lean; consumers must opt in. **Inactive listings:** by default only active listings are returned. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated, so when `status` asks for inactive ones they carry only `id`, `name`, `status` and `channels` — enough to choose what to activate with `PATCH /v1/listings/{id}`. The `content` and `details` expansions are not applied to them. `?include=thumbnail` is the one exception: it adds `thumbnailUrl` to an inactive row so a single request can render an active/inactive selection screen with pictures, instead of one follow-up call per listing (which an inactive listing would answer with `403 listing_inactive` anyway).
|
|
568
694
|
# @param [Hash] opts the optional parameters
|
|
@@ -742,7 +868,7 @@ module Repull
|
|
|
742
868
|
end
|
|
743
869
|
|
|
744
870
|
# Publish a listing to Booking.com
|
|
745
|
-
# Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room — claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`. **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=` — 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. The property that actually received the content comes back as `result.hotelId`. **A publish is not one call to Booking.com.** It is several independent Content API calls — details, description, amenities, rooms, photos, pricing — 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 — re-publishing an unchanged section is harmless. A 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. Returns `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.
|
|
871
|
+
# Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room — claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`. **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=` — 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. The property that actually received the content comes back as `result.hotelId`. **A publish is not one call to Booking.com.** It is several independent Content API calls — details, description, amenities, rooms, photos, pricing — 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 — re-publishing an unchanged section is harmless. A 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. Returns `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. A 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`.
|
|
746
872
|
# @param id [Integer] Repull listing id — NOT a Booking.com hotel id.
|
|
747
873
|
# @param [Hash] opts the optional parameters
|
|
748
874
|
# @option opts [String] :hotel_id Booking.com property to publish into, for a listing mapped to more than one. The query-string spelling of the body's `hotelId`, accepted so this route reads the same as every other Booking listing-addressed route. The body wins when both are sent.
|
|
@@ -754,7 +880,7 @@ module Repull
|
|
|
754
880
|
end
|
|
755
881
|
|
|
756
882
|
# Publish a listing to Booking.com
|
|
757
|
-
# Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room — claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`. **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=` — 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. The property that actually received the content comes back as `result.hotelId`. **A publish is not one call to Booking.com.** It is several independent Content API calls — details, description, amenities, rooms, photos, pricing — 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 — re-publishing an unchanged section is harmless. A 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. Returns `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.
|
|
883
|
+
# Push a Repull listing's content to Booking.com. The listing must already be mapped to a Booking.com property + room — claim the hotel through the Connect Booking flow, then map its rooms with `POST /v1/connect/booking/map-rooms`. **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=` — 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. The property that actually received the content comes back as `result.hotelId`. **A publish is not one call to Booking.com.** It is several independent Content API calls — details, description, amenities, rooms, photos, pricing — 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 — re-publishing an unchanged section is harmless. A 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. Returns `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. A 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`.
|
|
758
884
|
# @param id [Integer] Repull listing id — NOT a Booking.com hotel id.
|
|
759
885
|
# @param [Hash] opts the optional parameters
|
|
760
886
|
# @option opts [String] :hotel_id Booking.com property to publish into, for a listing mapped to more than one. The query-string spelling of the body's `hotelId`, accepted so this route reads the same as every other Booking listing-addressed route. The body wins when both are sent.
|
|
@@ -884,6 +1010,80 @@ module Repull
|
|
|
884
1010
|
return data, status_code, headers
|
|
885
1011
|
end
|
|
886
1012
|
|
|
1013
|
+
# Set a listing's markup on a channel
|
|
1014
|
+
# Set the markup one channel adds to this listing's price. When the value changes, the affected listings' prices are re-sent to that channel straight away (`pricesResent`); nothing else is sent. A listing's price on a channel is its own nightly price plus the channel's markup: a $200 night with a 35% Airbnb markup is sent to Airbnb as $270. The calendar keeps the listing's own price (`GET /v1/availability/{propertyId}` returns it); the markup is added only when a price is sent to the channel. - **Airbnb** — one markup per listing. - **Booking.com** — one markup per **property**, shared by every listing priced through it (`listingIds` names them). Returns `404 not_found` for a listing that does not exist or is not in this workspace, and `403 listing_inactive` for an inactive one. On Booking.com the markup belongs to the property, so setting it reprices every listing on that property (`affectedListingIds`). A listing on more than one property must name one with `hotelId`; without it the request is refused with `409 ambiguous_booking_mapping` listing the candidates, rather than repricing a property it guessed. `markupPercent` is a percentage — `15` for 15%. A value between 0 and 1 is refused as a probable fraction, with the number to send instead.
|
|
1015
|
+
# @param id [String] Repull listing id.
|
|
1016
|
+
# @param set_listing_markup_request [SetListingMarkupRequest]
|
|
1017
|
+
# @param [Hash] opts the optional parameters
|
|
1018
|
+
# @return [nil]
|
|
1019
|
+
def set_listing_markup(id, set_listing_markup_request, opts = {})
|
|
1020
|
+
set_listing_markup_with_http_info(id, set_listing_markup_request, opts)
|
|
1021
|
+
nil
|
|
1022
|
+
end
|
|
1023
|
+
|
|
1024
|
+
# Set a listing's markup on a channel
|
|
1025
|
+
# Set the markup one channel adds to this listing's price. When the value changes, the affected listings' prices are re-sent to that channel straight away (`pricesResent`); nothing else is sent. A listing's price on a channel is its own nightly price plus the channel's markup: a $200 night with a 35% Airbnb markup is sent to Airbnb as $270. The calendar keeps the listing's own price (`GET /v1/availability/{propertyId}` returns it); the markup is added only when a price is sent to the channel. - **Airbnb** — one markup per listing. - **Booking.com** — one markup per **property**, shared by every listing priced through it (`listingIds` names them). Returns `404 not_found` for a listing that does not exist or is not in this workspace, and `403 listing_inactive` for an inactive one. On Booking.com the markup belongs to the property, so setting it reprices every listing on that property (`affectedListingIds`). A listing on more than one property must name one with `hotelId`; without it the request is refused with `409 ambiguous_booking_mapping` listing the candidates, rather than repricing a property it guessed. `markupPercent` is a percentage — `15` for 15%. A value between 0 and 1 is refused as a probable fraction, with the number to send instead.
|
|
1026
|
+
# @param id [String] Repull listing id.
|
|
1027
|
+
# @param set_listing_markup_request [SetListingMarkupRequest]
|
|
1028
|
+
# @param [Hash] opts the optional parameters
|
|
1029
|
+
# @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
|
|
1030
|
+
def set_listing_markup_with_http_info(id, set_listing_markup_request, opts = {})
|
|
1031
|
+
if @api_client.config.debugging
|
|
1032
|
+
@api_client.config.logger.debug 'Calling API: ListingsApi.set_listing_markup ...'
|
|
1033
|
+
end
|
|
1034
|
+
# verify the required parameter 'id' is set
|
|
1035
|
+
if @api_client.config.client_side_validation && id.nil?
|
|
1036
|
+
fail ArgumentError, "Missing the required parameter 'id' when calling ListingsApi.set_listing_markup"
|
|
1037
|
+
end
|
|
1038
|
+
# verify the required parameter 'set_listing_markup_request' is set
|
|
1039
|
+
if @api_client.config.client_side_validation && set_listing_markup_request.nil?
|
|
1040
|
+
fail ArgumentError, "Missing the required parameter 'set_listing_markup_request' when calling ListingsApi.set_listing_markup"
|
|
1041
|
+
end
|
|
1042
|
+
# resource path
|
|
1043
|
+
local_var_path = '/v1/listings/{id}/markups'.sub('{id}', CGI.escape(id.to_s))
|
|
1044
|
+
|
|
1045
|
+
# query parameters
|
|
1046
|
+
query_params = opts[:query_params] || {}
|
|
1047
|
+
|
|
1048
|
+
# header parameters
|
|
1049
|
+
header_params = opts[:header_params] || {}
|
|
1050
|
+
# HTTP header 'Accept' (if needed)
|
|
1051
|
+
header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
|
|
1052
|
+
# HTTP header 'Content-Type'
|
|
1053
|
+
content_type = @api_client.select_header_content_type(['application/json'])
|
|
1054
|
+
if !content_type.nil?
|
|
1055
|
+
header_params['Content-Type'] = content_type
|
|
1056
|
+
end
|
|
1057
|
+
|
|
1058
|
+
# form parameters
|
|
1059
|
+
form_params = opts[:form_params] || {}
|
|
1060
|
+
|
|
1061
|
+
# http body (model)
|
|
1062
|
+
post_body = opts[:debug_body] || @api_client.object_to_http_body(set_listing_markup_request)
|
|
1063
|
+
|
|
1064
|
+
# return_type
|
|
1065
|
+
return_type = opts[:debug_return_type]
|
|
1066
|
+
|
|
1067
|
+
# auth_names
|
|
1068
|
+
auth_names = opts[:debug_auth_names] || ['bearerAuth']
|
|
1069
|
+
|
|
1070
|
+
new_options = opts.merge(
|
|
1071
|
+
:operation => :"ListingsApi.set_listing_markup",
|
|
1072
|
+
:header_params => header_params,
|
|
1073
|
+
:query_params => query_params,
|
|
1074
|
+
:form_params => form_params,
|
|
1075
|
+
:body => post_body,
|
|
1076
|
+
:auth_names => auth_names,
|
|
1077
|
+
:return_type => return_type
|
|
1078
|
+
)
|
|
1079
|
+
|
|
1080
|
+
data, status_code, headers = @api_client.call_api(:PUT, local_var_path, new_options)
|
|
1081
|
+
if @api_client.config.debugging
|
|
1082
|
+
@api_client.config.logger.debug "API called: ListingsApi#set_listing_markup\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
|
|
1083
|
+
end
|
|
1084
|
+
return data, status_code, headers
|
|
1085
|
+
end
|
|
1086
|
+
|
|
887
1087
|
# Activate or deactivate listings in bulk
|
|
888
1088
|
# Sets up to 500 listings active or inactive in one call. Send `{ \"listingIds\": [\"4118\", \"4119\"], \"active\": false }` to deactivate them, or `\"active\": true` to activate them. An inactive listing is not counted toward your plan's listing limit or billed. It is NOT deleted and the upstream channel (Airbnb / Booking.com / your PMS) is never touched — its data keeps syncing, so it is complete the moment you activate it again. Until then it cannot be read, changed, or receive webhooks. **All or nothing.** Nothing changes unless the whole request can be applied: - If any id is not one of your listings, the call returns `404` naming those ids. - If activating would take you over your plan's listing limit, the call returns `402 listings_limit_exceeded`. Only listings that are currently inactive count toward the new total, so re-sending ids that are already active never trips the limit. Deactivating is always allowed, including when your account is already over its limit — it is how you get back under it. **Idempotent.** Ids already in the requested state are returned in `unchanged`; ids this call changed are returned in `updated`. For a single listing, `PATCH /v1/listings/{id}` does the same.
|
|
889
1089
|
# @param listing_status_batch_request [ListingStatusBatchRequest]
|