repull 0.2.21 → 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 +70 -7
- data/lib/repull/api/markets_api.rb +1 -1
- data/lib/repull/api/migrate_api.rb +1 -1
- data/lib/repull/api/plumguide_api.rb +1 -1
- data/lib/repull/api/pricing_api.rb +1 -1
- data/lib/repull/api/properties_api.rb +1 -1
- data/lib/repull/api/quotes_api.rb +1 -1
- data/lib/repull/api/reservations_api.rb +71 -1
- data/lib/repull/api/reviews_api.rb +3 -3
- data/lib/repull/api/schema_api.rb +1 -1
- data/lib/repull/api/system_api.rb +1 -1
- data/lib/repull/api/vrbo_api.rb +1 -1
- data/lib/repull/api/webhooks_api.rb +1 -1
- data/lib/repull/api_client.rb +1 -1
- data/lib/repull/api_error.rb +1 -1
- data/lib/repull/api_model_base.rb +1 -1
- data/lib/repull/configuration.rb +1 -1
- data/lib/repull/models/accept_reservation_request200_response.rb +1 -1
- data/lib/repull/models/account_created_event.rb +1 -1
- data/lib/repull/models/account_created_payload.rb +1 -1
- data/lib/repull/models/account_disconnected_event.rb +1 -1
- data/lib/repull/models/account_disconnected_payload.rb +1 -1
- data/lib/repull/models/acknowledge_booking_reservations_request.rb +1 -1
- data/lib/repull/models/ai_operation.rb +1 -1
- data/lib/repull/models/ai_operation_completed_event.rb +1 -1
- data/lib/repull/models/ai_operation_completed_payload.rb +1 -1
- data/lib/repull/models/ai_operation_failed_event.rb +1 -1
- data/lib/repull/models/ai_operation_failed_payload.rb +1 -1
- data/lib/repull/models/ai_operation_failed_payload_error.rb +1 -1
- data/lib/repull/models/airbnb_account_freshness.rb +1 -1
- data/lib/repull/models/airbnb_alteration.rb +1 -1
- data/lib/repull/models/airbnb_alteration_create_request.rb +1 -1
- data/lib/repull/models/airbnb_amenity.rb +1 -1
- data/lib/repull/models/airbnb_availability_write_request.rb +1 -1
- data/lib/repull/models/airbnb_calendar_operation.rb +1 -1
- data/lib/repull/models/airbnb_connection.rb +2 -2
- data/lib/repull/models/airbnb_connection_accessibility_amenities_inner.rb +1 -1
- data/lib/repull/models/airbnb_connection_amenities_inner.rb +1 -1
- data/lib/repull/models/airbnb_connection_host.rb +1 -1
- data/lib/repull/models/airbnb_connection_response.rb +1 -1
- data/lib/repull/models/airbnb_connection_summary.rb +1 -1
- data/lib/repull/models/airbnb_content_write_response.rb +1 -1
- data/lib/repull/models/airbnb_data_freshness.rb +1 -1
- data/lib/repull/models/airbnb_description_write_request.rb +1 -1
- data/lib/repull/models/airbnb_description_write_request_description.rb +1 -1
- data/lib/repull/models/airbnb_listing.rb +4 -4
- data/lib/repull/models/airbnb_listing_action200_response.rb +1 -1
- data/lib/repull/models/airbnb_listing_action200_response_one_of.rb +1 -1
- data/lib/repull/models/airbnb_listing_action200_response_one_of1.rb +1 -1
- data/lib/repull/models/airbnb_listing_action_request.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_response.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request_check_in_option.rb +1 -1
- data/lib/repull/models/airbnb_listing_details_write_request_quiet_hours_inner.rb +1 -1
- data/lib/repull/models/airbnb_listing_lifecycle_response.rb +2 -2
- data/lib/repull/models/airbnb_listing_list_response.rb +1 -1
- data/lib/repull/models/airbnb_permits_response.rb +1 -1
- data/lib/repull/models/airbnb_permits_response_cached_inner.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request_permits_inner.rb +1 -1
- data/lib/repull/models/airbnb_permits_write_request_permits_inner_answers_value.rb +1 -1
- data/lib/repull/models/airbnb_photo_position.rb +1 -1
- data/lib/repull/models/airbnb_pricing_write_request.rb +1 -1
- data/lib/repull/models/airbnb_pricing_write_request_records_inner.rb +1 -1
- data/lib/repull/models/airbnb_publish_result.rb +1 -1
- data/lib/repull/models/airbnb_reservation.rb +1 -1
- data/lib/repull/models/airbnb_reservation_action200_response.rb +1 -1
- data/lib/repull/models/airbnb_reservation_action_request.rb +1 -1
- data/lib/repull/models/airbnb_reservation_list_response.rb +1 -1
- data/lib/repull/models/airbnb_review.rb +1 -1
- data/lib/repull/models/airbnb_review_list_response.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosure.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosures_response.rb +1 -1
- data/lib/repull/models/airbnb_safety_disclosures_write_request.rb +1 -1
- data/lib/repull/models/airbnb_thread.rb +1 -1
- data/lib/repull/models/airbnb_thread_list_response.rb +1 -1
- data/lib/repull/models/airbnb_transaction.rb +216 -217
- data/lib/repull/models/airbnb_transaction_fees.rb +164 -0
- data/lib/repull/models/airbnb_transaction_payout.rb +47 -6
- data/lib/repull/models/alteration_change.rb +1 -1
- data/lib/repull/models/alteration_webhook_object.rb +1 -1
- data/lib/repull/models/availability_batch_write_request.rb +1 -1
- data/lib/repull/models/availability_write_request.rb +1 -1
- data/lib/repull/models/availability_write_result.rb +1 -1
- data/lib/repull/models/availability_write_result_synced.rb +1 -1
- data/lib/repull/models/availability_write_settings.rb +1 -1
- data/lib/repull/models/booking_availability_state_response.rb +1 -1
- data/lib/repull/models/booking_availability_update.rb +1 -1
- data/lib/repull/models/booking_availability_update_date_range.rb +1 -1
- data/lib/repull/models/booking_availability_update_request.rb +1 -1
- data/lib/repull/models/booking_availability_update_request_property_id.rb +1 -1
- data/lib/repull/models/booking_availability_update_request_updates_inner.rb +1 -1
- data/lib/repull/models/booking_connect_listing_option.rb +1 -1
- data/lib/repull/models/booking_connect_room.rb +1 -1
- data/lib/repull/models/booking_connect_rooms_response.rb +1 -1
- data/lib/repull/models/booking_conversation.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_date_range.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_restrictions.rb +1 -1
- data/lib/repull/models/booking_pricing_response.rb +1 -1
- data/lib/repull/models/booking_pricing_update_request.rb +1 -1
- data/lib/repull/models/booking_pricing_update_response.rb +1 -1
- data/lib/repull/models/booking_property.rb +1 -1
- data/lib/repull/models/booking_property_action_request.rb +1 -1
- data/lib/repull/models/booking_property_action_response.rb +1 -1
- data/lib/repull/models/booking_property_listings_inner.rb +1 -1
- data/lib/repull/models/booking_publish_result.rb +1 -1
- data/lib/repull/models/booking_publish_section_error.rb +1 -1
- data/lib/repull/models/booking_rate_write_occupancy.rb +1 -1
- data/lib/repull/models/booking_rate_write_price_half.rb +1 -1
- data/lib/repull/models/booking_rate_write_restriction_half.rb +1 -1
- data/lib/repull/models/booking_rate_write_verification.rb +1 -1
- data/lib/repull/models/booking_rate_write_verification_row.rb +1 -1
- data/lib/repull/models/booking_reservation.rb +1 -1
- data/lib/repull/models/booking_reservation_room.rb +1 -1
- data/lib/repull/models/booking_restriction_request_row.rb +1 -1
- data/lib/repull/models/booking_restriction_verification.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row_booking_value.rb +1 -1
- data/lib/repull/models/booking_restriction_verification_row_expected.rb +1 -1
- data/lib/repull/models/booking_room_mapping.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response_rooms_inner.rb +1 -1
- data/lib/repull/models/booking_rooms_rates_response_rooms_inner_rates_inner.rb +1 -1
- data/lib/repull/models/booking_setup_request.rb +1 -1
- data/lib/repull/models/booking_setup_request_legal_entity.rb +1 -1
- data/lib/repull/models/booking_upstream_failure.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_request.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_response.rb +1 -1
- data/lib/repull/models/bulk_pricing_failure.rb +1 -1
- data/lib/repull/models/bulk_pricing_item.rb +1 -1
- data/lib/repull/models/bulk_pricing_request.rb +1 -1
- data/lib/repull/models/bulk_pricing_response.rb +1 -1
- data/lib/repull/models/calendar_day.rb +1 -1
- data/lib/repull/models/calendar_response.rb +1 -1
- data/lib/repull/models/calendar_updated_event.rb +1 -1
- data/lib/repull/models/calendar_updated_payload.rb +1 -1
- data/lib/repull/models/calendar_updated_payload_range.rb +1 -1
- data/lib/repull/models/cancel_reservation200_response.rb +259 -0
- data/lib/repull/models/{airbnb_transaction_guest_breakdown.rb → cancel_reservation200_response_pms.rb} +28 -29
- data/lib/repull/models/cancel_reservation200_response_pms_errors_inner.rb +165 -0
- data/lib/repull/models/cancel_reservation_request.rb +148 -0
- data/lib/repull/models/channel_market_state_item.rb +2 -2
- data/lib/repull/models/check_migration_cutover200_response.rb +1 -1
- data/lib/repull/models/check_migration_cutover_request.rb +1 -1
- data/lib/repull/models/check_migration_cutover_request_reservations_inner.rb +1 -1
- data/lib/repull/models/clear_kv200_response.rb +1 -1
- data/lib/repull/models/connect_host.rb +1 -1
- data/lib/repull/models/connect_provider.rb +1 -1
- data/lib/repull/models/connect_provider_list_response.rb +1 -1
- data/lib/repull/models/connect_session.rb +1 -1
- data/lib/repull/models/connect_status.rb +1 -1
- data/lib/repull/models/connect_status_accounts_inner.rb +1 -1
- data/lib/repull/models/connection.rb +1 -1
- data/lib/repull/models/connection_list_response.rb +11 -2
- data/lib/repull/models/conversation.rb +1 -1
- data/lib/repull/models/conversation_detail.rb +1 -1
- data/lib/repull/models/conversation_guest.rb +1 -1
- data/lib/repull/models/conversation_guest_contact.rb +1 -1
- data/lib/repull/models/conversation_host.rb +1 -1
- data/lib/repull/models/conversation_list_response.rb +1 -1
- data/lib/repull/models/conversation_message_attachment.rb +1 -1
- data/lib/repull/models/create_airbnb_listing_room_request.rb +1 -1
- data/lib/repull/models/create_airbnb_offer_request.rb +1 -1
- data/lib/repull/models/create_airbnb_offer_request_guest_details.rb +1 -1
- data/lib/repull/models/create_billing_checkout_request.rb +1 -1
- data/lib/repull/models/create_booking_webhook_request.rb +1 -1
- data/lib/repull/models/create_connect_session_request.rb +1 -1
- data/lib/repull/models/create_connect_session_request_copy.rb +1 -1
- data/lib/repull/models/create_connect_session_request_workspace.rb +1 -1
- data/lib/repull/models/create_connection_request.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer201_response_guests.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request.rb +1 -1
- data/lib/repull/models/create_conversation_special_offer_request_guests.rb +1 -1
- data/lib/repull/models/create_webhook_request.rb +1 -1
- data/lib/repull/models/custom_schema.rb +1 -1
- data/lib/repull/models/custom_schema_create.rb +1 -1
- data/lib/repull/models/custom_schema_create_response.rb +1 -1
- data/lib/repull/models/custom_schema_delete_response.rb +1 -1
- data/lib/repull/models/custom_schema_list_response.rb +1 -1
- data/lib/repull/models/custom_schema_summary.rb +1 -1
- data/lib/repull/models/custom_schema_update.rb +1 -1
- data/lib/repull/models/decline_reservation_request_request.rb +1 -1
- data/lib/repull/models/delete_airbnb_listing_photo200_response.rb +1 -1
- data/lib/repull/models/delete_airbnb_listing_room200_response.rb +1 -1
- data/lib/repull/models/delete_connection200_response.rb +1 -1
- data/lib/repull/models/delete_kv200_response.rb +1 -1
- data/lib/repull/models/delete_migration200_response.rb +1 -1
- data/lib/repull/models/delete_migration200_response_data.rb +1 -1
- data/lib/repull/models/error.rb +1 -1
- data/lib/repull/models/error_error.rb +1 -1
- data/lib/repull/models/error_error_support.rb +1 -1
- data/lib/repull/models/get_airbnb_alteration200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_advance_notice.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_booking_window.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation_non_refundable.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in_start.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_out.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_instant_book.rb +1 -1
- data/lib/repull/models/get_airbnb_booking_settings200_response_data_preparation_time.rb +1 -1
- data/lib/repull/models/get_airbnb_checkin_guide200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_details200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_quality200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_listing_settings200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_offer200_response.rb +1 -1
- data/lib/repull/models/get_airbnb_thread200_response.rb +1 -1
- data/lib/repull/models/get_health200_response.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response_airbnb_inner.rb +1 -1
- data/lib/repull/models/get_listing_markups200_response_booking_inner.rb +1 -1
- data/lib/repull/models/get_migration200_response.rb +1 -1
- data/lib/repull/models/get_migration_channel_map200_response.rb +1 -1
- data/lib/repull/models/get_migration_report200_response.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response_data_inner.rb +1 -1
- data/lib/repull/models/get_usage_logs200_response_pagination.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response.rb +14 -5
- data/lib/repull/models/get_usage_summary200_response_breakdown_inner.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_limits.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_remaining.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_status_distribution.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_timeline_inner.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_totals.rb +1 -1
- data/lib/repull/models/get_usage_summary200_response_used.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_limits.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_remaining.rb +1 -1
- data/lib/repull/models/get_usage_tier200_response_used.rb +1 -1
- data/lib/repull/models/guest.rb +1 -1
- data/lib/repull/models/guest_contact.rb +1 -1
- data/lib/repull/models/guest_create_request.rb +1 -1
- data/lib/repull/models/guest_create_response.rb +1 -1
- data/lib/repull/models/guest_create_response_contacts_inner.rb +1 -1
- data/lib/repull/models/guest_flag.rb +2 -2
- data/lib/repull/models/guest_list_response.rb +1 -1
- data/lib/repull/models/guest_note.rb +1 -1
- data/lib/repull/models/guest_profile.rb +2 -2
- data/lib/repull/models/guest_reservations_summary.rb +1 -1
- data/lib/repull/models/inquiry_created_event.rb +1 -1
- data/lib/repull/models/inquiry_created_payload.rb +1 -1
- data/lib/repull/models/inquiry_updated_event.rb +1 -1
- data/lib/repull/models/inquiry_updated_payload.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object_expected_payout.rb +1 -1
- data/lib/repull/models/inquiry_webhook_object_guests.rb +1 -1
- data/lib/repull/models/list_airbnb_alterations200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_amenities200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_amenities200_response_data.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_permits200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_listing_safety_disclosures200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_airbnb_thread_messages200_response_pagination.rb +1 -1
- data/lib/repull/models/list_airbnb_transactions200_response.rb +28 -2
- data/lib/repull/models/list_booking_reservations200_response.rb +1 -1
- data/lib/repull/models/list_inquiries200_response.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner_expected_payout.rb +1 -1
- data/lib/repull/models/list_inquiries200_response_data_inner_guests.rb +1 -1
- data/lib/repull/models/list_kv200_response.rb +1 -1
- data/lib/repull/models/list_kv200_response_data_inner.rb +1 -1
- data/lib/repull/models/list_kv200_response_pagination.rb +1 -1
- data/lib/repull/models/list_listing_units200_response.rb +167 -0
- data/lib/repull/models/list_listing_units200_response_data_inner.rb +207 -0
- data/lib/repull/models/list_migrations200_response.rb +1 -1
- data/lib/repull/models/listing.rb +14 -2
- data/lib/repull/models/listing_active_request.rb +1 -1
- data/lib/repull/models/listing_active_response.rb +1 -1
- data/lib/repull/models/listing_address.rb +1 -1
- data/lib/repull/models/listing_address_readiness.rb +1 -1
- data/lib/repull/models/listing_amenity.rb +1 -1
- data/lib/repull/models/listing_channel.rb +1 -1
- data/lib/repull/models/listing_comp.rb +1 -1
- data/lib/repull/models/listing_comp_nightly.rb +1 -1
- data/lib/repull/models/listing_comp_ratings.rb +1 -1
- data/lib/repull/models/listing_comps_response.rb +1 -1
- data/lib/repull/models/listing_content.rb +1 -1
- data/lib/repull/models/listing_content_update_request.rb +1 -1
- data/lib/repull/models/listing_content_update_request_address.rb +1 -1
- data/lib/repull/models/listing_content_update_request_amenities.rb +1 -1
- data/lib/repull/models/listing_content_update_request_amenities_one_of_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_checkout_tasks_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_details.rb +1 -1
- data/lib/repull/models/listing_content_update_request_occupancy.rb +1 -1
- data/lib/repull/models/listing_content_update_request_photos_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_photos_inner_one_of.rb +1 -1
- data/lib/repull/models/listing_content_update_request_policies.rb +1 -1
- data/lib/repull/models/listing_content_update_request_pricing.rb +1 -1
- data/lib/repull/models/listing_content_update_request_rooms_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_request_rooms_inner_beds_inner.rb +1 -1
- data/lib/repull/models/listing_content_update_response.rb +1 -1
- data/lib/repull/models/listing_create_request.rb +1 -1
- data/lib/repull/models/listing_create_response.rb +1 -1
- data/lib/repull/models/listing_created_event.rb +1 -1
- data/lib/repull/models/listing_created_payload.rb +1 -1
- data/lib/repull/models/listing_created_payload_address.rb +1 -1
- data/lib/repull/models/listing_deleted_event.rb +1 -1
- data/lib/repull/models/listing_deleted_payload.rb +1 -1
- data/lib/repull/models/listing_details.rb +1 -1
- data/lib/repull/models/listing_generate_content_request.rb +1 -1
- data/lib/repull/models/listing_generate_content_response.rb +1 -1
- data/lib/repull/models/listing_list_response.rb +11 -2
- data/lib/repull/models/listing_market_state_request.rb +1 -1
- data/lib/repull/models/listing_market_state_response.rb +1 -1
- data/lib/repull/models/listing_photo.rb +1 -1
- data/lib/repull/models/listing_photo_delete_request.rb +1 -1
- data/lib/repull/models/listing_photo_delete_response.rb +1 -1
- data/lib/repull/models/listing_photo_upload_url_request.rb +19 -3
- data/lib/repull/models/listing_photo_upload_url_response.rb +16 -6
- data/lib/repull/models/listing_photos_response.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_request.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_response.rb +1 -1
- data/lib/repull/models/listing_pricing_history_entry.rb +1 -1
- data/lib/repull/models/listing_pricing_history_response.rb +1 -1
- data/lib/repull/models/listing_pricing_recommendation.rb +2 -2
- data/lib/repull/models/listing_pricing_response.rb +1 -1
- data/lib/repull/models/listing_pricing_response_comp_summary.rb +1 -1
- data/lib/repull/models/listing_pricing_response_date_range.rb +1 -1
- data/lib/repull/models/listing_pricing_response_listing.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy_input.rb +1 -1
- data/lib/repull/models/listing_publish_airbnb_request.rb +1 -1
- data/lib/repull/models/listing_publish_airbnb_response.rb +1 -1
- data/lib/repull/models/listing_publish_booking_request.rb +1 -1
- data/lib/repull/models/listing_publish_booking_response.rb +1 -1
- data/lib/repull/models/listing_publish_status_channel.rb +1 -1
- data/lib/repull/models/listing_publish_status_connection.rb +1 -1
- data/lib/repull/models/listing_publish_status_response.rb +1 -1
- data/lib/repull/models/listing_pull_airbnb_request.rb +1 -1
- data/lib/repull/models/listing_pull_response.rb +1 -1
- data/lib/repull/models/listing_quality_tier.rb +1 -1
- data/lib/repull/models/listing_reactivated_event.rb +1 -1
- data/lib/repull/models/listing_segment.rb +1 -1
- data/lib/repull/models/listing_segment_recommendation.rb +1 -1
- data/lib/repull/models/listing_segments_response.rb +1 -1
- data/lib/repull/models/listing_segments_response_scope.rb +1 -1
- data/lib/repull/models/listing_status_batch_request.rb +1 -1
- data/lib/repull/models/listing_status_batch_response.rb +1 -1
- data/lib/repull/models/listing_suspended_event.rb +1 -1
- data/lib/repull/models/listing_suspension_payload.rb +1 -1
- data/lib/repull/models/listing_units_inner.rb +204 -0
- data/lib/repull/models/listing_updated_event.rb +1 -1
- data/lib/repull/models/listing_updated_payload.rb +1 -1
- data/lib/repull/models/listing_webhook_object.rb +1 -1
- data/lib/repull/models/listing_webhook_object_address.rb +1 -1
- data/lib/repull/models/listing_webhook_object_channels_inner.rb +1 -1
- data/lib/repull/models/map_airbnb_listing_request.rb +1 -1
- data/lib/repull/models/map_airbnb_listing_response.rb +1 -1
- data/lib/repull/models/map_booking_room_request.rb +1 -1
- data/lib/repull/models/map_booking_room_response.rb +17 -6
- data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
- data/lib/repull/models/map_connect_booking_rooms_response.rb +29 -8
- data/lib/repull/models/market_browse_category.rb +1 -1
- data/lib/repull/models/market_browse_entry.rb +1 -1
- data/lib/repull/models/market_browse_featured.rb +1 -1
- data/lib/repull/models/market_browse_response.rb +1 -1
- data/lib/repull/models/market_calendar_day.rb +1 -1
- data/lib/repull/models/market_calendar_day_events_inner.rb +1 -1
- data/lib/repull/models/market_calendar_response.rb +1 -1
- data/lib/repull/models/market_detail_response.rb +1 -1
- data/lib/repull/models/market_detail_response_price_distribution_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_property_type_mix_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_supply_trend_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_top_comps.rb +1 -1
- data/lib/repull/models/market_event.rb +1 -1
- data/lib/repull/models/market_my_listing.rb +1 -1
- data/lib/repull/models/market_summary.rb +1 -1
- data/lib/repull/models/market_top_comp.rb +1 -1
- data/lib/repull/models/markets_overview_response.rb +1 -1
- data/lib/repull/models/markets_overview_response_browse.rb +1 -1
- data/lib/repull/models/markets_overview_response_subscriptions.rb +1 -1
- data/lib/repull/models/markets_overview_response_totals.rb +1 -1
- data/lib/repull/models/message.rb +3 -3
- data/lib/repull/models/message_list_response.rb +1 -1
- data/lib/repull/models/migration.rb +1 -1
- data/lib/repull/models/migration_channel_map.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner_airbnb.rb +1 -1
- data/lib/repull/models/migration_channel_map_listings_inner_booking.rb +1 -1
- data/lib/repull/models/migration_channel_map_sources_inner.rb +1 -1
- data/lib/repull/models/migration_completed_event.rb +1 -1
- data/lib/repull/models/migration_connections_inner.rb +1 -1
- data/lib/repull/models/migration_counts.rb +1 -1
- data/lib/repull/models/migration_cutover_check.rb +1 -1
- data/lib/repull/models/migration_cutover_check_mismatched_inner.rb +1 -1
- data/lib/repull/models/migration_failed_event.rb +1 -1
- data/lib/repull/models/migration_import_payload.rb +1 -1
- data/lib/repull/models/migration_import_payload_results_inner.rb +1 -1
- data/lib/repull/models/migration_import_run.rb +1 -1
- data/lib/repull/models/migration_import_run_results_inner.rb +1 -1
- data/lib/repull/models/migration_report.rb +1 -1
- data/lib/repull/models/migration_report_issues_inner.rb +1 -1
- data/lib/repull/models/migration_reservation_ref.rb +1 -1
- data/lib/repull/models/pagination.rb +1 -1
- data/lib/repull/models/payment_completed_event.rb +1 -1
- data/lib/repull/models/payment_completed_payload.rb +1 -1
- data/lib/repull/models/payment_refunded_event.rb +1 -1
- data/lib/repull/models/payment_refunded_payload.rb +1 -1
- data/lib/repull/models/payment_webhook_object.rb +1 -1
- data/lib/repull/models/payout_completed_event.rb +281 -0
- data/lib/repull/models/payout_completed_payload.rb +257 -0
- data/lib/repull/models/plan_notice.rb +283 -0
- data/lib/repull/models/plumguide_listing.rb +1 -1
- data/lib/repull/models/plumguide_listing_list_response.rb +1 -1
- data/lib/repull/models/preapprove_conversation201_response.rb +1 -1
- data/lib/repull/models/preapprove_conversation_request.rb +1 -1
- data/lib/repull/models/property.rb +1 -1
- data/lib/repull/models/property_availability.rb +1 -1
- data/lib/repull/models/property_availability_coverage.rb +1 -1
- data/lib/repull/models/property_availability_day.rb +41 -5
- data/lib/repull/models/property_list_response.rb +11 -2
- data/lib/repull/models/publish_section_error.rb +1 -1
- data/lib/repull/models/quote.rb +1 -1
- data/lib/repull/models/quote_pricing.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos200_response.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos200_response_data.rb +1 -1
- data/lib/repull/models/reorder_airbnb_listing_photos_request.rb +1 -1
- data/lib/repull/models/replay_webhook_delivery_request.rb +1 -1
- data/lib/repull/models/reply_booking_review200_response.rb +1 -1
- data/lib/repull/models/reply_booking_review_request.rb +1 -1
- data/lib/repull/models/reply_to_review201_response.rb +1 -1
- data/lib/repull/models/reply_to_review_request.rb +1 -1
- data/lib/repull/models/repull_ping_event.rb +1 -1
- data/lib/repull/models/repull_ping_payload.rb +1 -1
- data/lib/repull/models/reservation.rb +12 -2
- data/lib/repull/models/reservation_alteration_created_event.rb +1 -1
- data/lib/repull/models/reservation_alteration_created_payload.rb +1 -1
- data/lib/repull/models/reservation_alteration_responded_event.rb +1 -1
- data/lib/repull/models/reservation_alteration_responded_payload.rb +1 -1
- data/lib/repull/models/reservation_cancelled_event.rb +1 -1
- data/lib/repull/models/reservation_cancelled_payload.rb +1 -1
- data/lib/repull/models/reservation_create_request.rb +1 -1
- data/lib/repull/models/reservation_create_response.rb +27 -7
- data/lib/repull/models/reservation_create_response_pms.rb +180 -0
- data/lib/repull/models/reservation_create_response_unit.rb +158 -0
- data/lib/repull/models/reservation_created_event.rb +1 -1
- data/lib/repull/models/reservation_created_payload.rb +1 -1
- data/lib/repull/models/reservation_financials.rb +1 -1
- data/lib/repull/models/reservation_guest_financials.rb +1 -1
- data/lib/repull/models/reservation_guest_input.rb +1 -1
- data/lib/repull/models/reservation_host_financials.rb +1 -1
- data/lib/repull/models/reservation_list_response.rb +1 -1
- data/lib/repull/models/reservation_message_received_event.rb +1 -1
- data/lib/repull/models/reservation_message_received_payload.rb +1 -1
- data/lib/repull/models/reservation_message_received_payload_from.rb +1 -1
- data/lib/repull/models/reservation_message_sent_event.rb +281 -0
- data/lib/repull/models/reservation_message_sent_payload.rb +263 -0
- data/lib/repull/models/reservation_message_sent_payload_from.rb +158 -0
- data/lib/repull/models/{airbnb_transaction_host_breakdown.rb → reservation_message_updated_event.rb} +128 -93
- data/lib/repull/models/reservation_message_updated_payload.rb +244 -0
- data/lib/repull/models/reservation_message_updated_payload_from.rb +157 -0
- data/lib/repull/models/reservation_money_line.rb +1 -1
- data/lib/repull/models/reservation_occupancy.rb +1 -1
- data/lib/repull/models/reservation_primary_guest.rb +1 -1
- data/lib/repull/models/reservation_request_created_event.rb +1 -1
- data/lib/repull/models/reservation_request_created_payload.rb +1 -1
- data/lib/repull/models/reservation_request_updated_event.rb +1 -1
- data/lib/repull/models/reservation_request_updated_payload.rb +1 -1
- data/lib/repull/models/reservation_unit.rb +159 -0
- data/lib/repull/models/reservation_update_request.rb +1 -1
- data/lib/repull/models/reservation_update_response.rb +1 -1
- data/lib/repull/models/reservation_updated_event.rb +1 -1
- data/lib/repull/models/reservation_updated_payload.rb +1 -1
- data/lib/repull/models/reservation_webhook_object.rb +1 -1
- data/lib/repull/models/respond_airbnb_review_request.rb +1 -1
- data/lib/repull/models/review.rb +2 -2
- data/lib/repull/models/review_category.rb +1 -1
- data/lib/repull/models/review_created_event.rb +1 -1
- data/lib/repull/models/review_created_payload.rb +1 -1
- data/lib/repull/models/review_list_response.rb +1 -1
- data/lib/repull/models/review_responded_event.rb +1 -1
- data/lib/repull/models/review_responded_payload.rb +1 -1
- data/lib/repull/models/review_response.rb +1 -1
- data/lib/repull/models/review_webhook_object.rb +1 -1
- data/lib/repull/models/rotate_webhook_secret200_response.rb +1 -1
- data/lib/repull/models/run_migration_import202_response.rb +1 -1
- data/lib/repull/models/run_migration_import202_response_data.rb +1 -1
- data/lib/repull/models/run_migration_import202_response_data_queued_inner.rb +1 -1
- data/lib/repull/models/run_migration_import_request.rb +1 -1
- data/lib/repull/models/select_connect_provider_request.rb +1 -1
- data/lib/repull/models/select_provider_response.rb +1 -1
- data/lib/repull/models/send_airbnb_message201_response.rb +1 -1
- data/lib/repull/models/send_airbnb_message_request.rb +1 -1
- data/lib/repull/models/send_booking_message_request.rb +1 -1
- data/lib/repull/models/send_message_attachment.rb +1 -1
- data/lib/repull/models/send_message_part.rb +1 -1
- data/lib/repull/models/send_message_request.rb +1 -1
- data/lib/repull/models/send_message_response.rb +1 -1
- data/lib/repull/models/sent_attachment.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo200_response.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo200_response_data.rb +1 -1
- data/lib/repull/models/set_airbnb_listing_cover_photo_request.rb +1 -1
- data/lib/repull/models/set_kv_request.rb +1 -1
- data/lib/repull/models/set_listing_markup_request.rb +1 -1
- data/lib/repull/models/submit_beds24_credentials200_response.rb +1 -1
- data/lib/repull/models/submit_beds24_credentials_request.rb +1 -1
- data/lib/repull/models/submit_bookingsync_credentials_request.rb +1 -1
- data/lib/repull/models/submit_cloudbeds_credentials200_response.rb +204 -0
- data/lib/repull/models/submit_cloudbeds_credentials200_response_account_info.rb +170 -0
- data/lib/repull/models/submit_cloudbeds_credentials200_response_webhooks.rb +158 -0
- data/lib/repull/models/submit_cloudbeds_credentials_request.rb +174 -0
- data/lib/repull/models/submit_cloudbeds_credentials_request_credentials.rb +178 -0
- data/lib/repull/models/submit_guesty_credentials_request.rb +1 -1
- data/lib/repull/models/submit_hospitable_credentials_request.rb +1 -1
- data/lib/repull/models/submit_hostaway_credentials_request.rb +1 -1
- data/lib/repull/models/submit_igms_credentials_request.rb +1 -1
- data/lib/repull/models/submit_lodgify_credentials_request.rb +1 -1
- data/lib/repull/models/submit_mews_credentials200_response.rb +204 -0
- data/lib/repull/models/submit_mews_credentials200_response_account_info.rb +170 -0
- data/lib/repull/models/submit_mews_credentials_request.rb +174 -0
- data/lib/repull/models/submit_mews_credentials_request_credentials.rb +212 -0
- data/lib/repull/models/submit_ownerrez_credentials_request.rb +1 -1
- data/lib/repull/models/submit_smoobu_credentials_request.rb +1 -1
- data/lib/repull/models/submit_vrbo_credentials_request.rb +1 -1
- data/lib/repull/models/sync_airbnb_transactions200_response.rb +34 -6
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner.rb +254 -0
- data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner_error.rb +191 -0
- data/lib/repull/models/sync_airbnb_transactions_request.rb +4 -3
- data/lib/repull/models/test_webhook_request.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings200_response_data.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_advance_notice.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_booking_window.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_cancellation.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_cancellation_non_refundable.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_check_in.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_check_out.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_instant_book.rb +1 -1
- data/lib/repull/models/update_airbnb_booking_settings_request_preparation_time.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities200_response_data.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request_accessibility_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_amenities_request_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_permits200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_photo200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_photo_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_beds_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner_value.rb +1 -1
- data/lib/repull/models/update_airbnb_listing_safety_disclosures200_response.rb +1 -1
- data/lib/repull/models/update_airbnb_message_request.rb +1 -1
- data/lib/repull/models/update_booking_charges_request.rb +1 -1
- data/lib/repull/models/update_booking_content_request.rb +1 -1
- data/lib/repull/models/update_booking_content_request_content_data_inner.rb +1 -1
- data/lib/repull/models/update_booking_content_request_photos_inner.rb +1 -1
- data/lib/repull/models/update_listing_pricing_strategy200_response.rb +1 -1
- data/lib/repull/models/update_webhook_request.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner.rb +1 -1
- data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner_listing_id.rb +1 -1
- data/lib/repull/models/usage_quota_warning_event.rb +1 -1
- data/lib/repull/models/usage_quota_warning_payload.rb +1 -1
- data/lib/repull/models/usage_quota_warning_payload_top_operation.rb +1 -1
- data/lib/repull/models/vrbo_listing.rb +1 -1
- data/lib/repull/models/vrbo_reservation.rb +1 -1
- data/lib/repull/models/vrbo_reservation_list_response.rb +1 -1
- data/lib/repull/models/webhook_delivery.rb +1 -1
- data/lib/repull/models/webhook_delivery_detail.rb +1 -1
- data/lib/repull/models/webhook_delivery_list_response.rb +1 -1
- data/lib/repull/models/webhook_event.rb +7 -1
- data/lib/repull/models/webhook_event_account.rb +1 -1
- data/lib/repull/models/webhook_event_catalog.rb +1 -1
- data/lib/repull/models/webhook_event_catalog_domains_inner.rb +1 -1
- data/lib/repull/models/webhook_event_catalog_entry.rb +1 -1
- data/lib/repull/models/webhook_event_type.rb +5 -2
- data/lib/repull/models/webhook_list_response.rb +1 -1
- data/lib/repull/models/webhook_subscription.rb +1 -1
- data/lib/repull/models/withdraw_conversation_special_offer200_response.rb +1 -1
- data/lib/repull/version.rb +2 -2
- data/lib/repull.rb +32 -3
- data/openapi/v1.json +1357 -255
- metadata +33 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d82e6cd661dd24e5c301a3162fff5560c896fa50d1696e44654d6db67db81317
|
|
4
|
+
data.tar.gz: 1d972a3761ad092c24275b67aa19631e960a4a751096b014d738bbb426878ede
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 234137120348095122ef508b8e5f3d7131d9710a78eed691605725ebd8fb1e63126aa343cc1f403bd3c23fdc021f0309e2d3bba564e4d1f935120881057f38b4
|
|
7
|
+
data.tar.gz: c8d682f2905897c8ab0b91a18e637dd1e5c953217f924d0c5fe1822d68267c91b97162338191dc7f86bad343752e6b676c5afd4bf8c84486c5b7fcef16df6e46
|
|
@@ -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
|
|
|
@@ -90,7 +90,7 @@ module Repull
|
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
# Listing action (delete/push/publish/unlist/relist)
|
|
93
|
-
# Apply a state action to a listing by id. The path `id` is the canonical Repull listing id. **`delete` here never touches Airbnb. Read this before you call it.** | | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) | |---|---|---| | What it changes | The Repull record | The live Airbnb listing | | Calls Airbnb | **No. Never.** | Yes | | The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings | | Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged | | API access to the listing | `403 listing_inactive` until reactivated | Unchanged — you can still read and write it | | Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` | | Data kept | Yes, and it keeps syncing | Yes | Neither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** — the word `delete` on this route means \"deactivate the Repull record\" and nothing else.
|
|
93
|
+
# Apply a state action to a listing by id. The path `id` is the canonical Repull listing id. **`delete` here never touches Airbnb. Read this before you call it.** | | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) | |---|---|---| | What it changes | The Repull record | The live Airbnb listing | | Calls Airbnb | **No. Never.** | Yes | | The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings | | Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged | | API access to the listing | `403 listing_inactive` until reactivated | Unchanged — you can still read and write it | | Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` | | Data kept | Yes, and it keeps syncing | Yes | Neither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** — the word `delete` on this route means \"deactivate the Repull record\" and nothing else. `delete` is idempotent. To take a listing off the market on every channel at once — Airbnb and Booking.com together — use `POST /v1/listings/{id}/offline`. `unlist` calls Airbnb and **takes the live listing down**: it is deactivated with a valid deactivation reason and then READ BACK, so \"Airbnb accepted the call but the listing is still live\" is reported as a failure rather than a success. Requires `airbnbConnectionId` — a listing can be connected to more than one Airbnb listing, and taking down the wrong one is not undoable through this API. `relist` puts it back up (re-enables sync and makes the listing available again); it does not push content. `relist` goes through the channel-publish billing gate and `unlist` does not, so on a workspace whose subscription has lapsed a listing can be taken down and not put back until billing is sorted out. That refusal comes back as `402` with the action that fixes it — never as an Airbnb error, because retrying and reconnecting Airbnb do nothing for it. `push` / `publish` push the listing's content to Airbnb via the same host-side sync orchestrator as `POST /v1/listings/{id}/publish/airbnb` — pass `airbnbConnectionId` to update an already-mapped Airbnb listing, or `hostId` to create + publish a new one under that host. `force` re-pushes every field, ignoring dirty-field tracking. The result is per-section: see `AirbnbPublishResult`. Any other action (e.g. `pull`) returns a structured 422 naming the supported actions. Returns `403 listing_inactive` for `push`/`publish`/`unlist`/`relist` when the listing is inactive. `delete` (deactivation) is always accepted.
|
|
94
94
|
# @param id [String]
|
|
95
95
|
# @param [Hash] opts the optional parameters
|
|
96
96
|
# @option opts [String] :idempotency_key Makes a retry of this request safe. Send a unique string (a UUID generated at the point you build the request) and the response is stored for 24 hours: a repeat with the SAME key replays that stored response — tagged `Idempotency-Status: cached` — without running the operation again, so no duplicate reservation, guest or guest message is created. - Same key while the first request is still in flight → `409 idempotency_key_in_use`. - Same key with a DIFFERENT payload → `422 idempotency_key_reused`. Generate a new key per distinct request; reuse one only when retrying that exact request. - Retryable outcomes are deliberately not stored, so a retry with the same key runs for real: any status >= 500, `408`, `425` and `429`, and the refusals that happen before anything is done and tell you to fix something outside the request first — `connection_reauth_required`, `listing_inactive`, and the rate/daily limits. Every other answer, including a final refusal such as `422 airbnb_rejected`, is stored and replayed.
|
|
@@ -102,7 +102,7 @@ module Repull
|
|
|
102
102
|
end
|
|
103
103
|
|
|
104
104
|
# Listing action (delete/push/publish/unlist/relist)
|
|
105
|
-
# Apply a state action to a listing by id. The path `id` is the canonical Repull listing id. **`delete` here never touches Airbnb. Read this before you call it.** | | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) | |---|---|---| | What it changes | The Repull record | The live Airbnb listing | | Calls Airbnb | **No. Never.** | Yes | | The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings | | Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged | | API access to the listing | `403 listing_inactive` until reactivated | Unchanged — you can still read and write it | | Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` | | Data kept | Yes, and it keeps syncing | Yes | Neither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** — the word `delete` on this route means \"deactivate the Repull record\" and nothing else.
|
|
105
|
+
# Apply a state action to a listing by id. The path `id` is the canonical Repull listing id. **`delete` here never touches Airbnb. Read this before you call it.** | | `action: \"delete\"` (this endpoint) | `action: \"unlist\"` (this endpoint) | |---|---|---| | What it changes | The Repull record | The live Airbnb listing | | Calls Airbnb | **No. Never.** | Yes | | The guest-facing listing | Stays live and keeps taking bookings | **Goes down** and stops taking bookings | | Billing and plan limits | No longer billed, no longer counts toward the cap | Unchanged | | API access to the listing | `403 listing_inactive` until reactivated | Unchanged — you can still read and write it | | Reverse it with | `PATCH /v1/listings/{id}` `{ \"active\": true }` | `action: \"relist\"` | | Data kept | Yes, and it keeps syncing | Yes | Neither one deletes anything on Airbnb. **There is no endpoint on this API that deletes an Airbnb listing** — the word `delete` on this route means \"deactivate the Repull record\" and nothing else. `delete` is idempotent. To take a listing off the market on every channel at once — Airbnb and Booking.com together — use `POST /v1/listings/{id}/offline`. `unlist` calls Airbnb and **takes the live listing down**: it is deactivated with a valid deactivation reason and then READ BACK, so \"Airbnb accepted the call but the listing is still live\" is reported as a failure rather than a success. Requires `airbnbConnectionId` — a listing can be connected to more than one Airbnb listing, and taking down the wrong one is not undoable through this API. `relist` puts it back up (re-enables sync and makes the listing available again); it does not push content. `relist` goes through the channel-publish billing gate and `unlist` does not, so on a workspace whose subscription has lapsed a listing can be taken down and not put back until billing is sorted out. That refusal comes back as `402` with the action that fixes it — never as an Airbnb error, because retrying and reconnecting Airbnb do nothing for it. `push` / `publish` push the listing's content to Airbnb via the same host-side sync orchestrator as `POST /v1/listings/{id}/publish/airbnb` — pass `airbnbConnectionId` to update an already-mapped Airbnb listing, or `hostId` to create + publish a new one under that host. `force` re-pushes every field, ignoring dirty-field tracking. The result is per-section: see `AirbnbPublishResult`. Any other action (e.g. `pull`) returns a structured 422 naming the supported actions. Returns `403 listing_inactive` for `push`/`publish`/`unlist`/`relist` when the listing is inactive. `delete` (deactivation) is always accepted.
|
|
106
106
|
# @param id [String]
|
|
107
107
|
# @param [Hash] opts the optional parameters
|
|
108
108
|
# @option opts [String] :idempotency_key Makes a retry of this request safe. Send a unique string (a UUID generated at the point you build the request) and the response is stored for 24 hours: a repeat with the SAME key replays that stored response — tagged `Idempotency-Status: cached` — without running the operation again, so no duplicate reservation, guest or guest message is created. - Same key while the first request is still in flight → `409 idempotency_key_in_use`. - Same key with a DIFFERENT payload → `422 idempotency_key_reused`. Generate a new key per distinct request; reuse one only when retrying that exact request. - Retryable outcomes are deliberately not stored, so a retry with the same key runs for real: any status >= 500, `408`, `425` and `429`, and the refusals that happen before anything is done and tell you to fix something outside the request first — `connection_reauth_required`, `listing_inactive`, and the rate/daily limits. Every other answer, including a final refusal such as `422 airbnb_rejected`, is stored and replayed.
|
|
@@ -460,7 +460,7 @@ module Repull
|
|
|
460
460
|
end
|
|
461
461
|
|
|
462
462
|
# Create Airbnb special offer or pre-approval
|
|
463
|
-
# Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** — calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in
|
|
463
|
+
# Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** — calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in Repull, are `POST /v1/conversations/{id}/pre-approval` and `POST /v1/conversations/{id}/special-offers` — prefer those unless you only hold Airbnb ids. - `type: \"preapproval\"` — let the guest book the dates and price they asked about. Requires `thread_id`; optional `block_instant_booking`. - `type: \"offer\"` — your own terms. Requires `thread_id`, `listing_id` (the **Airbnb** listing id, as a string), `start_date`, `nights`, `total_price` (whole stay, listing currency) and `guest_details` with `number_of_guests` (or `number_of_adults`; Airbnb counts adults + children). The body is validated before anything reaches Airbnb (a `422 invalid_params` names the field), and unknown fields are refused. The legacy spellings `threadId` and `blockInstantBooking` still work. The request is sent as the Airbnb account that owns the thread or listing. Airbnb refusals are mapped rather than returned as a 500: `409 inquiry_no_longer_open` / `inquiry_expired` when the inquiry moved on, `422 airbnb_rejected` with Airbnb’s reason otherwise, `403 connection_reauth_required` when the grant does not allow it. Returns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated. Send `Idempotency-Key`: a repeat with the same key replays the first response instead of acting twice (a `409 idempotency_key_in_use` while the first is still running). A 5xx, a `429 airbnb_rate_limited` or a `403 connection_reauth_required` is not stored — nothing was done — so retrying with the same key reaches Airbnb again.
|
|
464
464
|
# @param create_airbnb_offer_request [CreateAirbnbOfferRequest]
|
|
465
465
|
# @param [Hash] opts the optional parameters
|
|
466
466
|
# @option opts [String] :idempotency_key Makes a retry of this request safe. Send a unique string (a UUID generated at the point you build the request) and the response is stored for 24 hours: a repeat with the SAME key replays that stored response — tagged `Idempotency-Status: cached` — without running the operation again, so no duplicate reservation, guest or guest message is created. - Same key while the first request is still in flight → `409 idempotency_key_in_use`. - Same key with a DIFFERENT payload → `422 idempotency_key_reused`. Generate a new key per distinct request; reuse one only when retrying that exact request. - Retryable outcomes are deliberately not stored, so a retry with the same key runs for real: any status >= 500, `408`, `425` and `429`, and the refusals that happen before anything is done and tell you to fix something outside the request first — `connection_reauth_required`, `listing_inactive`, and the rate/daily limits. Every other answer, including a final refusal such as `422 airbnb_rejected`, is stored and replayed.
|
|
@@ -471,7 +471,7 @@ module Repull
|
|
|
471
471
|
end
|
|
472
472
|
|
|
473
473
|
# Create Airbnb special offer or pre-approval
|
|
474
|
-
# Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** — calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in
|
|
474
|
+
# Create a pre-approval or a special offer on an Airbnb thread, addressed by **Airbnb** ids. **Write-side** — calls Airbnb upstream. The Repull-id equivalents, which also update the inquiry in Repull, are `POST /v1/conversations/{id}/pre-approval` and `POST /v1/conversations/{id}/special-offers` — prefer those unless you only hold Airbnb ids. - `type: \"preapproval\"` — let the guest book the dates and price they asked about. Requires `thread_id`; optional `block_instant_booking`. - `type: \"offer\"` — your own terms. Requires `thread_id`, `listing_id` (the **Airbnb** listing id, as a string), `start_date`, `nights`, `total_price` (whole stay, listing currency) and `guest_details` with `number_of_guests` (or `number_of_adults`; Airbnb counts adults + children). The body is validated before anything reaches Airbnb (a `422 invalid_params` names the field), and unknown fields are refused. The legacy spellings `threadId` and `blockInstantBooking` still work. The request is sent as the Airbnb account that owns the thread or listing. Airbnb refusals are mapped rather than returned as a 500: `409 inquiry_no_longer_open` / `inquiry_expired` when the inquiry moved on, `422 airbnb_rejected` with Airbnb’s reason otherwise, `403 connection_reauth_required` when the grant does not allow it. Returns `403 listing_inactive` when the listing this resolves to is inactive. An inactive listing keeps syncing, but cannot be read or changed through the API until it is activated. Send `Idempotency-Key`: a repeat with the same key replays the first response instead of acting twice (a `409 idempotency_key_in_use` while the first is still running). A 5xx, a `429 airbnb_rate_limited` or a `403 connection_reauth_required` is not stored — nothing was done — so retrying with the same key reaches Airbnb again.
|
|
475
475
|
# @param create_airbnb_offer_request [CreateAirbnbOfferRequest]
|
|
476
476
|
# @param [Hash] opts the optional parameters
|
|
477
477
|
# @option opts [String] :idempotency_key Makes a retry of this request safe. Send a unique string (a UUID generated at the point you build the request) and the response is stored for 24 hours: a repeat with the SAME key replays that stored response — tagged `Idempotency-Status: cached` — without running the operation again, so no duplicate reservation, guest or guest message is created. - Same key while the first request is still in flight → `409 idempotency_key_in_use`. - Same key with a DIFFERENT payload → `422 idempotency_key_reused`. Generate a new key per distinct request; reuse one only when retrying that exact request. - Retryable outcomes are deliberately not stored, so a retry with the same key runs for real: any status >= 500, `408`, `425` and `429`, and the refusals that happen before anything is done and tell you to fix something outside the request first — `connection_reauth_required`, `listing_inactive`, and the rate/daily limits. Every other answer, including a final refusal such as `422 airbnb_rejected`, is stored and replayed.
|
|
@@ -1131,7 +1131,7 @@ module Repull
|
|
|
1131
1131
|
end
|
|
1132
1132
|
|
|
1133
1133
|
# Get Airbnb listing
|
|
1134
|
-
# Fetch all Airbnb connection rows for a single
|
|
1134
|
+
# Fetch all Airbnb connection rows for a single Repull listing id. A property may be linked from multiple Airbnb hosts — every match is returned. Pass `?include=amenities` to enrich each row with its current Airbnb amenities. Each row carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`, meaning Airbnb refuses every write to the listing and Repull returns `403 listing_not_api_connected` without sending anything. `GET /v1/channels/airbnb/listings` reports both fields for the whole portfolio in one call. 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.
|
|
1135
1135
|
# @param id [String]
|
|
1136
1136
|
# @param [Hash] opts the optional parameters
|
|
1137
1137
|
# @option opts [String] :include Comma-separated expansions. Currently supported: `amenities`.
|
|
@@ -1142,7 +1142,7 @@ module Repull
|
|
|
1142
1142
|
end
|
|
1143
1143
|
|
|
1144
1144
|
# Get Airbnb listing
|
|
1145
|
-
# Fetch all Airbnb connection rows for a single
|
|
1145
|
+
# Fetch all Airbnb connection rows for a single Repull listing id. A property may be linked from multiple Airbnb hosts — every match is returned. Pass `?include=amenities` to enrich each row with its current Airbnb amenities. Each row carries `syncCategory` — Airbnb's own per-listing API sync decision (`sync_all`, `sync_rates_and_availability`, or `none`) — and `writable`, which is `false` exactly when that category is `none`, meaning Airbnb refuses every write to the listing and Repull returns `403 listing_not_api_connected` without sending anything. `GET /v1/channels/airbnb/listings` reports both fields for the whole portfolio in one call. 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.
|
|
1146
1146
|
# @param id [String]
|
|
1147
1147
|
# @param [Hash] opts the optional parameters
|
|
1148
1148
|
# @option opts [String] :include Comma-separated expansions. Currently supported: `amenities`.
|
|
@@ -2532,31 +2532,67 @@ module Repull
|
|
|
2532
2532
|
return data, status_code, headers
|
|
2533
2533
|
end
|
|
2534
2534
|
|
|
2535
|
-
# List Airbnb transactions
|
|
2536
|
-
#
|
|
2535
|
+
# List Airbnb transactions (settlement ledger)
|
|
2536
|
+
# The Airbnb settlement ledger for this workspace: every payout Airbnb sent to the host, each followed by the lines it paid — reservations and their installments, adjustments, resolution payouts and adjustments, cancellation fees. A payout's lines' signed `amount`s sum to its `payout.paidOutAmount` exactly, negative lines included (an adjustment offset against a later payout appears under that payout). `status: UPCOMING` lines are expected earnings not paid out yet; they belong to no payout. **Ids are stable.** Airbnb sends no line id and no payout id on lines, so Repull derives them deterministically: a Payout row's id is Airbnb's payout id; a line's is `<payoutId>:<type>:<confirmationCode>:<n>`. The same line has the same id on every refresh and every page, so you can upsert on `transactionId`. A payout that nets to $0.00 has no Airbnb id; it gets a derived `Z-<date>-<hash>` id with `payout.payoutIdSynthetic: true`. **Order:** newest first by the payout's date; each Payout row is followed by its lines in Airbnb's order (`payout.lineIndex`). **Dates:** `start_date` / `end_date` match the payout's date for settled lines (a line can be dated the day before its payout, and is still returned with it) and the line's own date for UPCOMING lines. **Pure DB read** — never calls Airbnb. Refresh with `POST` on this path. `dataFreshness` reports when each account's ledger was last refreshed. Lines on listings that are inactive in Repull are included and flagged `onInactiveListing: true`, so every payout reconciles. Lines Repull cannot match to a reservation keep `reservationId: null`. **Not in Airbnb's transaction history** (listed in `unavailableFields`): taxes Airbnb collects and remits itself, and the guest-paid total (see the reservation's financial breakdown); pass-through occupancy tax paid to the host does appear, as its own `Pass Through Tot` lines, the original line a refund or reversal reverses (it names the stay and the resolution), and currency-conversion amounts (only the payout currency is reported).
|
|
2537
2537
|
# @param [Hash] opts the optional parameters
|
|
2538
2538
|
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
2539
|
+
# @option opts [Date] :start_date Inclusive lower bound on the payout's date (the line's own date for UPCOMING lines). YYYY-MM-DD.
|
|
2540
|
+
# @option opts [Date] :end_date Inclusive upper bound, as `start_date`.
|
|
2541
|
+
# @option opts [String] :status `COMPLETED` (settled) or `UPCOMING` (expected).
|
|
2542
|
+
# @option opts [String] :type Airbnb's line type, exact match ignoring case — e.g. `Payout`, `Reservation`, `Adjustment`, `Resolution Payout`.
|
|
2543
|
+
# @option opts [String] :payout_id One payout: its Payout row and all its lines.
|
|
2544
|
+
# @option opts [String] :confirmation_code Every line for one reservation — each installment, adjustment and resolution.
|
|
2545
|
+
# @option opts [Integer] :limit Lines per page. Hard cap is 500. (default to 100)
|
|
2546
|
+
# @option opts [String] :cursor Opaque cursor returned by the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
2539
2547
|
# @return [ListAirbnbTransactions200Response]
|
|
2540
2548
|
def list_airbnb_transactions(opts = {})
|
|
2541
2549
|
data, _status_code, _headers = list_airbnb_transactions_with_http_info(opts)
|
|
2542
2550
|
data
|
|
2543
2551
|
end
|
|
2544
2552
|
|
|
2545
|
-
# List Airbnb transactions
|
|
2546
|
-
#
|
|
2553
|
+
# List Airbnb transactions (settlement ledger)
|
|
2554
|
+
# The Airbnb settlement ledger for this workspace: every payout Airbnb sent to the host, each followed by the lines it paid — reservations and their installments, adjustments, resolution payouts and adjustments, cancellation fees. A payout's lines' signed `amount`s sum to its `payout.paidOutAmount` exactly, negative lines included (an adjustment offset against a later payout appears under that payout). `status: UPCOMING` lines are expected earnings not paid out yet; they belong to no payout. **Ids are stable.** Airbnb sends no line id and no payout id on lines, so Repull derives them deterministically: a Payout row's id is Airbnb's payout id; a line's is `<payoutId>:<type>:<confirmationCode>:<n>`. The same line has the same id on every refresh and every page, so you can upsert on `transactionId`. A payout that nets to $0.00 has no Airbnb id; it gets a derived `Z-<date>-<hash>` id with `payout.payoutIdSynthetic: true`. **Order:** newest first by the payout's date; each Payout row is followed by its lines in Airbnb's order (`payout.lineIndex`). **Dates:** `start_date` / `end_date` match the payout's date for settled lines (a line can be dated the day before its payout, and is still returned with it) and the line's own date for UPCOMING lines. **Pure DB read** — never calls Airbnb. Refresh with `POST` on this path. `dataFreshness` reports when each account's ledger was last refreshed. Lines on listings that are inactive in Repull are included and flagged `onInactiveListing: true`, so every payout reconciles. Lines Repull cannot match to a reservation keep `reservationId: null`. **Not in Airbnb's transaction history** (listed in `unavailableFields`): taxes Airbnb collects and remits itself, and the guest-paid total (see the reservation's financial breakdown); pass-through occupancy tax paid to the host does appear, as its own `Pass Through Tot` lines, the original line a refund or reversal reverses (it names the stay and the resolution), and currency-conversion amounts (only the payout currency is reported).
|
|
2547
2555
|
# @param [Hash] opts the optional parameters
|
|
2548
2556
|
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
2557
|
+
# @option opts [Date] :start_date Inclusive lower bound on the payout's date (the line's own date for UPCOMING lines). YYYY-MM-DD.
|
|
2558
|
+
# @option opts [Date] :end_date Inclusive upper bound, as `start_date`.
|
|
2559
|
+
# @option opts [String] :status `COMPLETED` (settled) or `UPCOMING` (expected).
|
|
2560
|
+
# @option opts [String] :type Airbnb's line type, exact match ignoring case — e.g. `Payout`, `Reservation`, `Adjustment`, `Resolution Payout`.
|
|
2561
|
+
# @option opts [String] :payout_id One payout: its Payout row and all its lines.
|
|
2562
|
+
# @option opts [String] :confirmation_code Every line for one reservation — each installment, adjustment and resolution.
|
|
2563
|
+
# @option opts [Integer] :limit Lines per page. Hard cap is 500. (default to 100)
|
|
2564
|
+
# @option opts [String] :cursor Opaque cursor returned by the previous response's `pagination.nextCursor`. Omit to fetch the first page.
|
|
2549
2565
|
# @return [Array<(ListAirbnbTransactions200Response, Integer, Hash)>] ListAirbnbTransactions200Response data, response status code and response headers
|
|
2550
2566
|
def list_airbnb_transactions_with_http_info(opts = {})
|
|
2551
2567
|
if @api_client.config.debugging
|
|
2552
2568
|
@api_client.config.logger.debug 'Calling API: AirbnbApi.list_airbnb_transactions ...'
|
|
2553
2569
|
end
|
|
2570
|
+
allowable_values = ["COMPLETED", "UPCOMING"]
|
|
2571
|
+
if @api_client.config.client_side_validation && opts[:'status'] && !allowable_values.include?(opts[:'status'])
|
|
2572
|
+
fail ArgumentError, "invalid value for \"status\", must be one of #{allowable_values}"
|
|
2573
|
+
end
|
|
2574
|
+
if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 500
|
|
2575
|
+
fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling AirbnbApi.list_airbnb_transactions, must be smaller than or equal to 500.'
|
|
2576
|
+
end
|
|
2577
|
+
|
|
2578
|
+
if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
|
|
2579
|
+
fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling AirbnbApi.list_airbnb_transactions, must be greater than or equal to 1.'
|
|
2580
|
+
end
|
|
2581
|
+
|
|
2554
2582
|
# resource path
|
|
2555
2583
|
local_var_path = '/v1/channels/airbnb/transactions'
|
|
2556
2584
|
|
|
2557
2585
|
# query parameters
|
|
2558
2586
|
query_params = opts[:query_params] || {}
|
|
2559
2587
|
query_params[:'account_id'] = opts[:'account_id'] if !opts[:'account_id'].nil?
|
|
2588
|
+
query_params[:'start_date'] = opts[:'start_date'] if !opts[:'start_date'].nil?
|
|
2589
|
+
query_params[:'end_date'] = opts[:'end_date'] if !opts[:'end_date'].nil?
|
|
2590
|
+
query_params[:'status'] = opts[:'status'] if !opts[:'status'].nil?
|
|
2591
|
+
query_params[:'type'] = opts[:'type'] if !opts[:'type'].nil?
|
|
2592
|
+
query_params[:'payout_id'] = opts[:'payout_id'] if !opts[:'payout_id'].nil?
|
|
2593
|
+
query_params[:'confirmation_code'] = opts[:'confirmation_code'] if !opts[:'confirmation_code'].nil?
|
|
2594
|
+
query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
|
|
2595
|
+
query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil?
|
|
2560
2596
|
|
|
2561
2597
|
# header parameters
|
|
2562
2598
|
header_params = opts[:header_params] || {}
|
|
@@ -3013,9 +3049,10 @@ module Repull
|
|
|
3013
3049
|
return data, status_code, headers
|
|
3014
3050
|
end
|
|
3015
3051
|
|
|
3016
|
-
#
|
|
3017
|
-
#
|
|
3052
|
+
# Refresh Airbnb transactions
|
|
3053
|
+
# Pull the transaction history from Airbnb into the ledger `GET` serves. Every connected Airbnb account is refreshed, or only `?account_id=`. Without dates: settled lines from the last 12 months and the forecast for the next 12. Safe to repeat: settled lines are upserted on their stable ids, never duplicated or removed; the UPCOMING forecast inside the fetched window is replaced, so a line that has since been paid out moves to its payout. Each account reports its own outcome in `accounts[]`: one account Airbnb refuses (a revoked host, a listing Airbnb no longer serves) is reported there with Airbnb's reason and does not stop the others. When every account fails, the response is Airbnb's answer with its usual code.
|
|
3018
3054
|
# @param [Hash] opts the optional parameters
|
|
3055
|
+
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
3019
3056
|
# @option opts [SyncAirbnbTransactionsRequest] :sync_airbnb_transactions_request
|
|
3020
3057
|
# @return [SyncAirbnbTransactions200Response]
|
|
3021
3058
|
def sync_airbnb_transactions(opts = {})
|
|
@@ -3023,9 +3060,10 @@ module Repull
|
|
|
3023
3060
|
data
|
|
3024
3061
|
end
|
|
3025
3062
|
|
|
3026
|
-
#
|
|
3027
|
-
#
|
|
3063
|
+
# Refresh Airbnb transactions
|
|
3064
|
+
# Pull the transaction history from Airbnb into the ledger `GET` serves. Every connected Airbnb account is refreshed, or only `?account_id=`. Without dates: settled lines from the last 12 months and the forecast for the next 12. Safe to repeat: settled lines are upserted on their stable ids, never duplicated or removed; the UPCOMING forecast inside the fetched window is replaced, so a line that has since been paid out moves to its payout. Each account reports its own outcome in `accounts[]`: one account Airbnb refuses (a revoked host, a listing Airbnb no longer serves) is reported there with Airbnb's reason and does not stop the others. When every account fails, the response is Airbnb's answer with its usual code.
|
|
3028
3065
|
# @param [Hash] opts the optional parameters
|
|
3066
|
+
# @option opts [String] :account_id Scope the response to ONE connected Airbnb account. The value is the Airbnb host id — the same `accounts[].externalAccountId` that `GET /v1/connect/airbnb` returns and `DELETE /v1/connect/airbnb?accountId=` accepts. A workspace can connect several Airbnb accounts. Omit this and you get every account's rows (the default, unchanged). Every row carries `accountId` + `accountName` either way, so you can group without a second call. An id that is not connected to THIS workspace returns `404 not_found` with your own ids in `valid_values` — we do not distinguish \"no such host\" from \"someone else's host\", because confirming the latter would leak another workspace's account. Note this is NOT the `X-Account-Id` header, which carries a connection id and cannot tell two Airbnb hosts apart.
|
|
3029
3067
|
# @option opts [SyncAirbnbTransactionsRequest] :sync_airbnb_transactions_request
|
|
3030
3068
|
# @return [Array<(SyncAirbnbTransactions200Response, Integer, Hash)>] SyncAirbnbTransactions200Response data, response status code and response headers
|
|
3031
3069
|
def sync_airbnb_transactions_with_http_info(opts = {})
|
|
@@ -3037,6 +3075,7 @@ module Repull
|
|
|
3037
3075
|
|
|
3038
3076
|
# query parameters
|
|
3039
3077
|
query_params = opts[:query_params] || {}
|
|
3078
|
+
query_params[:'account_id'] = opts[:'account_id'] if !opts[:'account_id'].nil?
|
|
3040
3079
|
|
|
3041
3080
|
# header parameters
|
|
3042
3081
|
header_params = opts[:header_params] || {}
|
data/lib/repull/api/atlas_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
|
|
|
@@ -88,7 +88,7 @@ module Repull
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
# Get property availability
|
|
91
|
-
# Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape — `{ date, available, price, minNights }` — projected from the property calendar. The `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) — omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days. **`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` — their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 — 404 means the property id does not exist or belongs to a different workspace. This endpoint is read-only, and the projected per-date shape carries **availability, price, and min-nights only** — it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes. 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.
|
|
91
|
+
# Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape — `{ date, available, price, minNights, availableUnits }` — projected from the property calendar. `availableUnits` is 1 or 0 for a single home, and the rooms of the type left for a hotel-model listing (a Mews or Cloudbeds room type). The `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) — omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days. **`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` — their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 — 404 means the property id does not exist or belongs to a different workspace. This endpoint is read-only, and the projected per-date shape carries **availability, units left, price, and min-nights only** — it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes. 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 property_id [Integer] Repull property id (equal to `listings.id`; the same integer used as `propertyId` on availability and `listingId` on reservations).
|
|
93
93
|
# @param from [Date] Start of the window (inclusive), ISO `YYYY-MM-DD`. Required — missing/malformed returns 422. `startDate` is accepted as an alias.
|
|
94
94
|
# @param to [Date] End of the window (inclusive), ISO `YYYY-MM-DD`. Required — missing/malformed returns 422. `endDate` is accepted as an alias.
|
|
@@ -100,7 +100,7 @@ module Repull
|
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
# Get property availability
|
|
103
|
-
# Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape — `{ date, available, price, minNights }` — projected from the property calendar. The `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) — omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days. **`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` — their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 — 404 means the property id does not exist or belongs to a different workspace. This endpoint is read-only, and the projected per-date shape carries **availability, price, and min-nights only** — it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes. 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
|
+
# Channel-agnostic day-by-day availability calendar for a property over a date window. Returns a thin per-date shape — `{ date, available, price, minNights, availableUnits }` — projected from the property calendar. `availableUnits` is 1 or 0 for a single home, and the rooms of the type left for a hotel-model listing (a Mews or Cloudbeds room type). The `from` and `to` query params are **required** (ISO `YYYY-MM-DD`, inclusive) — omitting or malforming either returns 422. The window is capped at 366 days; longer ranges are truncated to the first 366 days. **`days` contains only the dates we actually hold calendar data for.** Requested dates with no calendar row are listed in `coverage.missingDates` — their availability is unknown. Never treat a missing date as bookable: this endpoint deliberately does not synthesise availability, because a fabricated open date can be double-booked. A property with no calendar still returns a real 200 (`days: []`, every date in `coverage.missingDates`), never a 404 — 404 means the property id does not exist or belongs to a different workspace. This endpoint is read-only, and the projected per-date shape carries **availability, units left, price, and min-nights only** — it does NOT expose max-stay, closed-to-arrival (CTA), closed-to-departure (CTD), or the dedicated stop-sell flag. To read or write that full restriction set on Booking.com use the channel routes: `GET`/`PUT /v1/channels/booking/availability` (with the room + rate ids from `GET /v1/channels/booking/properties/{id}/rooms`). To **write** calendar values use `PUT /v1/availability/{propertyId}` (or `PATCH /v1/availability/batch`), which updates the property calendar and pushes to its connected channels; channel-only settings stay on the channel routes. 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.
|
|
104
104
|
# @param property_id [Integer] Repull property id (equal to `listings.id`; the same integer used as `propertyId` on availability and `listingId` on reservations).
|
|
105
105
|
# @param from [Date] Start of the window (inclusive), ISO `YYYY-MM-DD`. Required — missing/malformed returns 422. `startDate` is accepted as an alias.
|
|
106
106
|
# @param to [Date] End of the window (inclusive), ISO `YYYY-MM-DD`. Required — missing/malformed returns 422. `endDate` is accepted as an alias.
|
|
@@ -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
|
|
|
@@ -378,7 +378,7 @@ module Repull
|
|
|
378
378
|
# @option opts [Date] :start_date Window start (ISO YYYY-MM-DD).
|
|
379
379
|
# @option opts [Integer] :number_of_days Window length in days.
|
|
380
380
|
# @option opts [String] :room_id Restrict to a single Booking.com room id.
|
|
381
|
-
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
381
|
+
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read — its `roomsToSell` is often 0 for rooms that are on sale.
|
|
382
382
|
# @return [BookingAvailabilityStateResponse]
|
|
383
383
|
def get_booking_availability(property_id, opts = {})
|
|
384
384
|
data, _status_code, _headers = get_booking_availability_with_http_info(property_id, opts)
|
|
@@ -392,7 +392,7 @@ module Repull
|
|
|
392
392
|
# @option opts [Date] :start_date Window start (ISO YYYY-MM-DD).
|
|
393
393
|
# @option opts [Integer] :number_of_days Window length in days.
|
|
394
394
|
# @option opts [String] :room_id Restrict to a single Booking.com room id.
|
|
395
|
-
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
395
|
+
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read — its `roomsToSell` is often 0 for rooms that are on sale.
|
|
396
396
|
# @return [Array<(BookingAvailabilityStateResponse, Integer, Hash)>] BookingAvailabilityStateResponse data, response status code and response headers
|
|
397
397
|
def get_booking_availability_with_http_info(property_id, opts = {})
|
|
398
398
|
if @api_client.config.debugging
|
|
@@ -592,7 +592,7 @@ module Repull
|
|
|
592
592
|
# @option opts [Date] :start_date
|
|
593
593
|
# @option opts [Integer] :number_of_days
|
|
594
594
|
# @option opts [String] :room_id
|
|
595
|
-
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
595
|
+
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read — its `roomsToSell` is often 0 for rooms that are on sale.
|
|
596
596
|
# @option opts [String] :hotel_id Booking.com hotel id, when this listing is published under more than one property. Omit it and a read uses the oldest mapping (reporting the rest in `otherHotelIds`), while a write is refused with `409 ambiguous_booking_mapping` rather than guess. `GET /v1/channels/booking/properties` lists the valid ids.
|
|
597
597
|
# @return [BookingPricingResponse]
|
|
598
598
|
def get_booking_listing_pricing(id, opts = {})
|
|
@@ -607,7 +607,7 @@ module Repull
|
|
|
607
607
|
# @option opts [Date] :start_date
|
|
608
608
|
# @option opts [Integer] :number_of_days
|
|
609
609
|
# @option opts [String] :room_id
|
|
610
|
-
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory
|
|
610
|
+
# @option opts [Boolean] :room_level Defaults to `true`: availability per room, which is how Booking.com keeps inventory. Send `false` for the per-rate read — its `roomsToSell` is often 0 for rooms that are on sale.
|
|
611
611
|
# @option opts [String] :hotel_id Booking.com hotel id, when this listing is published under more than one property. Omit it and a read uses the oldest mapping (reporting the rest in `otherHotelIds`), while a write is refused with `409 ambiguous_booking_mapping` rather than guess. `GET /v1/channels/booking/properties` lists the valid ids.
|
|
612
612
|
# @return [Array<(BookingPricingResponse, Integer, Hash)>] BookingPricingResponse data, response status code and response headers
|
|
613
613
|
def get_booking_listing_pricing_with_http_info(id, opts = {})
|