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.
Files changed (379) hide show
  1. repull_sdk-0.2.0/.gitignore +42 -0
  2. repull_sdk-0.2.0/LICENSE +21 -0
  3. repull_sdk-0.2.0/PKG-INFO +214 -0
  4. repull_sdk-0.2.0/README.md +178 -0
  5. repull_sdk-0.2.0/examples/connect_airbnb.py +44 -0
  6. repull_sdk-0.2.0/examples/quickstart.py +43 -0
  7. repull_sdk-0.2.0/openapi/v1.json +1 -0
  8. repull_sdk-0.2.0/pyproject.toml +100 -0
  9. repull_sdk-0.2.0/src/repull/__init__.py +8 -0
  10. repull_sdk-0.2.0/src/repull/api/__init__.py +1 -0
  11. repull_sdk-0.2.0/src/repull/api/ai/__init__.py +1 -0
  12. repull_sdk-0.2.0/src/repull/api/ai/create_ai_operation.py +218 -0
  13. repull_sdk-0.2.0/src/repull/api/airbnb/__init__.py +1 -0
  14. repull_sdk-0.2.0/src/repull/api/airbnb/airbnb_listing_action.py +123 -0
  15. repull_sdk-0.2.0/src/repull/api/airbnb/airbnb_reservation_action.py +121 -0
  16. repull_sdk-0.2.0/src/repull/api/airbnb/create_airbnb_listing.py +162 -0
  17. repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing.py +183 -0
  18. repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing_availability.py +121 -0
  19. repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_listing_pricing.py +121 -0
  20. repull_sdk-0.2.0/src/repull/api/airbnb/get_airbnb_reservation.py +179 -0
  21. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_listing_photos.py +121 -0
  22. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_listings.py +166 -0
  23. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_reservations.py +166 -0
  24. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_reviews.py +162 -0
  25. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_thread_messages.py +183 -0
  26. repull_sdk-0.2.0/src/repull/api/airbnb/list_airbnb_threads.py +162 -0
  27. repull_sdk-0.2.0/src/repull/api/airbnb/respond_airbnb_review.py +110 -0
  28. repull_sdk-0.2.0/src/repull/api/airbnb/send_airbnb_message.py +123 -0
  29. repull_sdk-0.2.0/src/repull/api/airbnb/sync_airbnb.py +108 -0
  30. repull_sdk-0.2.0/src/repull/api/airbnb/update_airbnb_listing_availability.py +121 -0
  31. repull_sdk-0.2.0/src/repull/api/airbnb/update_airbnb_listing_pricing.py +121 -0
  32. repull_sdk-0.2.0/src/repull/api/airbnb/upload_airbnb_listing_photos.py +121 -0
  33. repull_sdk-0.2.0/src/repull/api/atlas/__init__.py +1 -0
  34. repull_sdk-0.2.0/src/repull/api/atlas/get_listing_segments.py +282 -0
  35. repull_sdk-0.2.0/src/repull/api/atlas/list_listing_comps.py +307 -0
  36. repull_sdk-0.2.0/src/repull/api/availability/__init__.py +1 -0
  37. repull_sdk-0.2.0/src/repull/api/availability/get_availability.py +219 -0
  38. repull_sdk-0.2.0/src/repull/api/availability/update_availability.py +138 -0
  39. repull_sdk-0.2.0/src/repull/api/billing/__init__.py +1 -0
  40. repull_sdk-0.2.0/src/repull/api/billing/create_billing_checkout.py +131 -0
  41. repull_sdk-0.2.0/src/repull/api/billing/get_billing.py +110 -0
  42. repull_sdk-0.2.0/src/repull/api/booking_com/__init__.py +1 -0
  43. repull_sdk-0.2.0/src/repull/api/booking_com/create_booking_property.py +162 -0
  44. repull_sdk-0.2.0/src/repull/api/booking_com/get_booking_content.py +110 -0
  45. repull_sdk-0.2.0/src/repull/api/booking_com/get_booking_listing_pricing.py +304 -0
  46. repull_sdk-0.2.0/src/repull/api/booking_com/list_booking_conversations.py +158 -0
  47. repull_sdk-0.2.0/src/repull/api/booking_com/list_booking_properties.py +162 -0
  48. repull_sdk-0.2.0/src/repull/api/booking_com/send_booking_message.py +110 -0
  49. repull_sdk-0.2.0/src/repull/api/booking_com/sync_booking.py +110 -0
  50. repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_availability.py +110 -0
  51. repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_content.py +110 -0
  52. repull_sdk-0.2.0/src/repull/api/booking_com/update_booking_listing_pricing.py +245 -0
  53. repull_sdk-0.2.0/src/repull/api/connect/__init__.py +1 -0
  54. repull_sdk-0.2.0/src/repull/api/connect/create_connect_session.py +207 -0
  55. repull_sdk-0.2.0/src/repull/api/connect/create_connection.py +227 -0
  56. repull_sdk-0.2.0/src/repull/api/connect/delete_connection.py +123 -0
  57. repull_sdk-0.2.0/src/repull/api/connect/get_connect_status.py +183 -0
  58. repull_sdk-0.2.0/src/repull/api/connect/list_connect_booking_rooms.py +239 -0
  59. repull_sdk-0.2.0/src/repull/api/connect/list_connect_providers.py +162 -0
  60. repull_sdk-0.2.0/src/repull/api/connect/list_connections.py +158 -0
  61. repull_sdk-0.2.0/src/repull/api/connect/map_connect_booking_rooms.py +270 -0
  62. repull_sdk-0.2.0/src/repull/api/connect/select_connect_provider.py +220 -0
  63. repull_sdk-0.2.0/src/repull/api/connect/verify_booking_hotel.py +277 -0
  64. repull_sdk-0.2.0/src/repull/api/conversations/__init__.py +1 -0
  65. repull_sdk-0.2.0/src/repull/api/conversations/get_conversation.py +236 -0
  66. repull_sdk-0.2.0/src/repull/api/conversations/list_conversation_messages.py +302 -0
  67. repull_sdk-0.2.0/src/repull/api/conversations/list_conversations.py +310 -0
  68. repull_sdk-0.2.0/src/repull/api/guests/__init__.py +1 -0
  69. repull_sdk-0.2.0/src/repull/api/guests/get_guest.py +236 -0
  70. repull_sdk-0.2.0/src/repull/api/guests/list_guests.py +315 -0
  71. repull_sdk-0.2.0/src/repull/api/listings/__init__.py +1 -0
  72. repull_sdk-0.2.0/src/repull/api/listings/create_listing.py +207 -0
  73. repull_sdk-0.2.0/src/repull/api/listings/generate_listing_content.py +223 -0
  74. repull_sdk-0.2.0/src/repull/api/listings/get_listing.py +229 -0
  75. repull_sdk-0.2.0/src/repull/api/listings/get_listing_publish_status.py +183 -0
  76. repull_sdk-0.2.0/src/repull/api/listings/list_listings.py +294 -0
  77. repull_sdk-0.2.0/src/repull/api/listings/publish_listing_to_airbnb.py +219 -0
  78. repull_sdk-0.2.0/src/repull/api/listings/publish_listing_to_booking.py +191 -0
  79. repull_sdk-0.2.0/src/repull/api/markets/__init__.py +1 -0
  80. repull_sdk-0.2.0/src/repull/api/markets/get_market.py +221 -0
  81. repull_sdk-0.2.0/src/repull/api/markets/get_market_calendar.py +259 -0
  82. repull_sdk-0.2.0/src/repull/api/markets/list_market_browse.py +315 -0
  83. repull_sdk-0.2.0/src/repull/api/markets/list_markets.py +186 -0
  84. repull_sdk-0.2.0/src/repull/api/plumguide/__init__.py +1 -0
  85. repull_sdk-0.2.0/src/repull/api/plumguide/get_plumguide_availability.py +110 -0
  86. repull_sdk-0.2.0/src/repull/api/plumguide/get_plumguide_pricing.py +108 -0
  87. repull_sdk-0.2.0/src/repull/api/plumguide/list_plumguide_listings.py +162 -0
  88. repull_sdk-0.2.0/src/repull/api/plumguide/update_plumguide_availability.py +110 -0
  89. repull_sdk-0.2.0/src/repull/api/plumguide/update_plumguide_pricing.py +110 -0
  90. repull_sdk-0.2.0/src/repull/api/pricing/__init__.py +1 -0
  91. repull_sdk-0.2.0/src/repull/api/pricing/apply_listing_pricing.py +216 -0
  92. repull_sdk-0.2.0/src/repull/api/pricing/bulk_apply_pricing.py +272 -0
  93. repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing.py +255 -0
  94. repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing_history.py +310 -0
  95. repull_sdk-0.2.0/src/repull/api/pricing/get_listing_pricing_strategy.py +191 -0
  96. repull_sdk-0.2.0/src/repull/api/pricing/update_listing_pricing_strategy.py +208 -0
  97. repull_sdk-0.2.0/src/repull/api/properties/__init__.py +1 -0
  98. repull_sdk-0.2.0/src/repull/api/properties/get_property.py +191 -0
  99. repull_sdk-0.2.0/src/repull/api/properties/list_properties.py +273 -0
  100. repull_sdk-0.2.0/src/repull/api/reservations/__init__.py +1 -0
  101. repull_sdk-0.2.0/src/repull/api/reservations/cancel_reservation.py +123 -0
  102. repull_sdk-0.2.0/src/repull/api/reservations/create_reservation.py +195 -0
  103. repull_sdk-0.2.0/src/repull/api/reservations/get_reservation.py +240 -0
  104. repull_sdk-0.2.0/src/repull/api/reservations/list_reservations.py +400 -0
  105. repull_sdk-0.2.0/src/repull/api/reservations/update_reservation.py +142 -0
  106. repull_sdk-0.2.0/src/repull/api/reviews/__init__.py +1 -0
  107. repull_sdk-0.2.0/src/repull/api/reviews/get_review.py +236 -0
  108. repull_sdk-0.2.0/src/repull/api/reviews/list_reviews.py +379 -0
  109. repull_sdk-0.2.0/src/repull/api/schema/__init__.py +1 -0
  110. repull_sdk-0.2.0/src/repull/api/schema/create_custom_schema.py +252 -0
  111. repull_sdk-0.2.0/src/repull/api/schema/delete_custom_schema.py +206 -0
  112. repull_sdk-0.2.0/src/repull/api/schema/get_custom_schema.py +206 -0
  113. repull_sdk-0.2.0/src/repull/api/schema/list_custom_schemas.py +173 -0
  114. repull_sdk-0.2.0/src/repull/api/schema/update_custom_schema.py +253 -0
  115. repull_sdk-0.2.0/src/repull/api/system/__init__.py +1 -0
  116. repull_sdk-0.2.0/src/repull/api/system/get_health.py +162 -0
  117. repull_sdk-0.2.0/src/repull/api/vrbo/__init__.py +1 -0
  118. repull_sdk-0.2.0/src/repull/api/vrbo/get_vrbo_listing_pricing.py +221 -0
  119. repull_sdk-0.2.0/src/repull/api/vrbo/list_vrbo_listings.py +162 -0
  120. repull_sdk-0.2.0/src/repull/api/vrbo/list_vrbo_reservations.py +162 -0
  121. repull_sdk-0.2.0/src/repull/api/vrbo/update_vrbo_listing_pricing.py +205 -0
  122. repull_sdk-0.2.0/src/repull/api/webhooks/__init__.py +1 -0
  123. repull_sdk-0.2.0/src/repull/api/webhooks/create_webhook.py +199 -0
  124. repull_sdk-0.2.0/src/repull/api/webhooks/delete_webhook.py +122 -0
  125. repull_sdk-0.2.0/src/repull/api/webhooks/get_webhook.py +184 -0
  126. repull_sdk-0.2.0/src/repull/api/webhooks/get_webhook_delivery.py +193 -0
  127. repull_sdk-0.2.0/src/repull/api/webhooks/list_webhook_deliveries.py +249 -0
  128. repull_sdk-0.2.0/src/repull/api/webhooks/list_webhook_event_types.py +162 -0
  129. repull_sdk-0.2.0/src/repull/api/webhooks/list_webhooks.py +162 -0
  130. repull_sdk-0.2.0/src/repull/api/webhooks/ping_webhook.py +122 -0
  131. repull_sdk-0.2.0/src/repull/api/webhooks/replay_webhook_delivery.py +127 -0
  132. repull_sdk-0.2.0/src/repull/api/webhooks/rotate_webhook_secret.py +184 -0
  133. repull_sdk-0.2.0/src/repull/api/webhooks/test_fire_webhook.py +127 -0
  134. repull_sdk-0.2.0/src/repull/api/webhooks/test_webhook.py +133 -0
  135. repull_sdk-0.2.0/src/repull/api/webhooks/update_webhook.py +208 -0
  136. repull_sdk-0.2.0/src/repull/client.py +271 -0
  137. repull_sdk-0.2.0/src/repull/errors.py +14 -0
  138. repull_sdk-0.2.0/src/repull/models/__init__.py +485 -0
  139. repull_sdk-0.2.0/src/repull/models/ai_operation.py +114 -0
  140. repull_sdk-0.2.0/src/repull/models/ai_operation_input.py +66 -0
  141. repull_sdk-0.2.0/src/repull/models/ai_operation_operation.py +11 -0
  142. repull_sdk-0.2.0/src/repull/models/airbnb_listing.py +224 -0
  143. repull_sdk-0.2.0/src/repull/models/airbnb_listing_list_response.py +124 -0
  144. repull_sdk-0.2.0/src/repull/models/airbnb_reservation.py +234 -0
  145. repull_sdk-0.2.0/src/repull/models/airbnb_reservation_list_response.py +124 -0
  146. repull_sdk-0.2.0/src/repull/models/airbnb_reservation_status.py +11 -0
  147. repull_sdk-0.2.0/src/repull/models/airbnb_review.py +199 -0
  148. repull_sdk-0.2.0/src/repull/models/airbnb_review_list_response.py +124 -0
  149. repull_sdk-0.2.0/src/repull/models/airbnb_thread.py +178 -0
  150. repull_sdk-0.2.0/src/repull/models/airbnb_thread_list_response.py +124 -0
  151. repull_sdk-0.2.0/src/repull/models/booking_connect_listing_option.py +108 -0
  152. repull_sdk-0.2.0/src/repull/models/booking_connect_room.py +159 -0
  153. repull_sdk-0.2.0/src/repull/models/booking_connect_rooms_response.py +149 -0
  154. repull_sdk-0.2.0/src/repull/models/booking_connect_rooms_response_status.py +9 -0
  155. repull_sdk-0.2.0/src/repull/models/booking_conversation.py +157 -0
  156. repull_sdk-0.2.0/src/repull/models/booking_conversation_list_response.py +124 -0
  157. repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update.py +204 -0
  158. repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update_date_range.py +93 -0
  159. repull_sdk-0.2.0/src/repull/models/booking_pricing_rate_update_restrictions.py +155 -0
  160. repull_sdk-0.2.0/src/repull/models/booking_pricing_response.py +89 -0
  161. repull_sdk-0.2.0/src/repull/models/booking_pricing_update_request.py +96 -0
  162. repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response.py +160 -0
  163. repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response_errors_item.py +65 -0
  164. repull_sdk-0.2.0/src/repull/models/booking_pricing_update_response_raw.py +66 -0
  165. repull_sdk-0.2.0/src/repull/models/booking_property.py +152 -0
  166. repull_sdk-0.2.0/src/repull/models/booking_property_list_response.py +124 -0
  167. repull_sdk-0.2.0/src/repull/models/booking_room_mapping.py +101 -0
  168. repull_sdk-0.2.0/src/repull/models/booking_verify_hotel_request.py +87 -0
  169. repull_sdk-0.2.0/src/repull/models/booking_verify_hotel_response.py +188 -0
  170. repull_sdk-0.2.0/src/repull/models/bulk_pricing_failure.py +138 -0
  171. repull_sdk-0.2.0/src/repull/models/bulk_pricing_failure_error_code.py +10 -0
  172. repull_sdk-0.2.0/src/repull/models/bulk_pricing_item.py +102 -0
  173. repull_sdk-0.2.0/src/repull/models/bulk_pricing_request.py +109 -0
  174. repull_sdk-0.2.0/src/repull/models/bulk_pricing_request_action.py +8 -0
  175. repull_sdk-0.2.0/src/repull/models/bulk_pricing_response.py +120 -0
  176. repull_sdk-0.2.0/src/repull/models/calendar_day.py +118 -0
  177. repull_sdk-0.2.0/src/repull/models/calendar_response.py +100 -0
  178. repull_sdk-0.2.0/src/repull/models/connect_host.py +179 -0
  179. repull_sdk-0.2.0/src/repull/models/connect_provider.py +187 -0
  180. repull_sdk-0.2.0/src/repull/models/connect_provider_category.py +8 -0
  181. repull_sdk-0.2.0/src/repull/models/connect_provider_connect_pattern.py +10 -0
  182. repull_sdk-0.2.0/src/repull/models/connect_provider_list_response.py +100 -0
  183. repull_sdk-0.2.0/src/repull/models/connect_provider_status.py +9 -0
  184. repull_sdk-0.2.0/src/repull/models/connect_session.py +124 -0
  185. repull_sdk-0.2.0/src/repull/models/connect_status.py +200 -0
  186. repull_sdk-0.2.0/src/repull/models/connect_status_status.py +9 -0
  187. repull_sdk-0.2.0/src/repull/models/connection.py +189 -0
  188. repull_sdk-0.2.0/src/repull/models/connection_list_response.py +124 -0
  189. repull_sdk-0.2.0/src/repull/models/connection_status.py +9 -0
  190. repull_sdk-0.2.0/src/repull/models/conversation.py +311 -0
  191. repull_sdk-0.2.0/src/repull/models/conversation_detail.py +384 -0
  192. repull_sdk-0.2.0/src/repull/models/conversation_guest.py +141 -0
  193. repull_sdk-0.2.0/src/repull/models/conversation_guest_contact.py +105 -0
  194. repull_sdk-0.2.0/src/repull/models/conversation_host.py +129 -0
  195. repull_sdk-0.2.0/src/repull/models/conversation_list_response.py +125 -0
  196. repull_sdk-0.2.0/src/repull/models/conversation_message_attachment.py +118 -0
  197. repull_sdk-0.2.0/src/repull/models/conversation_platform.py +11 -0
  198. repull_sdk-0.2.0/src/repull/models/conversation_status.py +8 -0
  199. repull_sdk-0.2.0/src/repull/models/create_ai_operation_response_200.py +87 -0
  200. repull_sdk-0.2.0/src/repull/models/create_billing_checkout_body.py +90 -0
  201. repull_sdk-0.2.0/src/repull/models/create_billing_checkout_body_plan.py +9 -0
  202. repull_sdk-0.2.0/src/repull/models/create_connect_session_body.py +133 -0
  203. repull_sdk-0.2.0/src/repull/models/create_connection_body.py +129 -0
  204. repull_sdk-0.2.0/src/repull/models/create_connection_body_access_type.py +8 -0
  205. repull_sdk-0.2.0/src/repull/models/create_reservation_body.py +163 -0
  206. repull_sdk-0.2.0/src/repull/models/create_webhook_body.py +119 -0
  207. repull_sdk-0.2.0/src/repull/models/cursor_pagination.py +107 -0
  208. repull_sdk-0.2.0/src/repull/models/custom_schema.py +156 -0
  209. repull_sdk-0.2.0/src/repull/models/custom_schema_create.py +122 -0
  210. repull_sdk-0.2.0/src/repull/models/custom_schema_create_response.py +155 -0
  211. repull_sdk-0.2.0/src/repull/models/custom_schema_delete_response.py +76 -0
  212. repull_sdk-0.2.0/src/repull/models/custom_schema_list_response.py +125 -0
  213. repull_sdk-0.2.0/src/repull/models/custom_schema_mappings.py +74 -0
  214. repull_sdk-0.2.0/src/repull/models/custom_schema_summary.py +155 -0
  215. repull_sdk-0.2.0/src/repull/models/custom_schema_update.py +132 -0
  216. repull_sdk-0.2.0/src/repull/models/error.py +88 -0
  217. repull_sdk-0.2.0/src/repull/models/error_error.py +222 -0
  218. repull_sdk-0.2.0/src/repull/models/error_error_support.py +98 -0
  219. repull_sdk-0.2.0/src/repull/models/get_health_response_200.py +87 -0
  220. repull_sdk-0.2.0/src/repull/models/get_listing_segments_level.py +8 -0
  221. repull_sdk-0.2.0/src/repull/models/guest.py +311 -0
  222. repull_sdk-0.2.0/src/repull/models/guest_contact.py +142 -0
  223. repull_sdk-0.2.0/src/repull/models/guest_flag.py +146 -0
  224. repull_sdk-0.2.0/src/repull/models/guest_list_response.py +125 -0
  225. repull_sdk-0.2.0/src/repull/models/guest_note.py +177 -0
  226. repull_sdk-0.2.0/src/repull/models/guest_profile.py +461 -0
  227. repull_sdk-0.2.0/src/repull/models/guest_reservations_summary.py +106 -0
  228. repull_sdk-0.2.0/src/repull/models/list_conversation_messages_order.py +8 -0
  229. repull_sdk-0.2.0/src/repull/models/list_conversations_platform.py +11 -0
  230. repull_sdk-0.2.0/src/repull/models/list_conversations_status.py +8 -0
  231. repull_sdk-0.2.0/src/repull/models/list_listings_status.py +9 -0
  232. repull_sdk-0.2.0/src/repull/models/list_market_browse_sort.py +8 -0
  233. repull_sdk-0.2.0/src/repull/models/list_properties_status.py +8 -0
  234. repull_sdk-0.2.0/src/repull/models/list_reservations_status.py +10 -0
  235. repull_sdk-0.2.0/src/repull/models/list_reviews_platform.py +9 -0
  236. repull_sdk-0.2.0/src/repull/models/list_reviews_reviewer_role.py +9 -0
  237. repull_sdk-0.2.0/src/repull/models/list_reviews_status.py +9 -0
  238. repull_sdk-0.2.0/src/repull/models/list_webhook_deliveries_status.py +9 -0
  239. repull_sdk-0.2.0/src/repull/models/listing.py +223 -0
  240. repull_sdk-0.2.0/src/repull/models/listing_address.py +112 -0
  241. repull_sdk-0.2.0/src/repull/models/listing_channel.py +106 -0
  242. repull_sdk-0.2.0/src/repull/models/listing_comp.py +345 -0
  243. repull_sdk-0.2.0/src/repull/models/listing_comp_nightly.py +121 -0
  244. repull_sdk-0.2.0/src/repull/models/listing_comp_ratings.py +100 -0
  245. repull_sdk-0.2.0/src/repull/models/listing_comps_response.py +172 -0
  246. repull_sdk-0.2.0/src/repull/models/listing_comps_response_date_range.py +110 -0
  247. repull_sdk-0.2.0/src/repull/models/listing_content.py +165 -0
  248. repull_sdk-0.2.0/src/repull/models/listing_create_request.py +289 -0
  249. repull_sdk-0.2.0/src/repull/models/listing_create_request_cancellation_policy.py +10 -0
  250. repull_sdk-0.2.0/src/repull/models/listing_create_response.py +78 -0
  251. repull_sdk-0.2.0/src/repull/models/listing_generate_content_request.py +115 -0
  252. repull_sdk-0.2.0/src/repull/models/listing_generate_content_request_style.py +9 -0
  253. repull_sdk-0.2.0/src/repull/models/listing_generate_content_response.py +111 -0
  254. repull_sdk-0.2.0/src/repull/models/listing_list_response.py +124 -0
  255. repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_request.py +105 -0
  256. repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_request_action.py +8 -0
  257. repull_sdk-0.2.0/src/repull/models/listing_pricing_apply_response.py +121 -0
  258. repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry.py +224 -0
  259. repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry_recommendation_factors.py +66 -0
  260. repull_sdk-0.2.0/src/repull/models/listing_pricing_history_entry_status.py +10 -0
  261. repull_sdk-0.2.0/src/repull/models/listing_pricing_history_response.py +125 -0
  262. repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation.py +298 -0
  263. repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation_factors.py +66 -0
  264. repull_sdk-0.2.0/src/repull/models/listing_pricing_recommendation_status.py +9 -0
  265. repull_sdk-0.2.0/src/repull/models/listing_pricing_response.py +203 -0
  266. repull_sdk-0.2.0/src/repull/models/listing_pricing_response_comp_summary_type_0.py +143 -0
  267. repull_sdk-0.2.0/src/repull/models/listing_pricing_response_date_range.py +110 -0
  268. repull_sdk-0.2.0/src/repull/models/listing_pricing_response_listing_type_0.py +192 -0
  269. repull_sdk-0.2.0/src/repull/models/listing_pricing_response_listing_type_0_ai_base_price_factors_type_0.py +65 -0
  270. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy.py +349 -0
  271. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_comp_position_target.py +9 -0
  272. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_day_of_week_multipliers.py +66 -0
  273. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input.py +298 -0
  274. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_comp_position_target.py +9 -0
  275. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_day_of_week_multipliers.py +65 -0
  276. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_input_mode.py +8 -0
  277. repull_sdk-0.2.0/src/repull/models/listing_pricing_strategy_mode.py +8 -0
  278. repull_sdk-0.2.0/src/repull/models/listing_publish_airbnb_request.py +98 -0
  279. repull_sdk-0.2.0/src/repull/models/listing_publish_response.py +123 -0
  280. repull_sdk-0.2.0/src/repull/models/listing_publish_response_channel.py +8 -0
  281. repull_sdk-0.2.0/src/repull/models/listing_publish_response_result.py +66 -0
  282. repull_sdk-0.2.0/src/repull/models/listing_publish_status_channel.py +191 -0
  283. repull_sdk-0.2.0/src/repull/models/listing_publish_status_channel_push_status.py +10 -0
  284. repull_sdk-0.2.0/src/repull/models/listing_publish_status_response.py +109 -0
  285. repull_sdk-0.2.0/src/repull/models/listing_quality_tier.py +130 -0
  286. repull_sdk-0.2.0/src/repull/models/listing_quality_tier_tier.py +10 -0
  287. repull_sdk-0.2.0/src/repull/models/listing_segment.py +252 -0
  288. repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_1.py +10 -0
  289. repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_2_type_1.py +10 -0
  290. repull_sdk-0.2.0/src/repull/models/listing_segment_quality_tier_type_3_type_1.py +10 -0
  291. repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation.py +139 -0
  292. repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation_evidence_type_0.py +65 -0
  293. repull_sdk-0.2.0/src/repull/models/listing_segment_recommendation_kind.py +13 -0
  294. repull_sdk-0.2.0/src/repull/models/listing_segments_response.py +305 -0
  295. repull_sdk-0.2.0/src/repull/models/listing_segments_response_level.py +8 -0
  296. repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_1.py +10 -0
  297. repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_2_type_1.py +10 -0
  298. repull_sdk-0.2.0/src/repull/models/listing_segments_response_my_quality_tier_type_3_type_1.py +10 -0
  299. repull_sdk-0.2.0/src/repull/models/listing_segments_response_scope.py +114 -0
  300. repull_sdk-0.2.0/src/repull/models/listing_status.py +9 -0
  301. repull_sdk-0.2.0/src/repull/models/map_connect_booking_rooms_request.py +104 -0
  302. repull_sdk-0.2.0/src/repull/models/map_connect_booking_rooms_response.py +100 -0
  303. repull_sdk-0.2.0/src/repull/models/market_browse_category.py +87 -0
  304. repull_sdk-0.2.0/src/repull/models/market_browse_entry.py +137 -0
  305. repull_sdk-0.2.0/src/repull/models/market_browse_featured.py +130 -0
  306. repull_sdk-0.2.0/src/repull/models/market_browse_response.py +124 -0
  307. repull_sdk-0.2.0/src/repull/models/market_calendar_day.py +295 -0
  308. repull_sdk-0.2.0/src/repull/models/market_calendar_day_events_item.py +142 -0
  309. repull_sdk-0.2.0/src/repull/models/market_calendar_response.py +160 -0
  310. repull_sdk-0.2.0/src/repull/models/market_calendar_response_date_range.py +110 -0
  311. repull_sdk-0.2.0/src/repull/models/market_detail_response.py +401 -0
  312. repull_sdk-0.2.0/src/repull/models/market_detail_response_bedroom_breakdown_item.py +65 -0
  313. repull_sdk-0.2.0/src/repull/models/market_detail_response_benchmarks_item.py +65 -0
  314. repull_sdk-0.2.0/src/repull/models/market_detail_response_capacity_gap.py +65 -0
  315. repull_sdk-0.2.0/src/repull/models/market_detail_response_health_summary_type_0.py +65 -0
  316. repull_sdk-0.2.0/src/repull/models/market_detail_response_market_position_type_0.py +65 -0
  317. repull_sdk-0.2.0/src/repull/models/market_detail_response_price_distribution_item.py +151 -0
  318. repull_sdk-0.2.0/src/repull/models/market_detail_response_property_type_mix_item.py +109 -0
  319. repull_sdk-0.2.0/src/repull/models/market_detail_response_supply_trend_item.py +87 -0
  320. repull_sdk-0.2.0/src/repull/models/market_detail_response_top_comps.py +153 -0
  321. repull_sdk-0.2.0/src/repull/models/market_detail_response_wheelhouse_trends_item.py +65 -0
  322. repull_sdk-0.2.0/src/repull/models/market_event.py +322 -0
  323. repull_sdk-0.2.0/src/repull/models/market_my_listing.py +218 -0
  324. repull_sdk-0.2.0/src/repull/models/market_my_listing_type.py +7 -0
  325. repull_sdk-0.2.0/src/repull/models/market_summary.py +275 -0
  326. repull_sdk-0.2.0/src/repull/models/market_top_comp.py +328 -0
  327. repull_sdk-0.2.0/src/repull/models/markets_overview_response.py +256 -0
  328. repull_sdk-0.2.0/src/repull/models/markets_overview_response_browse.py +140 -0
  329. repull_sdk-0.2.0/src/repull/models/markets_overview_response_subscriptions.py +88 -0
  330. repull_sdk-0.2.0/src/repull/models/markets_overview_response_totals.py +96 -0
  331. repull_sdk-0.2.0/src/repull/models/message.py +349 -0
  332. repull_sdk-0.2.0/src/repull/models/message_direction.py +8 -0
  333. repull_sdk-0.2.0/src/repull/models/message_list_response.py +125 -0
  334. repull_sdk-0.2.0/src/repull/models/pagination.py +107 -0
  335. repull_sdk-0.2.0/src/repull/models/plumguide_listing.py +110 -0
  336. repull_sdk-0.2.0/src/repull/models/plumguide_listing_list_response.py +124 -0
  337. repull_sdk-0.2.0/src/repull/models/property_.py +196 -0
  338. repull_sdk-0.2.0/src/repull/models/property_list_response.py +124 -0
  339. repull_sdk-0.2.0/src/repull/models/reservation.py +269 -0
  340. repull_sdk-0.2.0/src/repull/models/reservation_guest_details.py +67 -0
  341. repull_sdk-0.2.0/src/repull/models/reservation_list_response.py +127 -0
  342. repull_sdk-0.2.0/src/repull/models/reservation_platform_type_1.py +13 -0
  343. repull_sdk-0.2.0/src/repull/models/reservation_platform_type_2_type_1.py +13 -0
  344. repull_sdk-0.2.0/src/repull/models/reservation_platform_type_3_type_1.py +13 -0
  345. repull_sdk-0.2.0/src/repull/models/reservation_status.py +10 -0
  346. repull_sdk-0.2.0/src/repull/models/review.py +544 -0
  347. repull_sdk-0.2.0/src/repull/models/review_category.py +123 -0
  348. repull_sdk-0.2.0/src/repull/models/review_list_response.py +125 -0
  349. repull_sdk-0.2.0/src/repull/models/review_platform.py +9 -0
  350. repull_sdk-0.2.0/src/repull/models/review_response.py +115 -0
  351. repull_sdk-0.2.0/src/repull/models/review_reviewer_role.py +8 -0
  352. repull_sdk-0.2.0/src/repull/models/rotate_webhook_secret_response_200.py +109 -0
  353. repull_sdk-0.2.0/src/repull/models/select_connect_provider_body.py +76 -0
  354. repull_sdk-0.2.0/src/repull/models/select_provider_response.py +120 -0
  355. repull_sdk-0.2.0/src/repull/models/select_provider_response_pattern.py +10 -0
  356. repull_sdk-0.2.0/src/repull/models/test_webhook_body.py +96 -0
  357. repull_sdk-0.2.0/src/repull/models/update_availability_body.py +100 -0
  358. repull_sdk-0.2.0/src/repull/models/update_listing_pricing_strategy_response_200.py +78 -0
  359. repull_sdk-0.2.0/src/repull/models/update_reservation_body.py +128 -0
  360. repull_sdk-0.2.0/src/repull/models/update_webhook_body.py +135 -0
  361. repull_sdk-0.2.0/src/repull/models/update_webhook_body_status.py +8 -0
  362. repull_sdk-0.2.0/src/repull/models/vrbo_listing.py +110 -0
  363. repull_sdk-0.2.0/src/repull/models/vrbo_listing_list_response.py +124 -0
  364. repull_sdk-0.2.0/src/repull/models/vrbo_reservation.py +150 -0
  365. repull_sdk-0.2.0/src/repull/models/vrbo_reservation_list_response.py +124 -0
  366. repull_sdk-0.2.0/src/repull/models/webhook_delivery.py +286 -0
  367. repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail.py +315 -0
  368. repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_payload.py +65 -0
  369. repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_request_headers_type_0.py +65 -0
  370. repull_sdk-0.2.0/src/repull/models/webhook_delivery_detail_response_headers_type_0.py +65 -0
  371. repull_sdk-0.2.0/src/repull/models/webhook_delivery_list_response.py +124 -0
  372. repull_sdk-0.2.0/src/repull/models/webhook_event_catalog.py +100 -0
  373. repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item.py +118 -0
  374. repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item_events_item.py +129 -0
  375. repull_sdk-0.2.0/src/repull/models/webhook_event_catalog_domains_item_events_item_sample_payload.py +65 -0
  376. repull_sdk-0.2.0/src/repull/models/webhook_list_response.py +124 -0
  377. repull_sdk-0.2.0/src/repull/models/webhook_subscription.py +411 -0
  378. repull_sdk-0.2.0/src/repull/models/webhook_subscription_status.py +9 -0
  379. 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
@@ -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())