repull-sdk 0.2.0__tar.gz
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.
- repull_sdk-0.2.0/.gitignore +42 -0
- repull_sdk-0.2.0/LICENSE +21 -0
- repull_sdk-0.2.0/PKG-INFO +214 -0
- repull_sdk-0.2.0/README.md +178 -0
- repull_sdk-0.2.0/examples/connect_airbnb.py +44 -0
- repull_sdk-0.2.0/examples/quickstart.py +43 -0
- repull_sdk-0.2.0/openapi/v1.json +1 -0
- repull_sdk-0.2.0/pyproject.toml +100 -0
- repull_sdk-0.2.0/src/repull/__init__.py +8 -0
- repull_sdk-0.2.0/src/repull/api/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/ai/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/ai/create_ai_operation.py +218 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/airbnb_listing_action.py +123 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/airbnb_reservation_action.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/create_airbnb_listing.py +162 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing.py +183 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing_availability.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing_pricing.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_reservation.py +179 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_listing_photos.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_listings.py +166 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_reservations.py +166 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_reviews.py +162 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_thread_messages.py +183 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_threads.py +162 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/respond_airbnb_review.py +110 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/send_airbnb_message.py +123 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/sync_airbnb.py +108 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/update_airbnb_listing_availability.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/update_airbnb_listing_pricing.py +121 -0
- repull_sdk-0.2.0/src/repull/api/airbnb/upload_airbnb_listing_photos.py +121 -0
- repull_sdk-0.2.0/src/repull/api/atlas/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/atlas/get_listing_segments.py +282 -0
- repull_sdk-0.2.0/src/repull/api/atlas/list_listing_comps.py +307 -0
- repull_sdk-0.2.0/src/repull/api/availability/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/availability/get_availability.py +219 -0
- repull_sdk-0.2.0/src/repull/api/availability/update_availability.py +138 -0
- repull_sdk-0.2.0/src/repull/api/billing/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/billing/create_billing_checkout.py +131 -0
- repull_sdk-0.2.0/src/repull/api/billing/get_billing.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/create_booking_property.py +162 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/get_booking_content.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/get_booking_listing_pricing.py +304 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/list_booking_conversations.py +158 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/list_booking_properties.py +162 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/send_booking_message.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/sync_booking.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_availability.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_content.py +110 -0
- repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_listing_pricing.py +245 -0
- repull_sdk-0.2.0/src/repull/api/connect/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/connect/create_connect_session.py +207 -0
- repull_sdk-0.2.0/src/repull/api/connect/create_connection.py +227 -0
- repull_sdk-0.2.0/src/repull/api/connect/delete_connection.py +123 -0
- repull_sdk-0.2.0/src/repull/api/connect/get_connect_status.py +183 -0
- repull_sdk-0.2.0/src/repull/api/connect/list_connect_booking_rooms.py +239 -0
- repull_sdk-0.2.0/src/repull/api/connect/list_connect_providers.py +162 -0
- repull_sdk-0.2.0/src/repull/api/connect/list_connections.py +158 -0
- repull_sdk-0.2.0/src/repull/api/connect/map_connect_booking_rooms.py +270 -0
- repull_sdk-0.2.0/src/repull/api/connect/select_connect_provider.py +220 -0
- repull_sdk-0.2.0/src/repull/api/connect/verify_booking_hotel.py +277 -0
- repull_sdk-0.2.0/src/repull/api/conversations/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/conversations/get_conversation.py +236 -0
- repull_sdk-0.2.0/src/repull/api/conversations/list_conversation_messages.py +302 -0
- repull_sdk-0.2.0/src/repull/api/conversations/list_conversations.py +310 -0
- repull_sdk-0.2.0/src/repull/api/guests/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/guests/get_guest.py +236 -0
- repull_sdk-0.2.0/src/repull/api/guests/list_guests.py +315 -0
- repull_sdk-0.2.0/src/repull/api/listings/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/listings/create_listing.py +207 -0
- repull_sdk-0.2.0/src/repull/api/listings/generate_listing_content.py +223 -0
- repull_sdk-0.2.0/src/repull/api/listings/get_listing.py +229 -0
- repull_sdk-0.2.0/src/repull/api/listings/get_listing_publish_status.py +183 -0
- repull_sdk-0.2.0/src/repull/api/listings/list_listings.py +294 -0
- repull_sdk-0.2.0/src/repull/api/listings/publish_listing_to_airbnb.py +219 -0
- repull_sdk-0.2.0/src/repull/api/listings/publish_listing_to_booking.py +191 -0
- repull_sdk-0.2.0/src/repull/api/markets/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/markets/get_market.py +221 -0
- repull_sdk-0.2.0/src/repull/api/markets/get_market_calendar.py +259 -0
- repull_sdk-0.2.0/src/repull/api/markets/list_market_browse.py +315 -0
- repull_sdk-0.2.0/src/repull/api/markets/list_markets.py +186 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/get_plumguide_availability.py +110 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/get_plumguide_pricing.py +108 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/list_plumguide_listings.py +162 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/update_plumguide_availability.py +110 -0
- repull_sdk-0.2.0/src/repull/api/plumguide/update_plumguide_pricing.py +110 -0
- repull_sdk-0.2.0/src/repull/api/pricing/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/pricing/apply_listing_pricing.py +216 -0
- repull_sdk-0.2.0/src/repull/api/pricing/bulk_apply_pricing.py +272 -0
- repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing.py +255 -0
- repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing_history.py +310 -0
- repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing_strategy.py +191 -0
- repull_sdk-0.2.0/src/repull/api/pricing/update_listing_pricing_strategy.py +208 -0
- repull_sdk-0.2.0/src/repull/api/properties/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/properties/get_property.py +191 -0
- repull_sdk-0.2.0/src/repull/api/properties/list_properties.py +273 -0
- repull_sdk-0.2.0/src/repull/api/reservations/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/reservations/cancel_reservation.py +123 -0
- repull_sdk-0.2.0/src/repull/api/reservations/create_reservation.py +195 -0
- repull_sdk-0.2.0/src/repull/api/reservations/get_reservation.py +240 -0
- repull_sdk-0.2.0/src/repull/api/reservations/list_reservations.py +400 -0
- repull_sdk-0.2.0/src/repull/api/reservations/update_reservation.py +142 -0
- repull_sdk-0.2.0/src/repull/api/reviews/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/reviews/get_review.py +236 -0
- repull_sdk-0.2.0/src/repull/api/reviews/list_reviews.py +379 -0
- repull_sdk-0.2.0/src/repull/api/schema/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/schema/create_custom_schema.py +252 -0
- repull_sdk-0.2.0/src/repull/api/schema/delete_custom_schema.py +206 -0
- repull_sdk-0.2.0/src/repull/api/schema/get_custom_schema.py +206 -0
- repull_sdk-0.2.0/src/repull/api/schema/list_custom_schemas.py +173 -0
- repull_sdk-0.2.0/src/repull/api/schema/update_custom_schema.py +253 -0
- repull_sdk-0.2.0/src/repull/api/system/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/system/get_health.py +162 -0
- repull_sdk-0.2.0/src/repull/api/vrbo/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/vrbo/get_vrbo_listing_pricing.py +221 -0
- repull_sdk-0.2.0/src/repull/api/vrbo/list_vrbo_listings.py +162 -0
- repull_sdk-0.2.0/src/repull/api/vrbo/list_vrbo_reservations.py +162 -0
- repull_sdk-0.2.0/src/repull/api/vrbo/update_vrbo_listing_pricing.py +205 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/__init__.py +1 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/create_webhook.py +199 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/delete_webhook.py +122 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/get_webhook.py +184 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/get_webhook_delivery.py +193 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/list_webhook_deliveries.py +249 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/list_webhook_event_types.py +162 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/list_webhooks.py +162 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/ping_webhook.py +122 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/replay_webhook_delivery.py +127 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/rotate_webhook_secret.py +184 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/test_fire_webhook.py +127 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/test_webhook.py +133 -0
- repull_sdk-0.2.0/src/repull/api/webhooks/update_webhook.py +208 -0
- repull_sdk-0.2.0/src/repull/client.py +271 -0
- repull_sdk-0.2.0/src/repull/errors.py +14 -0
- repull_sdk-0.2.0/src/repull/models/__init__.py +485 -0
- repull_sdk-0.2.0/src/repull/models/ai_operation.py +114 -0
- repull_sdk-0.2.0/src/repull/models/ai_operation_input.py +66 -0
- repull_sdk-0.2.0/src/repull/models/ai_operation_operation.py +11 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_listing.py +224 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_listing_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_reservation.py +234 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_reservation_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_reservation_status.py +11 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_review.py +199 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_review_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_thread.py +178 -0
- repull_sdk-0.2.0/src/repull/models/airbnb_thread_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/booking_connect_listing_option.py +108 -0
- repull_sdk-0.2.0/src/repull/models/booking_connect_room.py +159 -0
- repull_sdk-0.2.0/src/repull/models/booking_connect_rooms_response.py +149 -0
- repull_sdk-0.2.0/src/repull/models/booking_connect_rooms_response_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/booking_conversation.py +157 -0
- repull_sdk-0.2.0/src/repull/models/booking_conversation_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update.py +204 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update_date_range.py +93 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update_restrictions.py +155 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_response.py +89 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_update_request.py +96 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response.py +160 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response_errors_item.py +65 -0
- repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response_raw.py +66 -0
- repull_sdk-0.2.0/src/repull/models/booking_property.py +152 -0
- repull_sdk-0.2.0/src/repull/models/booking_property_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/booking_room_mapping.py +101 -0
- repull_sdk-0.2.0/src/repull/models/booking_verify_hotel_request.py +87 -0
- repull_sdk-0.2.0/src/repull/models/booking_verify_hotel_response.py +188 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_failure.py +138 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_failure_error_code.py +10 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_item.py +102 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_request.py +109 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_request_action.py +8 -0
- repull_sdk-0.2.0/src/repull/models/bulk_pricing_response.py +120 -0
- repull_sdk-0.2.0/src/repull/models/calendar_day.py +118 -0
- repull_sdk-0.2.0/src/repull/models/calendar_response.py +100 -0
- repull_sdk-0.2.0/src/repull/models/connect_host.py +179 -0
- repull_sdk-0.2.0/src/repull/models/connect_provider.py +187 -0
- repull_sdk-0.2.0/src/repull/models/connect_provider_category.py +8 -0
- repull_sdk-0.2.0/src/repull/models/connect_provider_connect_pattern.py +10 -0
- repull_sdk-0.2.0/src/repull/models/connect_provider_list_response.py +100 -0
- repull_sdk-0.2.0/src/repull/models/connect_provider_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/connect_session.py +124 -0
- repull_sdk-0.2.0/src/repull/models/connect_status.py +200 -0
- repull_sdk-0.2.0/src/repull/models/connect_status_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/connection.py +189 -0
- repull_sdk-0.2.0/src/repull/models/connection_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/connection_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/conversation.py +311 -0
- repull_sdk-0.2.0/src/repull/models/conversation_detail.py +384 -0
- repull_sdk-0.2.0/src/repull/models/conversation_guest.py +141 -0
- repull_sdk-0.2.0/src/repull/models/conversation_guest_contact.py +105 -0
- repull_sdk-0.2.0/src/repull/models/conversation_host.py +129 -0
- repull_sdk-0.2.0/src/repull/models/conversation_list_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/conversation_message_attachment.py +118 -0
- repull_sdk-0.2.0/src/repull/models/conversation_platform.py +11 -0
- repull_sdk-0.2.0/src/repull/models/conversation_status.py +8 -0
- repull_sdk-0.2.0/src/repull/models/create_ai_operation_response_200.py +87 -0
- repull_sdk-0.2.0/src/repull/models/create_billing_checkout_body.py +90 -0
- repull_sdk-0.2.0/src/repull/models/create_billing_checkout_body_plan.py +9 -0
- repull_sdk-0.2.0/src/repull/models/create_connect_session_body.py +133 -0
- repull_sdk-0.2.0/src/repull/models/create_connection_body.py +129 -0
- repull_sdk-0.2.0/src/repull/models/create_connection_body_access_type.py +8 -0
- repull_sdk-0.2.0/src/repull/models/create_reservation_body.py +163 -0
- repull_sdk-0.2.0/src/repull/models/create_webhook_body.py +119 -0
- repull_sdk-0.2.0/src/repull/models/cursor_pagination.py +107 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema.py +156 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_create.py +122 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_create_response.py +155 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_delete_response.py +76 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_list_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_mappings.py +74 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_summary.py +155 -0
- repull_sdk-0.2.0/src/repull/models/custom_schema_update.py +132 -0
- repull_sdk-0.2.0/src/repull/models/error.py +88 -0
- repull_sdk-0.2.0/src/repull/models/error_error.py +222 -0
- repull_sdk-0.2.0/src/repull/models/error_error_support.py +98 -0
- repull_sdk-0.2.0/src/repull/models/get_health_response_200.py +87 -0
- repull_sdk-0.2.0/src/repull/models/get_listing_segments_level.py +8 -0
- repull_sdk-0.2.0/src/repull/models/guest.py +311 -0
- repull_sdk-0.2.0/src/repull/models/guest_contact.py +142 -0
- repull_sdk-0.2.0/src/repull/models/guest_flag.py +146 -0
- repull_sdk-0.2.0/src/repull/models/guest_list_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/guest_note.py +177 -0
- repull_sdk-0.2.0/src/repull/models/guest_profile.py +461 -0
- repull_sdk-0.2.0/src/repull/models/guest_reservations_summary.py +106 -0
- repull_sdk-0.2.0/src/repull/models/list_conversation_messages_order.py +8 -0
- repull_sdk-0.2.0/src/repull/models/list_conversations_platform.py +11 -0
- repull_sdk-0.2.0/src/repull/models/list_conversations_status.py +8 -0
- repull_sdk-0.2.0/src/repull/models/list_listings_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/list_market_browse_sort.py +8 -0
- repull_sdk-0.2.0/src/repull/models/list_properties_status.py +8 -0
- repull_sdk-0.2.0/src/repull/models/list_reservations_status.py +10 -0
- repull_sdk-0.2.0/src/repull/models/list_reviews_platform.py +9 -0
- repull_sdk-0.2.0/src/repull/models/list_reviews_reviewer_role.py +9 -0
- repull_sdk-0.2.0/src/repull/models/list_reviews_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/list_webhook_deliveries_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/listing.py +223 -0
- repull_sdk-0.2.0/src/repull/models/listing_address.py +112 -0
- repull_sdk-0.2.0/src/repull/models/listing_channel.py +106 -0
- repull_sdk-0.2.0/src/repull/models/listing_comp.py +345 -0
- repull_sdk-0.2.0/src/repull/models/listing_comp_nightly.py +121 -0
- repull_sdk-0.2.0/src/repull/models/listing_comp_ratings.py +100 -0
- repull_sdk-0.2.0/src/repull/models/listing_comps_response.py +172 -0
- repull_sdk-0.2.0/src/repull/models/listing_comps_response_date_range.py +110 -0
- repull_sdk-0.2.0/src/repull/models/listing_content.py +165 -0
- repull_sdk-0.2.0/src/repull/models/listing_create_request.py +289 -0
- repull_sdk-0.2.0/src/repull/models/listing_create_request_cancellation_policy.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_create_response.py +78 -0
- repull_sdk-0.2.0/src/repull/models/listing_generate_content_request.py +115 -0
- repull_sdk-0.2.0/src/repull/models/listing_generate_content_request_style.py +9 -0
- repull_sdk-0.2.0/src/repull/models/listing_generate_content_response.py +111 -0
- repull_sdk-0.2.0/src/repull/models/listing_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_request.py +105 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_request_action.py +8 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_response.py +121 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry.py +224 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry_recommendation_factors.py +66 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry_status.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_history_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation.py +298 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation_factors.py +66 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_response.py +203 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_response_comp_summary_type_0.py +143 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_response_date_range.py +110 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_response_listing_type_0.py +192 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_response_listing_type_0_ai_base_price_factors_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy.py +349 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_comp_position_target.py +9 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_day_of_week_multipliers.py +66 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input.py +298 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_comp_position_target.py +9 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_day_of_week_multipliers.py +65 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_mode.py +8 -0
- repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_mode.py +8 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_airbnb_request.py +98 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_response.py +123 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_response_channel.py +8 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_response_result.py +66 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_status_channel.py +191 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_status_channel_push_status.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_publish_status_response.py +109 -0
- repull_sdk-0.2.0/src/repull/models/listing_quality_tier.py +130 -0
- repull_sdk-0.2.0/src/repull/models/listing_quality_tier_tier.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment.py +252 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_2_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_3_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation.py +139 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation_evidence_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation_kind.py +13 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response.py +305 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response_level.py +8 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_2_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_3_type_1.py +10 -0
- repull_sdk-0.2.0/src/repull/models/listing_segments_response_scope.py +114 -0
- repull_sdk-0.2.0/src/repull/models/listing_status.py +9 -0
- repull_sdk-0.2.0/src/repull/models/map_connect_booking_rooms_request.py +104 -0
- repull_sdk-0.2.0/src/repull/models/map_connect_booking_rooms_response.py +100 -0
- repull_sdk-0.2.0/src/repull/models/market_browse_category.py +87 -0
- repull_sdk-0.2.0/src/repull/models/market_browse_entry.py +137 -0
- repull_sdk-0.2.0/src/repull/models/market_browse_featured.py +130 -0
- repull_sdk-0.2.0/src/repull/models/market_browse_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/market_calendar_day.py +295 -0
- repull_sdk-0.2.0/src/repull/models/market_calendar_day_events_item.py +142 -0
- repull_sdk-0.2.0/src/repull/models/market_calendar_response.py +160 -0
- repull_sdk-0.2.0/src/repull/models/market_calendar_response_date_range.py +110 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response.py +401 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_bedroom_breakdown_item.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_benchmarks_item.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_capacity_gap.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_health_summary_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_market_position_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_price_distribution_item.py +151 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_property_type_mix_item.py +109 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_supply_trend_item.py +87 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_top_comps.py +153 -0
- repull_sdk-0.2.0/src/repull/models/market_detail_response_wheelhouse_trends_item.py +65 -0
- repull_sdk-0.2.0/src/repull/models/market_event.py +322 -0
- repull_sdk-0.2.0/src/repull/models/market_my_listing.py +218 -0
- repull_sdk-0.2.0/src/repull/models/market_my_listing_type.py +7 -0
- repull_sdk-0.2.0/src/repull/models/market_summary.py +275 -0
- repull_sdk-0.2.0/src/repull/models/market_top_comp.py +328 -0
- repull_sdk-0.2.0/src/repull/models/markets_overview_response.py +256 -0
- repull_sdk-0.2.0/src/repull/models/markets_overview_response_browse.py +140 -0
- repull_sdk-0.2.0/src/repull/models/markets_overview_response_subscriptions.py +88 -0
- repull_sdk-0.2.0/src/repull/models/markets_overview_response_totals.py +96 -0
- repull_sdk-0.2.0/src/repull/models/message.py +349 -0
- repull_sdk-0.2.0/src/repull/models/message_direction.py +8 -0
- repull_sdk-0.2.0/src/repull/models/message_list_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/pagination.py +107 -0
- repull_sdk-0.2.0/src/repull/models/plumguide_listing.py +110 -0
- repull_sdk-0.2.0/src/repull/models/plumguide_listing_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/property_.py +196 -0
- repull_sdk-0.2.0/src/repull/models/property_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/reservation.py +269 -0
- repull_sdk-0.2.0/src/repull/models/reservation_guest_details.py +67 -0
- repull_sdk-0.2.0/src/repull/models/reservation_list_response.py +127 -0
- repull_sdk-0.2.0/src/repull/models/reservation_platform_type_1.py +13 -0
- repull_sdk-0.2.0/src/repull/models/reservation_platform_type_2_type_1.py +13 -0
- repull_sdk-0.2.0/src/repull/models/reservation_platform_type_3_type_1.py +13 -0
- repull_sdk-0.2.0/src/repull/models/reservation_status.py +10 -0
- repull_sdk-0.2.0/src/repull/models/review.py +544 -0
- repull_sdk-0.2.0/src/repull/models/review_category.py +123 -0
- repull_sdk-0.2.0/src/repull/models/review_list_response.py +125 -0
- repull_sdk-0.2.0/src/repull/models/review_platform.py +9 -0
- repull_sdk-0.2.0/src/repull/models/review_response.py +115 -0
- repull_sdk-0.2.0/src/repull/models/review_reviewer_role.py +8 -0
- repull_sdk-0.2.0/src/repull/models/rotate_webhook_secret_response_200.py +109 -0
- repull_sdk-0.2.0/src/repull/models/select_connect_provider_body.py +76 -0
- repull_sdk-0.2.0/src/repull/models/select_provider_response.py +120 -0
- repull_sdk-0.2.0/src/repull/models/select_provider_response_pattern.py +10 -0
- repull_sdk-0.2.0/src/repull/models/test_webhook_body.py +96 -0
- repull_sdk-0.2.0/src/repull/models/update_availability_body.py +100 -0
- repull_sdk-0.2.0/src/repull/models/update_listing_pricing_strategy_response_200.py +78 -0
- repull_sdk-0.2.0/src/repull/models/update_reservation_body.py +128 -0
- repull_sdk-0.2.0/src/repull/models/update_webhook_body.py +135 -0
- repull_sdk-0.2.0/src/repull/models/update_webhook_body_status.py +8 -0
- repull_sdk-0.2.0/src/repull/models/vrbo_listing.py +110 -0
- repull_sdk-0.2.0/src/repull/models/vrbo_listing_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/vrbo_reservation.py +150 -0
- repull_sdk-0.2.0/src/repull/models/vrbo_reservation_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery.py +286 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail.py +315 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_payload.py +65 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_request_headers_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_response_headers_type_0.py +65 -0
- repull_sdk-0.2.0/src/repull/models/webhook_delivery_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/webhook_event_catalog.py +100 -0
- repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item.py +118 -0
- repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item_events_item.py +129 -0
- repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item_events_item_sample_payload.py +65 -0
- repull_sdk-0.2.0/src/repull/models/webhook_list_response.py +124 -0
- repull_sdk-0.2.0/src/repull/models/webhook_subscription.py +411 -0
- repull_sdk-0.2.0/src/repull/models/webhook_subscription_status.py +9 -0
- repull_sdk-0.2.0/src/repull/types.py +53 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib64/
|
|
14
|
+
parts/
|
|
15
|
+
sdist/
|
|
16
|
+
var/
|
|
17
|
+
wheels/
|
|
18
|
+
*.egg-info/
|
|
19
|
+
.installed.cfg
|
|
20
|
+
*.egg
|
|
21
|
+
|
|
22
|
+
# Virtualenvs
|
|
23
|
+
.venv/
|
|
24
|
+
venv/
|
|
25
|
+
env/
|
|
26
|
+
.python-version
|
|
27
|
+
|
|
28
|
+
# Tooling caches
|
|
29
|
+
.mypy_cache/
|
|
30
|
+
.ruff_cache/
|
|
31
|
+
.pytest_cache/
|
|
32
|
+
.coverage
|
|
33
|
+
htmlcov/
|
|
34
|
+
|
|
35
|
+
# Editor
|
|
36
|
+
.vscode/
|
|
37
|
+
.idea/
|
|
38
|
+
*.swp
|
|
39
|
+
|
|
40
|
+
# Local env
|
|
41
|
+
.env
|
|
42
|
+
.env.local
|
repull_sdk-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Divanova Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: repull-sdk
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Python SDK for Repull — build vacation-rental tech in Python.
|
|
5
|
+
Project-URL: Homepage, https://repull.dev
|
|
6
|
+
Project-URL: Documentation, https://repull.dev/docs
|
|
7
|
+
Project-URL: API Reference, https://api.repull.dev/openapi.json
|
|
8
|
+
Project-URL: Source, https://github.com/ivannikolovbg/repull-python
|
|
9
|
+
Project-URL: Issues, https://github.com/ivannikolovbg/repull-python/issues
|
|
10
|
+
Author-email: "Divanova Inc." <hello@repull.dev>
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: airbnb,booking.com,channel-manager,openapi,repull,sdk,vacation-rental,vrbo
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Requires-Dist: attrs>=22.2.0
|
|
26
|
+
Requires-Dist: httpx<1,>=0.23.0
|
|
27
|
+
Requires-Dist: python-dateutil<3,>=2.8.0
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
30
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
32
|
+
Requires-Dist: respx>=0.21; extra == 'dev'
|
|
33
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
34
|
+
Requires-Dist: types-python-dateutil>=2.9; extra == 'dev'
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# Repull Python SDK
|
|
38
|
+
|
|
39
|
+
> **Status:** v0.2.0 — beta. API surface stable; minor renames possible before 1.0.
|
|
40
|
+
|
|
41
|
+
Typed Python client for [api.repull.dev](https://api.repull.dev) — the unified API for vacation-rental tech (50+ PMS platforms, Airbnb / Booking.com / VRBO / Plumguide channels, AI ops, white-label OAuth Connect).
|
|
42
|
+
|
|
43
|
+
Async by default. Generated from OpenAPI. Fully typed (`attrs` + `httpx`).
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
The PyPI package name `repull` is reserved but not yet published. For now, install from git:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pip install git+https://github.com/ivannikolovbg/repull-python.git
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Once published:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install repull
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Requires Python 3.10+.
|
|
60
|
+
|
|
61
|
+
## Quick start
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
import asyncio
|
|
65
|
+
import os
|
|
66
|
+
|
|
67
|
+
from repull import AuthenticatedClient
|
|
68
|
+
from repull.api.reservations import list_reservations
|
|
69
|
+
|
|
70
|
+
async def main():
|
|
71
|
+
client = AuthenticatedClient(
|
|
72
|
+
base_url="https://api.repull.dev",
|
|
73
|
+
token=os.environ["REPULL_API_KEY"],
|
|
74
|
+
)
|
|
75
|
+
async with client as c:
|
|
76
|
+
page = await list_reservations.asyncio(client=c, limit=10)
|
|
77
|
+
|
|
78
|
+
for r in page.data:
|
|
79
|
+
print(r.id, r.check_in, r.check_out, r.platform)
|
|
80
|
+
|
|
81
|
+
asyncio.run(main())
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
There is also a sync flavour for every endpoint — drop the `async with` and call `list_reservations.sync(...)` instead.
|
|
85
|
+
|
|
86
|
+
## Authentication
|
|
87
|
+
|
|
88
|
+
Every call goes through `AuthenticatedClient(token=...)`. The token is your Repull API key:
|
|
89
|
+
|
|
90
|
+
- `sk_test_*` — sandbox
|
|
91
|
+
- `sk_live_*` — production
|
|
92
|
+
|
|
93
|
+
Get one at [repull.dev/dashboard](https://repull.dev/dashboard) → **API keys**.
|
|
94
|
+
|
|
95
|
+
## What's in the SDK
|
|
96
|
+
|
|
97
|
+
The client is generated tag-by-tag from the OpenAPI spec. The modules mirror the API surface:
|
|
98
|
+
|
|
99
|
+
| Module | Endpoints |
|
|
100
|
+
|---|---|
|
|
101
|
+
| `repull.api.system` | `GET /v1/health` |
|
|
102
|
+
| `repull.api.properties` | list / get properties |
|
|
103
|
+
| `repull.api.reservations` | list / get / create / patch / delete reservations |
|
|
104
|
+
| `repull.api.availability` | per-property calendar read + bulk write |
|
|
105
|
+
| `repull.api.guests` | guest CRM list + detail |
|
|
106
|
+
| `repull.api.conversations` | list threads, read & post messages |
|
|
107
|
+
| `repull.api.connect` | white-label OAuth Connect — list, status, create, disconnect |
|
|
108
|
+
| `repull.api.webhooks` | manage subscriptions + fire test events |
|
|
109
|
+
| `repull.api.airbnb` | listings, pricing, availability, photos, messaging, reservations, reviews, sync |
|
|
110
|
+
| `repull.api.booking_com` | properties, availability, content, messaging, sync |
|
|
111
|
+
| `repull.api.vrbo` | listings, reservations |
|
|
112
|
+
| `repull.api.plumguide` | listings, availability, pricing |
|
|
113
|
+
| `repull.api.ai` | run AI operations (autorespond, smart pricing, etc.) |
|
|
114
|
+
| `repull.api.billing` | view & change plan |
|
|
115
|
+
|
|
116
|
+
Everything is fully typed — your editor will autocomplete every parameter and every response field.
|
|
117
|
+
|
|
118
|
+
## Examples
|
|
119
|
+
|
|
120
|
+
- [`examples/quickstart.py`](examples/quickstart.py) — list 10 reservations.
|
|
121
|
+
- [`examples/connect_airbnb.py`](examples/connect_airbnb.py) — mint a Connect session and poll for the linked Airbnb account.
|
|
122
|
+
|
|
123
|
+
Run them with a real API key:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
REPULL_API_KEY=sk_live_... python examples/quickstart.py
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Connect (OAuth)
|
|
130
|
+
|
|
131
|
+
Repull Connect lets you link a property manager's Airbnb / Booking.com account in a few lines:
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
from repull.api.connect import create_connect_session
|
|
135
|
+
from repull.models.create_connect_session_body import CreateConnectSessionBody
|
|
136
|
+
|
|
137
|
+
session = await create_connect_session.asyncio(
|
|
138
|
+
client=c,
|
|
139
|
+
body=CreateConnectSessionBody(
|
|
140
|
+
redirect_url="https://yourapp.example.com/airbnb/return",
|
|
141
|
+
allowed_providers=["airbnb"],
|
|
142
|
+
),
|
|
143
|
+
)
|
|
144
|
+
# Send the user to session.url
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
After the user comes back, poll `get_connect_status.asyncio(provider="airbnb", client=c)` to confirm.
|
|
148
|
+
|
|
149
|
+
## Pagination
|
|
150
|
+
|
|
151
|
+
Every list endpoint returns the same canonical envelope:
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
page = await list_reservations.asyncio(client=c, limit=50)
|
|
155
|
+
page.data # list[Reservation]
|
|
156
|
+
page.pagination.next_cursor # str | None — pass back as `cursor=`
|
|
157
|
+
page.pagination.has_more # bool — stop when False
|
|
158
|
+
page.pagination.total # int | UNSET — present when ?include_total=true
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Loop until `pagination.has_more` is `False`, threading `pagination.next_cursor`
|
|
162
|
+
back as the next call's `cursor` arg. Cursors are opaque base64 — never parse
|
|
163
|
+
or construct them by hand.
|
|
164
|
+
|
|
165
|
+
## Error handling
|
|
166
|
+
|
|
167
|
+
By default, unexpected HTTP statuses return `None` from the high-level `.asyncio()` / `.sync()` calls. To raise instead:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
client = AuthenticatedClient(
|
|
171
|
+
base_url="https://api.repull.dev",
|
|
172
|
+
token=os.environ["REPULL_API_KEY"],
|
|
173
|
+
raise_on_unexpected_status=True,
|
|
174
|
+
)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
You can also call `.asyncio_detailed()` / `.sync_detailed()` to get the full `Response` (status code, headers, raw bytes, parsed body).
|
|
178
|
+
|
|
179
|
+
## Regenerating the client
|
|
180
|
+
|
|
181
|
+
The repo snapshots the current spec at [`openapi/v1.json`](openapi/v1.json) so codegen is fully reproducible.
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Pull a fresh spec from api.repull.dev and regenerate
|
|
185
|
+
./scripts/regen.sh
|
|
186
|
+
|
|
187
|
+
# Use the snapshot in openapi/v1.json without hitting the network
|
|
188
|
+
./scripts/regen.sh --offline
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
You'll need [`openapi-python-client`](https://github.com/openapi-generators/openapi-python-client) on your `PATH`:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
uv tool install openapi-python-client
|
|
195
|
+
# or
|
|
196
|
+
pipx install openapi-python-client
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Reference
|
|
200
|
+
|
|
201
|
+
- API base: <https://api.repull.dev>
|
|
202
|
+
- OpenAPI spec: <https://api.repull.dev/openapi.json>
|
|
203
|
+
- Product docs: <https://repull.dev/docs>
|
|
204
|
+
- Other SDKs: [`repull-sdk`](https://github.com/ivannikolovbg/repull-sdk) (TypeScript), `repull-php`, `repull-go`, `repull-ruby`, `repull-dotnet`
|
|
205
|
+
|
|
206
|
+
## License
|
|
207
|
+
|
|
208
|
+
MIT — see [`LICENSE`](LICENSE). The Python client is a thin auto-generated wrapper, free to use anywhere.
|
|
209
|
+
|
|
210
|
+
(Note: the TypeScript SDK is licensed differently because it ships a hand-written facade plus the demo + channel-manager template. See [`repull-sdk`](https://github.com/ivannikolovbg/repull-sdk) if you need that.)
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
Powered by [Repull](https://repull.dev). AI features powered by [Vanio AI](https://vanio.ai).
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Repull Python SDK
|
|
2
|
+
|
|
3
|
+
> **Status:** v0.2.0 — beta. API surface stable; minor renames possible before 1.0.
|
|
4
|
+
|
|
5
|
+
Typed Python client for [api.repull.dev](https://api.repull.dev) — the unified API for vacation-rental tech (50+ PMS platforms, Airbnb / Booking.com / VRBO / Plumguide channels, AI ops, white-label OAuth Connect).
|
|
6
|
+
|
|
7
|
+
Async by default. Generated from OpenAPI. Fully typed (`attrs` + `httpx`).
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
The PyPI package name `repull` is reserved but not yet published. For now, install from git:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pip install git+https://github.com/ivannikolovbg/repull-python.git
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Once published:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install repull
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Requires Python 3.10+.
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
import asyncio
|
|
29
|
+
import os
|
|
30
|
+
|
|
31
|
+
from repull import AuthenticatedClient
|
|
32
|
+
from repull.api.reservations import list_reservations
|
|
33
|
+
|
|
34
|
+
async def main():
|
|
35
|
+
client = AuthenticatedClient(
|
|
36
|
+
base_url="https://api.repull.dev",
|
|
37
|
+
token=os.environ["REPULL_API_KEY"],
|
|
38
|
+
)
|
|
39
|
+
async with client as c:
|
|
40
|
+
page = await list_reservations.asyncio(client=c, limit=10)
|
|
41
|
+
|
|
42
|
+
for r in page.data:
|
|
43
|
+
print(r.id, r.check_in, r.check_out, r.platform)
|
|
44
|
+
|
|
45
|
+
asyncio.run(main())
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
There is also a sync flavour for every endpoint — drop the `async with` and call `list_reservations.sync(...)` instead.
|
|
49
|
+
|
|
50
|
+
## Authentication
|
|
51
|
+
|
|
52
|
+
Every call goes through `AuthenticatedClient(token=...)`. The token is your Repull API key:
|
|
53
|
+
|
|
54
|
+
- `sk_test_*` — sandbox
|
|
55
|
+
- `sk_live_*` — production
|
|
56
|
+
|
|
57
|
+
Get one at [repull.dev/dashboard](https://repull.dev/dashboard) → **API keys**.
|
|
58
|
+
|
|
59
|
+
## What's in the SDK
|
|
60
|
+
|
|
61
|
+
The client is generated tag-by-tag from the OpenAPI spec. The modules mirror the API surface:
|
|
62
|
+
|
|
63
|
+
| Module | Endpoints |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `repull.api.system` | `GET /v1/health` |
|
|
66
|
+
| `repull.api.properties` | list / get properties |
|
|
67
|
+
| `repull.api.reservations` | list / get / create / patch / delete reservations |
|
|
68
|
+
| `repull.api.availability` | per-property calendar read + bulk write |
|
|
69
|
+
| `repull.api.guests` | guest CRM list + detail |
|
|
70
|
+
| `repull.api.conversations` | list threads, read & post messages |
|
|
71
|
+
| `repull.api.connect` | white-label OAuth Connect — list, status, create, disconnect |
|
|
72
|
+
| `repull.api.webhooks` | manage subscriptions + fire test events |
|
|
73
|
+
| `repull.api.airbnb` | listings, pricing, availability, photos, messaging, reservations, reviews, sync |
|
|
74
|
+
| `repull.api.booking_com` | properties, availability, content, messaging, sync |
|
|
75
|
+
| `repull.api.vrbo` | listings, reservations |
|
|
76
|
+
| `repull.api.plumguide` | listings, availability, pricing |
|
|
77
|
+
| `repull.api.ai` | run AI operations (autorespond, smart pricing, etc.) |
|
|
78
|
+
| `repull.api.billing` | view & change plan |
|
|
79
|
+
|
|
80
|
+
Everything is fully typed — your editor will autocomplete every parameter and every response field.
|
|
81
|
+
|
|
82
|
+
## Examples
|
|
83
|
+
|
|
84
|
+
- [`examples/quickstart.py`](examples/quickstart.py) — list 10 reservations.
|
|
85
|
+
- [`examples/connect_airbnb.py`](examples/connect_airbnb.py) — mint a Connect session and poll for the linked Airbnb account.
|
|
86
|
+
|
|
87
|
+
Run them with a real API key:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
REPULL_API_KEY=sk_live_... python examples/quickstart.py
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Connect (OAuth)
|
|
94
|
+
|
|
95
|
+
Repull Connect lets you link a property manager's Airbnb / Booking.com account in a few lines:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
from repull.api.connect import create_connect_session
|
|
99
|
+
from repull.models.create_connect_session_body import CreateConnectSessionBody
|
|
100
|
+
|
|
101
|
+
session = await create_connect_session.asyncio(
|
|
102
|
+
client=c,
|
|
103
|
+
body=CreateConnectSessionBody(
|
|
104
|
+
redirect_url="https://yourapp.example.com/airbnb/return",
|
|
105
|
+
allowed_providers=["airbnb"],
|
|
106
|
+
),
|
|
107
|
+
)
|
|
108
|
+
# Send the user to session.url
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
After the user comes back, poll `get_connect_status.asyncio(provider="airbnb", client=c)` to confirm.
|
|
112
|
+
|
|
113
|
+
## Pagination
|
|
114
|
+
|
|
115
|
+
Every list endpoint returns the same canonical envelope:
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
page = await list_reservations.asyncio(client=c, limit=50)
|
|
119
|
+
page.data # list[Reservation]
|
|
120
|
+
page.pagination.next_cursor # str | None — pass back as `cursor=`
|
|
121
|
+
page.pagination.has_more # bool — stop when False
|
|
122
|
+
page.pagination.total # int | UNSET — present when ?include_total=true
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Loop until `pagination.has_more` is `False`, threading `pagination.next_cursor`
|
|
126
|
+
back as the next call's `cursor` arg. Cursors are opaque base64 — never parse
|
|
127
|
+
or construct them by hand.
|
|
128
|
+
|
|
129
|
+
## Error handling
|
|
130
|
+
|
|
131
|
+
By default, unexpected HTTP statuses return `None` from the high-level `.asyncio()` / `.sync()` calls. To raise instead:
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
client = AuthenticatedClient(
|
|
135
|
+
base_url="https://api.repull.dev",
|
|
136
|
+
token=os.environ["REPULL_API_KEY"],
|
|
137
|
+
raise_on_unexpected_status=True,
|
|
138
|
+
)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
You can also call `.asyncio_detailed()` / `.sync_detailed()` to get the full `Response` (status code, headers, raw bytes, parsed body).
|
|
142
|
+
|
|
143
|
+
## Regenerating the client
|
|
144
|
+
|
|
145
|
+
The repo snapshots the current spec at [`openapi/v1.json`](openapi/v1.json) so codegen is fully reproducible.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Pull a fresh spec from api.repull.dev and regenerate
|
|
149
|
+
./scripts/regen.sh
|
|
150
|
+
|
|
151
|
+
# Use the snapshot in openapi/v1.json without hitting the network
|
|
152
|
+
./scripts/regen.sh --offline
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
You'll need [`openapi-python-client`](https://github.com/openapi-generators/openapi-python-client) on your `PATH`:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
uv tool install openapi-python-client
|
|
159
|
+
# or
|
|
160
|
+
pipx install openapi-python-client
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Reference
|
|
164
|
+
|
|
165
|
+
- API base: <https://api.repull.dev>
|
|
166
|
+
- OpenAPI spec: <https://api.repull.dev/openapi.json>
|
|
167
|
+
- Product docs: <https://repull.dev/docs>
|
|
168
|
+
- Other SDKs: [`repull-sdk`](https://github.com/ivannikolovbg/repull-sdk) (TypeScript), `repull-php`, `repull-go`, `repull-ruby`, `repull-dotnet`
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
MIT — see [`LICENSE`](LICENSE). The Python client is a thin auto-generated wrapper, free to use anywhere.
|
|
173
|
+
|
|
174
|
+
(Note: the TypeScript SDK is licensed differently because it ships a hand-written facade plus the demo + channel-manager template. See [`repull-sdk`](https://github.com/ivannikolovbg/repull-sdk) if you need that.)
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
Powered by [Repull](https://repull.dev). AI features powered by [Vanio AI](https://vanio.ai).
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Mint a Repull Connect session for Airbnb and poll for the linked account.
|
|
2
|
+
|
|
3
|
+
Flow:
|
|
4
|
+
1. Create a Connect session — Repull returns a hosted `url` you redirect the
|
|
5
|
+
property manager to.
|
|
6
|
+
2. They land on `connect.repull.dev`, authorise Airbnb, and bounce back to
|
|
7
|
+
your `redirect_url`.
|
|
8
|
+
3. Poll the connection status to confirm linkage.
|
|
9
|
+
|
|
10
|
+
Run with:
|
|
11
|
+
REPULL_API_KEY=sk_live_... python examples/connect_airbnb.py
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import os
|
|
16
|
+
|
|
17
|
+
from repull import AuthenticatedClient
|
|
18
|
+
from repull.api.connect import create_connect_session, get_connect_status
|
|
19
|
+
from repull.models.create_connect_session_body import CreateConnectSessionBody
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def main() -> None:
|
|
23
|
+
client = AuthenticatedClient(
|
|
24
|
+
base_url="https://api.repull.dev",
|
|
25
|
+
token=os.environ["REPULL_API_KEY"],
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
body = CreateConnectSessionBody(
|
|
29
|
+
redirect_url="https://yourapp.example.com/airbnb/return",
|
|
30
|
+
allowed_providers=["airbnb"],
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
async with client as c:
|
|
34
|
+
session = await create_connect_session.asyncio(client=c, body=body)
|
|
35
|
+
print("Send the property manager to:")
|
|
36
|
+
print(f" {session.url}")
|
|
37
|
+
print(f" session_id={session.session_id} expires_at={session.expires_at}")
|
|
38
|
+
|
|
39
|
+
status = await get_connect_status.asyncio(provider="airbnb", client=c)
|
|
40
|
+
print(f"Current Airbnb connection status: {status.status}")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
if __name__ == "__main__":
|
|
44
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Repull quick start: list your most recent reservations.
|
|
2
|
+
|
|
3
|
+
Run with:
|
|
4
|
+
REPULL_API_KEY=sk_live_... python examples/quickstart.py
|
|
5
|
+
"""
|
|
6
|
+
import asyncio
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from repull import AuthenticatedClient
|
|
10
|
+
from repull.api.reservations import list_reservations
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def main() -> None:
|
|
14
|
+
client = AuthenticatedClient(
|
|
15
|
+
base_url="https://api.repull.dev",
|
|
16
|
+
token=os.environ["REPULL_API_KEY"],
|
|
17
|
+
)
|
|
18
|
+
async with client as c:
|
|
19
|
+
page = await list_reservations.asyncio(client=c, limit=10)
|
|
20
|
+
|
|
21
|
+
if page is None:
|
|
22
|
+
print("No reservations returned (check your API key).")
|
|
23
|
+
return
|
|
24
|
+
|
|
25
|
+
rows = list(page.data) if page.data else []
|
|
26
|
+
if not rows:
|
|
27
|
+
print("Page returned no rows.")
|
|
28
|
+
return
|
|
29
|
+
|
|
30
|
+
print(f"{'id':10s} {'check_in':12s} -> {'check_out':12s} {'platform':14s} {'status'}")
|
|
31
|
+
for r in rows:
|
|
32
|
+
# Wire fields are camelCase; the SDK exposes them as snake_case Python
|
|
33
|
+
# attributes. Anything not in the canonical schema lives on
|
|
34
|
+
# additional_properties (raw camelCase keys).
|
|
35
|
+
d = r.additional_properties
|
|
36
|
+
print(
|
|
37
|
+
f"{str(r.id):10s} {str(r.check_in):12s} -> {str(r.check_out):12s} "
|
|
38
|
+
f"{str(r.platform):14s} {d.get('status', '?')}"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
asyncio.run(main())
|