repull 0.2.27 → 0.2.28

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 (666) hide show
  1. checksums.yaml +4 -4
  2. data/lib/repull/api/airbnb_api.rb +1 -1
  3. data/lib/repull/api/atlas_api.rb +1 -1
  4. data/lib/repull/api/availability_api.rb +1 -1
  5. data/lib/repull/api/billing_api.rb +1 -1
  6. data/lib/repull/api/booking_com_api.rb +1 -1
  7. data/lib/repull/api/connect_api.rb +201 -1
  8. data/lib/repull/api/connections_api.rb +1 -1
  9. data/lib/repull/api/conversations_api.rb +1 -1
  10. data/lib/repull/api/guests_api.rb +1 -1
  11. data/lib/repull/api/health_api.rb +1 -1
  12. data/lib/repull/api/kv_api.rb +1 -1
  13. data/lib/repull/api/listings_api.rb +1 -1
  14. data/lib/repull/api/markets_api.rb +1 -1
  15. data/lib/repull/api/migrate_api.rb +1 -1
  16. data/lib/repull/api/plumguide_api.rb +1 -1
  17. data/lib/repull/api/pricing_api.rb +1 -1
  18. data/lib/repull/api/properties_api.rb +1 -1
  19. data/lib/repull/api/quotes_api.rb +1 -1
  20. data/lib/repull/api/reservations_api.rb +5 -5
  21. data/lib/repull/api/reviews_api.rb +1 -1
  22. data/lib/repull/api/schema_api.rb +1 -1
  23. data/lib/repull/api/system_api.rb +1 -1
  24. data/lib/repull/api/vrbo_api.rb +1 -1
  25. data/lib/repull/api/webhooks_api.rb +1 -1
  26. data/lib/repull/api_client.rb +1 -1
  27. data/lib/repull/api_error.rb +1 -1
  28. data/lib/repull/api_model_base.rb +1 -1
  29. data/lib/repull/configuration.rb +1 -1
  30. data/lib/repull/models/accept_reservation_request200_response.rb +1 -1
  31. data/lib/repull/models/account_created_event.rb +1 -1
  32. data/lib/repull/models/account_created_payload.rb +1 -1
  33. data/lib/repull/models/account_disconnected_event.rb +1 -1
  34. data/lib/repull/models/account_disconnected_payload.rb +1 -1
  35. data/lib/repull/models/acknowledge_booking_reservations_request.rb +1 -1
  36. data/lib/repull/models/ai_operation.rb +1 -1
  37. data/lib/repull/models/ai_operation_completed_event.rb +1 -1
  38. data/lib/repull/models/ai_operation_completed_payload.rb +1 -1
  39. data/lib/repull/models/ai_operation_failed_event.rb +1 -1
  40. data/lib/repull/models/ai_operation_failed_payload.rb +1 -1
  41. data/lib/repull/models/ai_operation_failed_payload_error.rb +1 -1
  42. data/lib/repull/models/airbnb_account_freshness.rb +1 -1
  43. data/lib/repull/models/airbnb_alteration.rb +1 -1
  44. data/lib/repull/models/airbnb_alteration_create_request.rb +1 -1
  45. data/lib/repull/models/airbnb_amenity.rb +1 -1
  46. data/lib/repull/models/airbnb_availability_write_request.rb +1 -1
  47. data/lib/repull/models/airbnb_calendar_operation.rb +1 -1
  48. data/lib/repull/models/airbnb_connection.rb +1 -1
  49. data/lib/repull/models/airbnb_connection_accessibility_amenities_inner.rb +1 -1
  50. data/lib/repull/models/airbnb_connection_amenities_inner.rb +1 -1
  51. data/lib/repull/models/airbnb_connection_host.rb +1 -1
  52. data/lib/repull/models/airbnb_connection_response.rb +1 -1
  53. data/lib/repull/models/airbnb_connection_summary.rb +1 -1
  54. data/lib/repull/models/airbnb_content_write_response.rb +1 -1
  55. data/lib/repull/models/airbnb_data_freshness.rb +1 -1
  56. data/lib/repull/models/airbnb_description_write_request.rb +1 -1
  57. data/lib/repull/models/airbnb_description_write_request_description.rb +1 -1
  58. data/lib/repull/models/airbnb_host_review_submit.rb +1 -1
  59. data/lib/repull/models/airbnb_host_review_submit_category_ratings_inner.rb +1 -1
  60. data/lib/repull/models/airbnb_listing.rb +1 -1
  61. data/lib/repull/models/airbnb_listing_action200_response.rb +1 -1
  62. data/lib/repull/models/airbnb_listing_action200_response_one_of.rb +1 -1
  63. data/lib/repull/models/airbnb_listing_action200_response_one_of1.rb +1 -1
  64. data/lib/repull/models/airbnb_listing_action_request.rb +1 -1
  65. data/lib/repull/models/airbnb_listing_details_response.rb +1 -1
  66. data/lib/repull/models/airbnb_listing_details_write_request.rb +1 -1
  67. data/lib/repull/models/airbnb_listing_details_write_request_check_in_option.rb +1 -1
  68. data/lib/repull/models/airbnb_listing_details_write_request_quiet_hours_inner.rb +1 -1
  69. data/lib/repull/models/airbnb_listing_lifecycle_response.rb +1 -1
  70. data/lib/repull/models/airbnb_listing_list_response.rb +1 -1
  71. data/lib/repull/models/airbnb_permits_response.rb +1 -1
  72. data/lib/repull/models/airbnb_permits_response_cached_inner.rb +1 -1
  73. data/lib/repull/models/airbnb_permits_write_request.rb +1 -1
  74. data/lib/repull/models/airbnb_permits_write_request_permits_inner.rb +1 -1
  75. data/lib/repull/models/airbnb_photo_position.rb +1 -1
  76. data/lib/repull/models/airbnb_pricing_write_request.rb +1 -1
  77. data/lib/repull/models/airbnb_pricing_write_request_fees_inner.rb +1 -1
  78. data/lib/repull/models/airbnb_pricing_write_request_records_inner.rb +1 -1
  79. data/lib/repull/models/airbnb_publish_result.rb +1 -1
  80. data/lib/repull/models/airbnb_reservation.rb +1 -1
  81. data/lib/repull/models/airbnb_reservation_action200_response.rb +1 -1
  82. data/lib/repull/models/airbnb_reservation_action_request.rb +1 -1
  83. data/lib/repull/models/airbnb_reservation_list_response.rb +1 -1
  84. data/lib/repull/models/airbnb_review.rb +1 -1
  85. data/lib/repull/models/airbnb_review_list_response.rb +1 -1
  86. data/lib/repull/models/airbnb_safety_disclosure.rb +1 -1
  87. data/lib/repull/models/airbnb_safety_disclosures_response.rb +1 -1
  88. data/lib/repull/models/airbnb_safety_disclosures_write_request.rb +1 -1
  89. data/lib/repull/models/airbnb_thread.rb +1 -1
  90. data/lib/repull/models/airbnb_thread_list_response.rb +1 -1
  91. data/lib/repull/models/airbnb_transaction.rb +1 -1
  92. data/lib/repull/models/airbnb_transaction_fees.rb +1 -1
  93. data/lib/repull/models/airbnb_transaction_payout.rb +1 -1
  94. data/lib/repull/models/alteration_change.rb +1 -1
  95. data/lib/repull/models/alteration_webhook_object.rb +1 -1
  96. data/lib/repull/models/apply_connection_mappings200_response.rb +1 -1
  97. data/lib/repull/models/apply_connection_mappings200_response_results_inner.rb +1 -1
  98. data/lib/repull/models/apply_connection_mappings_request.rb +1 -1
  99. data/lib/repull/models/apply_connection_mappings_request_mappings_inner.rb +1 -1
  100. data/lib/repull/models/auto_map_connection_units200_response.rb +1 -1
  101. data/lib/repull/models/auto_map_connection_units_request.rb +1 -1
  102. data/lib/repull/models/availability_batch_write_request.rb +1 -1
  103. data/lib/repull/models/availability_write_request.rb +1 -1
  104. data/lib/repull/models/availability_write_result.rb +1 -1
  105. data/lib/repull/models/availability_write_result_synced.rb +1 -1
  106. data/lib/repull/models/availability_write_settings.rb +1 -1
  107. data/lib/repull/models/booking_availability_state_response.rb +1 -1
  108. data/lib/repull/models/booking_availability_update.rb +1 -1
  109. data/lib/repull/models/booking_availability_update_date_range.rb +1 -1
  110. data/lib/repull/models/booking_availability_update_request.rb +1 -1
  111. data/lib/repull/models/booking_availability_update_request_property_id.rb +1 -1
  112. data/lib/repull/models/booking_availability_update_request_updates_inner.rb +1 -1
  113. data/lib/repull/models/booking_connect_listing_option.rb +1 -1
  114. data/lib/repull/models/booking_connect_room.rb +1 -1
  115. data/lib/repull/models/booking_connect_rooms_response.rb +1 -1
  116. data/lib/repull/models/booking_conversation.rb +1 -1
  117. data/lib/repull/models/booking_pricing_rate_update.rb +1 -1
  118. data/lib/repull/models/booking_pricing_rate_update_date_range.rb +1 -1
  119. data/lib/repull/models/booking_pricing_rate_update_restrictions.rb +1 -1
  120. data/lib/repull/models/booking_pricing_response.rb +1 -1
  121. data/lib/repull/models/booking_pricing_update_request.rb +1 -1
  122. data/lib/repull/models/booking_pricing_update_response.rb +1 -1
  123. data/lib/repull/models/booking_property.rb +1 -1
  124. data/lib/repull/models/booking_property_action_request.rb +1 -1
  125. data/lib/repull/models/booking_property_action_response.rb +1 -1
  126. data/lib/repull/models/booking_property_listings_inner.rb +1 -1
  127. data/lib/repull/models/booking_publish_result.rb +1 -1
  128. data/lib/repull/models/booking_publish_section_error.rb +1 -1
  129. data/lib/repull/models/booking_rate_write_occupancy.rb +1 -1
  130. data/lib/repull/models/booking_rate_write_price_half.rb +1 -1
  131. data/lib/repull/models/booking_rate_write_restriction_half.rb +1 -1
  132. data/lib/repull/models/booking_rate_write_verification.rb +1 -1
  133. data/lib/repull/models/booking_rate_write_verification_row.rb +1 -1
  134. data/lib/repull/models/booking_reservation.rb +1 -1
  135. data/lib/repull/models/booking_reservation_room.rb +1 -1
  136. data/lib/repull/models/booking_restriction_request_row.rb +1 -1
  137. data/lib/repull/models/booking_restriction_verification.rb +1 -1
  138. data/lib/repull/models/booking_restriction_verification_row.rb +1 -1
  139. data/lib/repull/models/booking_restriction_verification_row_booking_value.rb +1 -1
  140. data/lib/repull/models/booking_restriction_verification_row_expected.rb +1 -1
  141. data/lib/repull/models/booking_room_mapping.rb +1 -1
  142. data/lib/repull/models/booking_rooms_rates_response.rb +1 -1
  143. data/lib/repull/models/booking_rooms_rates_response_rooms_inner.rb +1 -1
  144. data/lib/repull/models/booking_rooms_rates_response_rooms_inner_rates_inner.rb +1 -1
  145. data/lib/repull/models/booking_setup_request.rb +1 -1
  146. data/lib/repull/models/booking_setup_request_legal_entity.rb +1 -1
  147. data/lib/repull/models/booking_upstream_failure.rb +1 -1
  148. data/lib/repull/models/booking_verify_hotel_request.rb +1 -1
  149. data/lib/repull/models/booking_verify_hotel_response.rb +1 -1
  150. data/lib/repull/models/bulk_pricing_failure.rb +1 -1
  151. data/lib/repull/models/bulk_pricing_item.rb +1 -1
  152. data/lib/repull/models/bulk_pricing_request.rb +1 -1
  153. data/lib/repull/models/bulk_pricing_response.rb +1 -1
  154. data/lib/repull/models/calendar_day.rb +1 -1
  155. data/lib/repull/models/calendar_response.rb +1 -1
  156. data/lib/repull/models/calendar_updated_event.rb +1 -1
  157. data/lib/repull/models/calendar_updated_payload.rb +1 -1
  158. data/lib/repull/models/calendar_updated_payload_range.rb +1 -1
  159. data/lib/repull/models/cancel_reservation200_response.rb +1 -1
  160. data/lib/repull/models/cancel_reservation_request.rb +1 -1
  161. data/lib/repull/models/channel_market_state_item.rb +1 -1
  162. data/lib/repull/models/check_migration_cutover200_response.rb +1 -1
  163. data/lib/repull/models/check_migration_cutover_request.rb +1 -1
  164. data/lib/repull/models/check_migration_cutover_request_reservations_inner.rb +1 -1
  165. data/lib/repull/models/clear_kv200_response.rb +1 -1
  166. data/lib/repull/models/connect_host.rb +1 -1
  167. data/lib/repull/models/connect_provider.rb +1 -1
  168. data/lib/repull/models/connect_provider_list_response.rb +1 -1
  169. data/lib/repull/models/connect_session.rb +1 -1
  170. data/lib/repull/models/connect_session_completed_event.rb +1 -1
  171. data/lib/repull/models/connect_session_completed_payload.rb +1 -1
  172. data/lib/repull/models/connect_status.rb +1 -1
  173. data/lib/repull/models/connect_status_accounts_inner.rb +1 -1
  174. data/lib/repull/models/connect_status_capabilities.rb +1 -1
  175. data/lib/repull/models/connection.rb +1 -1
  176. data/lib/repull/models/connection_action.rb +1 -1
  177. data/lib/repull/models/connection_list_response.rb +1 -1
  178. data/lib/repull/models/conversation.rb +1 -1
  179. data/lib/repull/models/conversation_capabilities.rb +1 -1
  180. data/lib/repull/models/conversation_detail.rb +1 -1
  181. data/lib/repull/models/conversation_guest.rb +1 -1
  182. data/lib/repull/models/conversation_guest_contact.rb +1 -1
  183. data/lib/repull/models/conversation_host.rb +1 -1
  184. data/lib/repull/models/conversation_list_response.rb +1 -1
  185. data/lib/repull/models/conversation_message_attachment.rb +1 -1
  186. data/lib/repull/models/create_airbnb_listing_room_request.rb +1 -1
  187. data/lib/repull/models/create_airbnb_offer_request.rb +1 -1
  188. data/lib/repull/models/create_airbnb_offer_request_guest_details.rb +1 -1
  189. data/lib/repull/models/create_billing_checkout_request.rb +1 -1
  190. data/lib/repull/models/create_booking_webhook_request.rb +1 -1
  191. data/lib/repull/models/create_connect_session_request.rb +1 -1
  192. data/lib/repull/models/create_connect_session_request_copy.rb +1 -1
  193. data/lib/repull/models/create_connect_session_request_workspace.rb +1 -1
  194. data/lib/repull/models/create_connection_request.rb +1 -1
  195. data/lib/repull/models/create_conversation_special_offer201_response.rb +1 -1
  196. data/lib/repull/models/create_conversation_special_offer201_response_fees_inner.rb +1 -1
  197. data/lib/repull/models/create_conversation_special_offer201_response_guests.rb +1 -1
  198. data/lib/repull/models/create_conversation_special_offer201_response_lines_inner.rb +1 -1
  199. data/lib/repull/models/create_conversation_special_offer_request.rb +1 -1
  200. data/lib/repull/models/create_conversation_special_offer_request_fees_inner.rb +1 -1
  201. data/lib/repull/models/create_conversation_special_offer_request_guests.rb +1 -1
  202. data/lib/repull/models/create_webhook_request.rb +1 -1
  203. data/lib/repull/models/custom_schema.rb +1 -1
  204. data/lib/repull/models/custom_schema_create.rb +1 -1
  205. data/lib/repull/models/custom_schema_create_response.rb +1 -1
  206. data/lib/repull/models/custom_schema_delete_response.rb +1 -1
  207. data/lib/repull/models/custom_schema_list_response.rb +1 -1
  208. data/lib/repull/models/custom_schema_summary.rb +1 -1
  209. data/lib/repull/models/custom_schema_update.rb +1 -1
  210. data/lib/repull/models/decline_reservation_request_request.rb +1 -1
  211. data/lib/repull/models/delete_airbnb_listing_photo200_response.rb +1 -1
  212. data/lib/repull/models/delete_airbnb_listing_room200_response.rb +1 -1
  213. data/lib/repull/models/delete_connection200_response.rb +1 -1
  214. data/lib/repull/models/delete_kv200_response.rb +1 -1
  215. data/lib/repull/models/delete_migration200_response.rb +1 -1
  216. data/lib/repull/models/delete_migration200_response_data.rb +1 -1
  217. data/lib/repull/models/error.rb +1 -1
  218. data/lib/repull/models/error_error.rb +1 -1
  219. data/lib/repull/models/error_error_listings_inner.rb +1 -1
  220. data/lib/repull/models/error_error_support.rb +1 -1
  221. data/lib/repull/models/get_airbnb_alteration200_response.rb +1 -1
  222. data/lib/repull/models/get_airbnb_booking_settings200_response.rb +1 -1
  223. data/lib/repull/models/get_airbnb_booking_settings200_response_data.rb +1 -1
  224. data/lib/repull/models/get_airbnb_booking_settings200_response_data_advance_notice.rb +1 -1
  225. data/lib/repull/models/get_airbnb_booking_settings200_response_data_booking_window.rb +1 -1
  226. data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation.rb +1 -1
  227. data/lib/repull/models/get_airbnb_booking_settings200_response_data_cancellation_non_refundable.rb +1 -1
  228. data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in.rb +1 -1
  229. data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_in_start.rb +1 -1
  230. data/lib/repull/models/get_airbnb_booking_settings200_response_data_check_out.rb +1 -1
  231. data/lib/repull/models/get_airbnb_booking_settings200_response_data_instant_book.rb +1 -1
  232. data/lib/repull/models/get_airbnb_booking_settings200_response_data_preparation_time.rb +1 -1
  233. data/lib/repull/models/get_airbnb_checkin_guide200_response.rb +1 -1
  234. data/lib/repull/models/get_airbnb_listing_details200_response.rb +1 -1
  235. data/lib/repull/models/get_airbnb_listing_quality200_response.rb +1 -1
  236. data/lib/repull/models/get_airbnb_listing_settings200_response.rb +1 -1
  237. data/lib/repull/models/get_airbnb_offer200_response.rb +1 -1
  238. data/lib/repull/models/get_airbnb_thread200_response.rb +1 -1
  239. data/lib/repull/models/get_booking_extranet_login_config200_response.rb +1 -1
  240. data/lib/repull/models/get_booking_extranet_login_status200_response.rb +1 -1
  241. data/lib/repull/models/get_channel_health200_response.rb +1 -1
  242. data/lib/repull/models/get_channel_health200_response_vrbo.rb +1 -1
  243. data/lib/repull/models/get_connect_write_policy200_response.rb +1 -1
  244. data/lib/repull/models/get_health200_response.rb +1 -1
  245. data/lib/repull/models/get_listing_calendar_sync200_response.rb +1 -1
  246. data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner.rb +1 -1
  247. data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_problems_inner.rb +1 -1
  248. data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_queue.rb +1 -1
  249. data/lib/repull/models/get_listing_calendar_sync200_response_channels_inner_queue_last_push.rb +1 -1
  250. data/lib/repull/models/get_listing_markups200_response.rb +1 -1
  251. data/lib/repull/models/get_listing_markups200_response_airbnb_inner.rb +1 -1
  252. data/lib/repull/models/get_listing_markups200_response_booking_inner.rb +1 -1
  253. data/lib/repull/models/get_migration200_response.rb +1 -1
  254. data/lib/repull/models/get_migration_channel_map200_response.rb +1 -1
  255. data/lib/repull/models/get_migration_report200_response.rb +1 -1
  256. data/lib/repull/models/get_usage_logs200_response.rb +1 -1
  257. data/lib/repull/models/get_usage_logs200_response_data_inner.rb +1 -1
  258. data/lib/repull/models/get_usage_logs200_response_pagination.rb +1 -1
  259. data/lib/repull/models/get_usage_summary200_response.rb +1 -1
  260. data/lib/repull/models/get_usage_summary200_response_breakdown_inner.rb +1 -1
  261. data/lib/repull/models/get_usage_summary200_response_limits.rb +1 -1
  262. data/lib/repull/models/get_usage_summary200_response_remaining.rb +1 -1
  263. data/lib/repull/models/get_usage_summary200_response_status_distribution.rb +1 -1
  264. data/lib/repull/models/get_usage_summary200_response_timeline_inner.rb +1 -1
  265. data/lib/repull/models/get_usage_summary200_response_totals.rb +1 -1
  266. data/lib/repull/models/get_usage_summary200_response_used.rb +1 -1
  267. data/lib/repull/models/get_usage_tier200_response.rb +1 -1
  268. data/lib/repull/models/get_usage_tier200_response_limits.rb +1 -1
  269. data/lib/repull/models/get_usage_tier200_response_remaining.rb +1 -1
  270. data/lib/repull/models/get_usage_tier200_response_used.rb +1 -1
  271. data/lib/repull/models/guest.rb +1 -1
  272. data/lib/repull/models/guest_contact.rb +1 -1
  273. data/lib/repull/models/guest_create_request.rb +1 -1
  274. data/lib/repull/models/guest_create_response.rb +1 -1
  275. data/lib/repull/models/guest_create_response_contacts_inner.rb +1 -1
  276. data/lib/repull/models/guest_flag.rb +1 -1
  277. data/lib/repull/models/guest_list_response.rb +1 -1
  278. data/lib/repull/models/guest_note.rb +1 -1
  279. data/lib/repull/models/guest_profile.rb +1 -1
  280. data/lib/repull/models/guest_reservations_summary.rb +1 -1
  281. data/lib/repull/models/inquiry_created_event.rb +1 -1
  282. data/lib/repull/models/inquiry_created_payload.rb +1 -1
  283. data/lib/repull/models/inquiry_updated_event.rb +1 -1
  284. data/lib/repull/models/inquiry_updated_payload.rb +1 -1
  285. data/lib/repull/models/inquiry_webhook_object.rb +1 -1
  286. data/lib/repull/models/inquiry_webhook_object_expected_payout.rb +1 -1
  287. data/lib/repull/models/inquiry_webhook_object_guests.rb +1 -1
  288. data/lib/repull/models/invite_booking_extranet_user200_response.rb +1 -1
  289. data/lib/repull/models/invite_booking_extranet_user_request.rb +1 -1
  290. data/lib/repull/models/list_airbnb_alterations200_response.rb +1 -1
  291. data/lib/repull/models/list_airbnb_listing_amenities200_response.rb +1 -1
  292. data/lib/repull/models/list_airbnb_listing_amenities200_response_data.rb +1 -1
  293. data/lib/repull/models/list_airbnb_listing_permits200_response.rb +1 -1
  294. data/lib/repull/models/list_airbnb_listing_safety_disclosures200_response.rb +1 -1
  295. data/lib/repull/models/list_airbnb_thread_messages200_response.rb +1 -1
  296. data/lib/repull/models/list_airbnb_thread_messages200_response_data_inner.rb +1 -1
  297. data/lib/repull/models/list_airbnb_thread_messages200_response_pagination.rb +1 -1
  298. data/lib/repull/models/list_airbnb_transactions200_response.rb +1 -1
  299. data/lib/repull/models/list_booking_reservations200_response.rb +1 -1
  300. data/lib/repull/models/list_connection_units200_response.rb +1 -1
  301. data/lib/repull/models/list_connection_units200_response_listing_options_inner.rb +1 -1
  302. data/lib/repull/models/list_connection_units200_response_units_inner.rb +1 -1
  303. data/lib/repull/models/list_inquiries200_response.rb +1 -1
  304. data/lib/repull/models/list_inquiries200_response_data_inner.rb +1 -1
  305. data/lib/repull/models/list_inquiries200_response_data_inner_expected_payout.rb +1 -1
  306. data/lib/repull/models/list_inquiries200_response_data_inner_guests.rb +1 -1
  307. data/lib/repull/models/list_kv200_response.rb +1 -1
  308. data/lib/repull/models/list_kv200_response_data_inner.rb +1 -1
  309. data/lib/repull/models/list_kv200_response_pagination.rb +1 -1
  310. data/lib/repull/models/list_listing_units200_response.rb +1 -1
  311. data/lib/repull/models/list_listing_units200_response_data_inner.rb +1 -1
  312. data/lib/repull/models/list_migrations200_response.rb +1 -1
  313. data/lib/repull/models/listing.rb +1 -1
  314. data/lib/repull/models/listing_active_request.rb +1 -1
  315. data/lib/repull/models/listing_active_response.rb +1 -1
  316. data/lib/repull/models/listing_address.rb +1 -1
  317. data/lib/repull/models/listing_address_readiness.rb +1 -1
  318. data/lib/repull/models/listing_amenity.rb +1 -1
  319. data/lib/repull/models/listing_capabilities.rb +1 -1
  320. data/lib/repull/models/listing_channel.rb +1 -1
  321. data/lib/repull/models/listing_comp.rb +1 -1
  322. data/lib/repull/models/listing_comp_nightly.rb +1 -1
  323. data/lib/repull/models/listing_comp_ratings.rb +1 -1
  324. data/lib/repull/models/listing_comps_response.rb +1 -1
  325. data/lib/repull/models/listing_content.rb +1 -1
  326. data/lib/repull/models/listing_content_update_request.rb +1 -1
  327. data/lib/repull/models/listing_content_update_request_address.rb +1 -1
  328. data/lib/repull/models/listing_content_update_request_amenities.rb +1 -1
  329. data/lib/repull/models/listing_content_update_request_amenities_one_of_inner.rb +1 -1
  330. data/lib/repull/models/listing_content_update_request_checkout_tasks_inner.rb +1 -1
  331. data/lib/repull/models/listing_content_update_request_details.rb +1 -1
  332. data/lib/repull/models/listing_content_update_request_occupancy.rb +1 -1
  333. data/lib/repull/models/listing_content_update_request_photos_inner.rb +1 -1
  334. data/lib/repull/models/listing_content_update_request_photos_inner_one_of.rb +1 -1
  335. data/lib/repull/models/listing_content_update_request_policies.rb +1 -1
  336. data/lib/repull/models/listing_content_update_request_pricing.rb +1 -1
  337. data/lib/repull/models/listing_content_update_request_rooms_inner.rb +1 -1
  338. data/lib/repull/models/listing_content_update_request_rooms_inner_beds_inner.rb +1 -1
  339. data/lib/repull/models/listing_content_update_response.rb +1 -1
  340. data/lib/repull/models/listing_create_request.rb +1 -1
  341. data/lib/repull/models/listing_create_response.rb +1 -1
  342. data/lib/repull/models/listing_created_event.rb +1 -1
  343. data/lib/repull/models/listing_created_payload.rb +1 -1
  344. data/lib/repull/models/listing_created_payload_address.rb +1 -1
  345. data/lib/repull/models/listing_deleted_event.rb +1 -1
  346. data/lib/repull/models/listing_deleted_payload.rb +1 -1
  347. data/lib/repull/models/listing_details.rb +1 -1
  348. data/lib/repull/models/listing_generate_content_request.rb +1 -1
  349. data/lib/repull/models/listing_generate_content_response.rb +1 -1
  350. data/lib/repull/models/listing_list_response.rb +1 -1
  351. data/lib/repull/models/listing_market_state_request.rb +1 -1
  352. data/lib/repull/models/listing_market_state_response.rb +1 -1
  353. data/lib/repull/models/listing_photo.rb +1 -1
  354. data/lib/repull/models/listing_photo_delete_request.rb +1 -1
  355. data/lib/repull/models/listing_photo_delete_response.rb +1 -1
  356. data/lib/repull/models/listing_photo_upload_url_request.rb +1 -1
  357. data/lib/repull/models/listing_photo_upload_url_response.rb +1 -1
  358. data/lib/repull/models/listing_photos_response.rb +1 -1
  359. data/lib/repull/models/listing_pricing_apply_request.rb +1 -1
  360. data/lib/repull/models/listing_pricing_apply_response.rb +1 -1
  361. data/lib/repull/models/listing_pricing_history_entry.rb +1 -1
  362. data/lib/repull/models/listing_pricing_history_response.rb +1 -1
  363. data/lib/repull/models/listing_pricing_recommendation.rb +1 -1
  364. data/lib/repull/models/listing_pricing_response.rb +1 -1
  365. data/lib/repull/models/listing_pricing_response_comp_summary.rb +1 -1
  366. data/lib/repull/models/listing_pricing_response_date_range.rb +1 -1
  367. data/lib/repull/models/listing_pricing_response_listing.rb +1 -1
  368. data/lib/repull/models/listing_pricing_strategy.rb +1 -1
  369. data/lib/repull/models/listing_pricing_strategy_input.rb +1 -1
  370. data/lib/repull/models/listing_publish_airbnb_request.rb +1 -1
  371. data/lib/repull/models/listing_publish_airbnb_response.rb +1 -1
  372. data/lib/repull/models/listing_publish_booking_request.rb +1 -1
  373. data/lib/repull/models/listing_publish_booking_response.rb +1 -1
  374. data/lib/repull/models/listing_publish_status_channel.rb +1 -1
  375. data/lib/repull/models/listing_publish_status_connection.rb +1 -1
  376. data/lib/repull/models/listing_publish_status_response.rb +1 -1
  377. data/lib/repull/models/listing_pull_airbnb_request.rb +1 -1
  378. data/lib/repull/models/listing_pull_response.rb +1 -1
  379. data/lib/repull/models/listing_quality_tier.rb +1 -1
  380. data/lib/repull/models/listing_reactivated_event.rb +1 -1
  381. data/lib/repull/models/listing_segment.rb +1 -1
  382. data/lib/repull/models/listing_segment_recommendation.rb +1 -1
  383. data/lib/repull/models/listing_segments_response.rb +1 -1
  384. data/lib/repull/models/listing_segments_response_scope.rb +1 -1
  385. data/lib/repull/models/listing_status_batch_request.rb +1 -1
  386. data/lib/repull/models/listing_status_batch_response.rb +1 -1
  387. data/lib/repull/models/listing_suspended_event.rb +1 -1
  388. data/lib/repull/models/listing_suspension_payload.rb +1 -1
  389. data/lib/repull/models/listing_units_inner.rb +1 -1
  390. data/lib/repull/models/listing_updated_event.rb +1 -1
  391. data/lib/repull/models/listing_updated_payload.rb +1 -1
  392. data/lib/repull/models/listing_webhook_object.rb +1 -1
  393. data/lib/repull/models/listing_webhook_object_address.rb +1 -1
  394. data/lib/repull/models/listing_webhook_object_channels_inner.rb +1 -1
  395. data/lib/repull/models/map_airbnb_listing_request.rb +1 -1
  396. data/lib/repull/models/map_airbnb_listing_response.rb +1 -1
  397. data/lib/repull/models/map_booking_room_request.rb +1 -1
  398. data/lib/repull/models/map_booking_room_response.rb +1 -1
  399. data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
  400. data/lib/repull/models/map_connect_booking_rooms_response.rb +1 -1
  401. data/lib/repull/models/market_browse_category.rb +1 -1
  402. data/lib/repull/models/market_browse_entry.rb +1 -1
  403. data/lib/repull/models/market_browse_featured.rb +1 -1
  404. data/lib/repull/models/market_browse_response.rb +1 -1
  405. data/lib/repull/models/market_calendar_day.rb +1 -1
  406. data/lib/repull/models/market_calendar_day_events_inner.rb +1 -1
  407. data/lib/repull/models/market_calendar_response.rb +1 -1
  408. data/lib/repull/models/market_detail_response.rb +1 -1
  409. data/lib/repull/models/market_detail_response_price_distribution_inner.rb +1 -1
  410. data/lib/repull/models/market_detail_response_property_type_mix_inner.rb +1 -1
  411. data/lib/repull/models/market_detail_response_supply_trend_inner.rb +1 -1
  412. data/lib/repull/models/market_detail_response_top_comps.rb +1 -1
  413. data/lib/repull/models/market_event.rb +1 -1
  414. data/lib/repull/models/market_my_listing.rb +1 -1
  415. data/lib/repull/models/market_summary.rb +1 -1
  416. data/lib/repull/models/market_top_comp.rb +1 -1
  417. data/lib/repull/models/markets_overview_response.rb +1 -1
  418. data/lib/repull/models/markets_overview_response_browse.rb +1 -1
  419. data/lib/repull/models/markets_overview_response_subscriptions.rb +1 -1
  420. data/lib/repull/models/markets_overview_response_totals.rb +1 -1
  421. data/lib/repull/models/message.rb +1 -1
  422. data/lib/repull/models/message_list_response.rb +1 -1
  423. data/lib/repull/models/migration.rb +1 -1
  424. data/lib/repull/models/migration_channel_map.rb +1 -1
  425. data/lib/repull/models/migration_channel_map_listings_inner.rb +1 -1
  426. data/lib/repull/models/migration_channel_map_listings_inner_airbnb.rb +1 -1
  427. data/lib/repull/models/migration_channel_map_listings_inner_booking.rb +1 -1
  428. data/lib/repull/models/migration_channel_map_sources_inner.rb +1 -1
  429. data/lib/repull/models/migration_completed_event.rb +1 -1
  430. data/lib/repull/models/migration_connections_inner.rb +1 -1
  431. data/lib/repull/models/migration_counts.rb +1 -1
  432. data/lib/repull/models/migration_cutover_check.rb +1 -1
  433. data/lib/repull/models/migration_cutover_check_mismatched_inner.rb +1 -1
  434. data/lib/repull/models/migration_failed_event.rb +1 -1
  435. data/lib/repull/models/migration_import_payload.rb +1 -1
  436. data/lib/repull/models/migration_import_payload_results_inner.rb +1 -1
  437. data/lib/repull/models/migration_import_run.rb +1 -1
  438. data/lib/repull/models/migration_import_run_results_inner.rb +1 -1
  439. data/lib/repull/models/migration_report.rb +1 -1
  440. data/lib/repull/models/migration_report_issues_inner.rb +1 -1
  441. data/lib/repull/models/migration_reservation_ref.rb +1 -1
  442. data/lib/repull/models/pagination.rb +1 -1
  443. data/lib/repull/models/payment_completed_event.rb +1 -1
  444. data/lib/repull/models/payment_completed_payload.rb +1 -1
  445. data/lib/repull/models/payment_refunded_event.rb +1 -1
  446. data/lib/repull/models/payment_refunded_payload.rb +1 -1
  447. data/lib/repull/models/payment_webhook_object.rb +1 -1
  448. data/lib/repull/models/payout_completed_event.rb +1 -1
  449. data/lib/repull/models/payout_completed_payload.rb +1 -1
  450. data/lib/repull/models/plan_notice.rb +1 -1
  451. data/lib/repull/models/plumguide_listing.rb +1 -1
  452. data/lib/repull/models/plumguide_listing_list_response.rb +1 -1
  453. data/lib/repull/models/pms_write_policy.rb +1 -1
  454. data/lib/repull/models/pms_write_policy_calendar.rb +1 -1
  455. data/lib/repull/models/pms_write_policy_reservations.rb +1 -1
  456. data/lib/repull/models/preapprove_conversation201_response.rb +1 -1
  457. data/lib/repull/models/preapprove_conversation_request.rb +1 -1
  458. data/lib/repull/models/preview_conversation_special_offer_request.rb +1 -1
  459. data/lib/repull/models/preview_conversation_special_offer_request_fees_inner.rb +1 -1
  460. data/lib/repull/models/preview_conversation_special_offer_request_guests.rb +1 -1
  461. data/lib/repull/models/property.rb +1 -1
  462. data/lib/repull/models/property_availability.rb +1 -1
  463. data/lib/repull/models/property_availability_coverage.rb +1 -1
  464. data/lib/repull/models/property_availability_day.rb +1 -1
  465. data/lib/repull/models/property_list_response.rb +1 -1
  466. data/lib/repull/models/publish_section_error.rb +1 -1
  467. data/lib/repull/models/quote.rb +1 -1
  468. data/lib/repull/models/quote_pricing.rb +1 -1
  469. data/lib/repull/models/recheck_booking_extranet_login200_response.rb +178 -0
  470. data/lib/repull/models/recheck_booking_extranet_login_request.rb +192 -0
  471. data/lib/repull/models/record_account.rb +1 -1
  472. data/lib/repull/models/reorder_airbnb_listing_photos200_response.rb +1 -1
  473. data/lib/repull/models/reorder_airbnb_listing_photos200_response_data.rb +1 -1
  474. data/lib/repull/models/reorder_airbnb_listing_photos_request.rb +1 -1
  475. data/lib/repull/models/replay_webhook_delivery_request.rb +1 -1
  476. data/lib/repull/models/reply_booking_review200_response.rb +1 -1
  477. data/lib/repull/models/reply_booking_review_request.rb +1 -1
  478. data/lib/repull/models/reply_to_review201_response.rb +1 -1
  479. data/lib/repull/models/reply_to_review_request.rb +1 -1
  480. data/lib/repull/models/repull_ping_event.rb +1 -1
  481. data/lib/repull/models/repull_ping_payload.rb +1 -1
  482. data/lib/repull/models/reservation.rb +1 -1
  483. data/lib/repull/models/reservation_alteration_created_event.rb +1 -1
  484. data/lib/repull/models/reservation_alteration_created_payload.rb +1 -1
  485. data/lib/repull/models/reservation_alteration_responded_event.rb +1 -1
  486. data/lib/repull/models/reservation_alteration_responded_payload.rb +1 -1
  487. data/lib/repull/models/reservation_cancelled_event.rb +1 -1
  488. data/lib/repull/models/reservation_cancelled_payload.rb +1 -1
  489. data/lib/repull/models/reservation_capabilities.rb +1 -1
  490. data/lib/repull/models/reservation_create_request.rb +1 -1
  491. data/lib/repull/models/reservation_create_response.rb +1 -1
  492. data/lib/repull/models/reservation_create_response_unit.rb +1 -1
  493. data/lib/repull/models/reservation_created_event.rb +1 -1
  494. data/lib/repull/models/reservation_created_payload.rb +1 -1
  495. data/lib/repull/models/reservation_financials.rb +1 -1
  496. data/lib/repull/models/reservation_guest_financials.rb +1 -1
  497. data/lib/repull/models/reservation_guest_input.rb +1 -1
  498. data/lib/repull/models/reservation_host_financials.rb +1 -1
  499. data/lib/repull/models/reservation_list_response.rb +1 -1
  500. data/lib/repull/models/reservation_message_received_event.rb +1 -1
  501. data/lib/repull/models/reservation_message_received_payload.rb +1 -1
  502. data/lib/repull/models/reservation_message_received_payload_from.rb +1 -1
  503. data/lib/repull/models/reservation_message_sent_event.rb +1 -1
  504. data/lib/repull/models/reservation_message_sent_payload.rb +1 -1
  505. data/lib/repull/models/reservation_message_sent_payload_from.rb +1 -1
  506. data/lib/repull/models/reservation_message_updated_event.rb +1 -1
  507. data/lib/repull/models/reservation_message_updated_payload.rb +1 -1
  508. data/lib/repull/models/reservation_message_updated_payload_from.rb +1 -1
  509. data/lib/repull/models/reservation_money_line.rb +1 -1
  510. data/lib/repull/models/reservation_occupancy.rb +1 -1
  511. data/lib/repull/models/reservation_pms_outcome.rb +1 -1
  512. data/lib/repull/models/reservation_pms_outcome_quote.rb +1 -1
  513. data/lib/repull/models/reservation_pms_section_error.rb +1 -1
  514. data/lib/repull/models/reservation_primary_guest.rb +1 -1
  515. data/lib/repull/models/reservation_quote_request.rb +1 -1
  516. data/lib/repull/models/reservation_quote_response.rb +1 -1
  517. data/lib/repull/models/reservation_quote_response_breakdown.rb +1 -1
  518. data/lib/repull/models/reservation_request_created_event.rb +1 -1
  519. data/lib/repull/models/reservation_request_created_payload.rb +1 -1
  520. data/lib/repull/models/reservation_request_updated_event.rb +1 -1
  521. data/lib/repull/models/reservation_request_updated_payload.rb +1 -1
  522. data/lib/repull/models/reservation_unit.rb +1 -1
  523. data/lib/repull/models/reservation_update_request.rb +1 -1
  524. data/lib/repull/models/reservation_update_response.rb +1 -1
  525. data/lib/repull/models/reservation_updated_event.rb +1 -1
  526. data/lib/repull/models/reservation_updated_payload.rb +1 -1
  527. data/lib/repull/models/reservation_webhook_object.rb +1 -1
  528. data/lib/repull/models/respond_airbnb_review_request.rb +1 -1
  529. data/lib/repull/models/resume_connect400_response.rb +208 -0
  530. data/lib/repull/models/resume_connect500_response.rb +188 -0
  531. data/lib/repull/models/review.rb +1 -1
  532. data/lib/repull/models/review_category.rb +1 -1
  533. data/lib/repull/models/review_created_event.rb +1 -1
  534. data/lib/repull/models/review_created_payload.rb +1 -1
  535. data/lib/repull/models/review_list_response.rb +1 -1
  536. data/lib/repull/models/review_responded_event.rb +1 -1
  537. data/lib/repull/models/review_responded_payload.rb +1 -1
  538. data/lib/repull/models/review_response.rb +1 -1
  539. data/lib/repull/models/review_webhook_object.rb +1 -1
  540. data/lib/repull/models/rotate_webhook_secret200_response.rb +1 -1
  541. data/lib/repull/models/run_migration_import202_response.rb +1 -1
  542. data/lib/repull/models/run_migration_import202_response_data.rb +1 -1
  543. data/lib/repull/models/run_migration_import202_response_data_queued_inner.rb +1 -1
  544. data/lib/repull/models/run_migration_import_request.rb +1 -1
  545. data/lib/repull/models/search_connect_session_listing_options200_response.rb +1 -1
  546. data/lib/repull/models/search_connect_session_listing_options200_response_data_inner.rb +1 -1
  547. data/lib/repull/models/search_connection_listing_options200_response.rb +1 -1
  548. data/lib/repull/models/select_connect_provider_request.rb +1 -1
  549. data/lib/repull/models/select_provider_response.rb +1 -1
  550. data/lib/repull/models/send_airbnb_message201_response.rb +1 -1
  551. data/lib/repull/models/send_airbnb_message_request.rb +1 -1
  552. data/lib/repull/models/send_booking_message_request.rb +1 -1
  553. data/lib/repull/models/send_message_attachment.rb +1 -1
  554. data/lib/repull/models/send_message_part.rb +1 -1
  555. data/lib/repull/models/send_message_request.rb +1 -1
  556. data/lib/repull/models/send_message_response.rb +1 -1
  557. data/lib/repull/models/sent_attachment.rb +1 -1
  558. data/lib/repull/models/set_airbnb_listing_cover_photo200_response.rb +1 -1
  559. data/lib/repull/models/set_airbnb_listing_cover_photo200_response_data.rb +1 -1
  560. data/lib/repull/models/set_airbnb_listing_cover_photo_request.rb +1 -1
  561. data/lib/repull/models/set_kv_request.rb +1 -1
  562. data/lib/repull/models/set_listing_markup_request.rb +1 -1
  563. data/lib/repull/models/start_booking_extranet_login200_response.rb +1 -1
  564. data/lib/repull/models/start_booking_extranet_login_request.rb +1 -1
  565. data/lib/repull/models/submit_beds24_credentials200_response.rb +1 -1
  566. data/lib/repull/models/submit_beds24_credentials_request.rb +1 -1
  567. data/lib/repull/models/submit_bookingsync_credentials_request.rb +1 -1
  568. data/lib/repull/models/submit_cloudbeds_credentials200_response.rb +1 -1
  569. data/lib/repull/models/submit_cloudbeds_credentials200_response_account_info.rb +1 -1
  570. data/lib/repull/models/submit_cloudbeds_credentials200_response_webhooks.rb +1 -1
  571. data/lib/repull/models/submit_cloudbeds_credentials_request.rb +1 -1
  572. data/lib/repull/models/submit_cloudbeds_credentials_request_credentials.rb +1 -1
  573. data/lib/repull/models/submit_guest_review200_response.rb +1 -1
  574. data/lib/repull/models/submit_guesty_credentials_request.rb +1 -1
  575. data/lib/repull/models/submit_hospitable_credentials_request.rb +1 -1
  576. data/lib/repull/models/submit_hostaway_credentials_request.rb +1 -1
  577. data/lib/repull/models/submit_igms_credentials_request.rb +1 -1
  578. data/lib/repull/models/submit_lodgify_credentials_request.rb +1 -1
  579. data/lib/repull/models/submit_mews_credentials200_response.rb +1 -1
  580. data/lib/repull/models/submit_mews_credentials200_response_account_info.rb +1 -1
  581. data/lib/repull/models/submit_mews_credentials_request.rb +1 -1
  582. data/lib/repull/models/submit_mews_credentials_request_credentials.rb +1 -1
  583. data/lib/repull/models/submit_ownerrez_credentials_request.rb +1 -1
  584. data/lib/repull/models/submit_smoobu_credentials_request.rb +1 -1
  585. data/lib/repull/models/submit_smoobu_credentials_request_credentials.rb +1 -1
  586. data/lib/repull/models/submit_track_credentials200_response.rb +213 -0
  587. data/lib/repull/models/submit_track_credentials200_response_account_info.rb +222 -0
  588. data/lib/repull/models/submit_track_credentials200_response_first_sync.rb +157 -0
  589. data/lib/repull/models/submit_track_credentials_request.rb +184 -0
  590. data/lib/repull/models/submit_track_credentials_request_credentials.rb +332 -0
  591. data/lib/repull/models/submit_vrbo_credentials_request.rb +1 -1
  592. data/lib/repull/models/sync_airbnb_transactions200_response.rb +1 -1
  593. data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner.rb +1 -1
  594. data/lib/repull/models/sync_airbnb_transactions200_response_accounts_inner_error.rb +1 -1
  595. data/lib/repull/models/sync_airbnb_transactions_request.rb +1 -1
  596. data/lib/repull/models/test_webhook_request.rb +1 -1
  597. data/lib/repull/models/update_airbnb_booking_settings200_response.rb +1 -1
  598. data/lib/repull/models/update_airbnb_booking_settings200_response_data.rb +1 -1
  599. data/lib/repull/models/update_airbnb_booking_settings_request.rb +1 -1
  600. data/lib/repull/models/update_airbnb_booking_settings_request_advance_notice.rb +1 -1
  601. data/lib/repull/models/update_airbnb_booking_settings_request_booking_window.rb +1 -1
  602. data/lib/repull/models/update_airbnb_booking_settings_request_cancellation.rb +1 -1
  603. data/lib/repull/models/update_airbnb_booking_settings_request_cancellation_non_refundable.rb +1 -1
  604. data/lib/repull/models/update_airbnb_booking_settings_request_check_in.rb +1 -1
  605. data/lib/repull/models/update_airbnb_booking_settings_request_check_out.rb +1 -1
  606. data/lib/repull/models/update_airbnb_booking_settings_request_instant_book.rb +1 -1
  607. data/lib/repull/models/update_airbnb_booking_settings_request_preparation_time.rb +1 -1
  608. data/lib/repull/models/update_airbnb_checkin_guide200_response.rb +1 -1
  609. data/lib/repull/models/update_airbnb_checkin_guide200_response_data.rb +1 -1
  610. data/lib/repull/models/update_airbnb_checkin_guide200_response_data_steps_inner.rb +1 -1
  611. data/lib/repull/models/update_airbnb_checkin_guide_request.rb +1 -1
  612. data/lib/repull/models/update_airbnb_checkin_guide_request_steps_inner.rb +1 -1
  613. data/lib/repull/models/update_airbnb_listing_amenities200_response.rb +1 -1
  614. data/lib/repull/models/update_airbnb_listing_amenities200_response_data.rb +1 -1
  615. data/lib/repull/models/update_airbnb_listing_amenities_request.rb +1 -1
  616. data/lib/repull/models/update_airbnb_listing_amenities_request_accessibility_amenities_inner.rb +1 -1
  617. data/lib/repull/models/update_airbnb_listing_amenities_request_amenities_inner.rb +1 -1
  618. data/lib/repull/models/update_airbnb_listing_permits200_response.rb +1 -1
  619. data/lib/repull/models/update_airbnb_listing_photo200_response.rb +1 -1
  620. data/lib/repull/models/update_airbnb_listing_photo_request.rb +1 -1
  621. data/lib/repull/models/update_airbnb_listing_room200_response.rb +1 -1
  622. data/lib/repull/models/update_airbnb_listing_room_request.rb +1 -1
  623. data/lib/repull/models/update_airbnb_listing_room_request_beds_inner.rb +1 -1
  624. data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner.rb +1 -1
  625. data/lib/repull/models/update_airbnb_listing_room_request_room_amenities_inner_value.rb +1 -1
  626. data/lib/repull/models/update_airbnb_listing_safety_disclosures200_response.rb +1 -1
  627. data/lib/repull/models/update_airbnb_message_request.rb +1 -1
  628. data/lib/repull/models/update_booking_charges_request.rb +1 -1
  629. data/lib/repull/models/update_booking_content_request.rb +1 -1
  630. data/lib/repull/models/update_booking_content_request_content_data_inner.rb +1 -1
  631. data/lib/repull/models/update_booking_content_request_photos_inner.rb +1 -1
  632. data/lib/repull/models/update_connect_write_policy_request.rb +1 -1
  633. data/lib/repull/models/update_connect_write_policy_request_calendar.rb +1 -1
  634. data/lib/repull/models/update_connect_write_policy_request_reservations.rb +1 -1
  635. data/lib/repull/models/update_listing_pricing_strategy200_response.rb +1 -1
  636. data/lib/repull/models/update_webhook_request.rb +1 -1
  637. data/lib/repull/models/upload_airbnb_listing_photos_request.rb +1 -1
  638. data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner.rb +1 -1
  639. data/lib/repull/models/upload_airbnb_listing_photos_request_photos_inner_listing_id.rb +1 -1
  640. data/lib/repull/models/usage_quota_warning_event.rb +1 -1
  641. data/lib/repull/models/usage_quota_warning_payload.rb +1 -1
  642. data/lib/repull/models/usage_quota_warning_payload_top_operation.rb +1 -1
  643. data/lib/repull/models/vrbo_import_status.rb +1 -1
  644. data/lib/repull/models/vrbo_listing.rb +1 -1
  645. data/lib/repull/models/vrbo_login200_response.rb +1 -1
  646. data/lib/repull/models/vrbo_login_request.rb +1 -1
  647. data/lib/repull/models/vrbo_reservation.rb +1 -1
  648. data/lib/repull/models/vrbo_reservation_list_response.rb +1 -1
  649. data/lib/repull/models/webhook_delivery.rb +1 -1
  650. data/lib/repull/models/webhook_delivery_detail.rb +1 -1
  651. data/lib/repull/models/webhook_delivery_list_response.rb +1 -1
  652. data/lib/repull/models/webhook_event.rb +1 -1
  653. data/lib/repull/models/webhook_event_account.rb +1 -1
  654. data/lib/repull/models/webhook_event_catalog.rb +1 -1
  655. data/lib/repull/models/webhook_event_catalog_domains_inner.rb +1 -1
  656. data/lib/repull/models/webhook_event_catalog_entry.rb +1 -1
  657. data/lib/repull/models/webhook_event_type.rb +1 -1
  658. data/lib/repull/models/webhook_list_response.rb +1 -1
  659. data/lib/repull/models/webhook_subscription.rb +1 -1
  660. data/lib/repull/models/withdraw_conversation_preapproval200_response.rb +1 -1
  661. data/lib/repull/models/withdraw_conversation_special_offer200_response.rb +1 -1
  662. data/lib/repull/version.rb +2 -2
  663. data/lib/repull.rb +10 -1
  664. data/openapi/v1.json +377 -3
  665. data/scripts/regen.sh +1 -1
  666. metadata +11 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e8fbc23eb3c3a2167a88f127699dcb1e2e3c8d7e8560b326a0c1fd34119089f
4
- data.tar.gz: dc06a931b4c2a1aeb5d18c33ec90783980926bdd10280655d99e0de42b2ea64f
3
+ metadata.gz: 983a3a420ae0f025e199f4d46ceb6756d52d5ab458999db33fcc69d5879c15c5
4
+ data.tar.gz: b42f6bbfca55482fd579adc0cfbe72023f93affc99b86b8763a1424c0c8ede35
5
5
  SHA512:
6
- metadata.gz: 0b81eee51bf0a9c4eebeaa63626cd8cd1d3f177cdd3e70a90da91f12f3f8fadd8b5347c46911b42e958303cce7bcc22c79f4b99da6fd7ca8d57c04787419919f
7
- data.tar.gz: 640e651cf434400925d6cc435b9994fdd41526fa14f4a3dcdacf607d4d2b24da1a89aa0cfbccfedd9e22b9e6c132cb47124122db297dd4c084d231a4911d0180
6
+ metadata.gz: c5c2578223f4ae8b8fe7a9b27f30839f807068f6d12b292024b12d2409650e62600e20e543c019bde6cf8db99fa44c652da60ec96b3c85783fe2b483cb01257c
7
+ data.tar.gz: '024581228228769ad7533e8745d92ada228fd836a25d4825f76cf9c49b02b87de520d39f1b011fc3d775487426c7a0ab641c79d8290bb07b0c897c199b0f2e60'
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -930,6 +930,138 @@ module Repull
930
930
  return data, status_code, headers
931
931
  end
932
932
 
933
+ # Re-check Booking.com direct-login permissions
934
+ # Re-runs the account import for a Booking.com direct-login connection after the host has granted the invited user full access in the Booking.com extranet (the `needs_permissions` state). Permissions are probed again and, once full access is in place, the connection continues to property details and room mapping — no new invitation is sent. Poll `GET /v1/connect/booking-extranet-login/status` for the result. Called by the hosted Connect page. No API key — the session ID is the capability token.
935
+ # @param recheck_booking_extranet_login_request [RecheckBookingExtranetLoginRequest]
936
+ # @param [Hash] opts the optional parameters
937
+ # @return [RecheckBookingExtranetLogin200Response]
938
+ def recheck_booking_extranet_login(recheck_booking_extranet_login_request, opts = {})
939
+ data, _status_code, _headers = recheck_booking_extranet_login_with_http_info(recheck_booking_extranet_login_request, opts)
940
+ data
941
+ end
942
+
943
+ # Re-check Booking.com direct-login permissions
944
+ # Re-runs the account import for a Booking.com direct-login connection after the host has granted the invited user full access in the Booking.com extranet (the `needs_permissions` state). Permissions are probed again and, once full access is in place, the connection continues to property details and room mapping — no new invitation is sent. Poll `GET /v1/connect/booking-extranet-login/status` for the result. Called by the hosted Connect page. No API key — the session ID is the capability token.
945
+ # @param recheck_booking_extranet_login_request [RecheckBookingExtranetLoginRequest]
946
+ # @param [Hash] opts the optional parameters
947
+ # @return [Array<(RecheckBookingExtranetLogin200Response, Integer, Hash)>] RecheckBookingExtranetLogin200Response data, response status code and response headers
948
+ def recheck_booking_extranet_login_with_http_info(recheck_booking_extranet_login_request, opts = {})
949
+ if @api_client.config.debugging
950
+ @api_client.config.logger.debug 'Calling API: ConnectApi.recheck_booking_extranet_login ...'
951
+ end
952
+ # verify the required parameter 'recheck_booking_extranet_login_request' is set
953
+ if @api_client.config.client_side_validation && recheck_booking_extranet_login_request.nil?
954
+ fail ArgumentError, "Missing the required parameter 'recheck_booking_extranet_login_request' when calling ConnectApi.recheck_booking_extranet_login"
955
+ end
956
+ # resource path
957
+ local_var_path = '/v1/connect/booking-extranet-login/recheck'
958
+
959
+ # query parameters
960
+ query_params = opts[:query_params] || {}
961
+
962
+ # header parameters
963
+ header_params = opts[:header_params] || {}
964
+ # HTTP header 'Accept' (if needed)
965
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
966
+ # HTTP header 'Content-Type'
967
+ content_type = @api_client.select_header_content_type(['application/json'])
968
+ if !content_type.nil?
969
+ header_params['Content-Type'] = content_type
970
+ end
971
+
972
+ # form parameters
973
+ form_params = opts[:form_params] || {}
974
+
975
+ # http body (model)
976
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(recheck_booking_extranet_login_request)
977
+
978
+ # return_type
979
+ return_type = opts[:debug_return_type] || 'RecheckBookingExtranetLogin200Response'
980
+
981
+ # auth_names
982
+ auth_names = opts[:debug_auth_names] || []
983
+
984
+ new_options = opts.merge(
985
+ :operation => :"ConnectApi.recheck_booking_extranet_login",
986
+ :header_params => header_params,
987
+ :query_params => query_params,
988
+ :form_params => form_params,
989
+ :body => post_body,
990
+ :auth_names => auth_names,
991
+ :return_type => return_type
992
+ )
993
+
994
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
995
+ if @api_client.config.debugging
996
+ @api_client.config.logger.debug "API called: ConnectApi#recheck_booking_extranet_login\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
997
+ end
998
+ return data, status_code, headers
999
+ end
1000
+
1001
+ # Open a connection's fix link
1002
+ # The target of a connection's `fixUrl`. Open it in the host's browser to send them back into Connect for an EXISTING connection — for example to grant the Booking.com extranet user full access after a `needs_permissions` state, or to reconnect a Smoobu account that still uses a legacy single API key with an API key + secret. Each open starts a fresh, short-lived Connect session bound to that connection and redirects (302) to the hosted Connect page, which shows the connection's current state. The link itself does not expire on its own schedule — store `fixUrl` and open it whenever the connection needs attention. No API key — the signed `t` token is the capability. Supported for Booking.com extranet login and Smoobu connections.
1003
+ # @param t [String] The signed resume token, exactly as it appears in the connection&#39;s &#x60;fixUrl&#x60;.
1004
+ # @param [Hash] opts the optional parameters
1005
+ # @return [nil]
1006
+ def resume_connect(t, opts = {})
1007
+ resume_connect_with_http_info(t, opts)
1008
+ nil
1009
+ end
1010
+
1011
+ # Open a connection&#39;s fix link
1012
+ # The target of a connection&#39;s &#x60;fixUrl&#x60;. Open it in the host&#39;s browser to send them back into Connect for an EXISTING connection — for example to grant the Booking.com extranet user full access after a &#x60;needs_permissions&#x60; state, or to reconnect a Smoobu account that still uses a legacy single API key with an API key + secret. Each open starts a fresh, short-lived Connect session bound to that connection and redirects (302) to the hosted Connect page, which shows the connection&#39;s current state. The link itself does not expire on its own schedule — store &#x60;fixUrl&#x60; and open it whenever the connection needs attention. No API key — the signed &#x60;t&#x60; token is the capability. Supported for Booking.com extranet login and Smoobu connections.
1013
+ # @param t [String] The signed resume token, exactly as it appears in the connection&#39;s &#x60;fixUrl&#x60;.
1014
+ # @param [Hash] opts the optional parameters
1015
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
1016
+ def resume_connect_with_http_info(t, opts = {})
1017
+ if @api_client.config.debugging
1018
+ @api_client.config.logger.debug 'Calling API: ConnectApi.resume_connect ...'
1019
+ end
1020
+ # verify the required parameter 't' is set
1021
+ if @api_client.config.client_side_validation && t.nil?
1022
+ fail ArgumentError, "Missing the required parameter 't' when calling ConnectApi.resume_connect"
1023
+ end
1024
+ # resource path
1025
+ local_var_path = '/v1/connect/resume'
1026
+
1027
+ # query parameters
1028
+ query_params = opts[:query_params] || {}
1029
+ query_params[:'t'] = t
1030
+
1031
+ # header parameters
1032
+ header_params = opts[:header_params] || {}
1033
+ # HTTP header 'Accept' (if needed)
1034
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
1035
+
1036
+ # form parameters
1037
+ form_params = opts[:form_params] || {}
1038
+
1039
+ # http body (model)
1040
+ post_body = opts[:debug_body]
1041
+
1042
+ # return_type
1043
+ return_type = opts[:debug_return_type]
1044
+
1045
+ # auth_names
1046
+ auth_names = opts[:debug_auth_names] || []
1047
+
1048
+ new_options = opts.merge(
1049
+ :operation => :"ConnectApi.resume_connect",
1050
+ :header_params => header_params,
1051
+ :query_params => query_params,
1052
+ :form_params => form_params,
1053
+ :body => post_body,
1054
+ :auth_names => auth_names,
1055
+ :return_type => return_type
1056
+ )
1057
+
1058
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
1059
+ if @api_client.config.debugging
1060
+ @api_client.config.logger.debug "API called: ConnectApi#resume_connect\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
1061
+ end
1062
+ return data, status_code, headers
1063
+ end
1064
+
933
1065
  # Search listings for a Connect mapping picker
934
1066
  # The hosted Connect pages' listing search for their mapping pickers: the session workspace's active listings by name, city or id, `limit` at a time. Called by the hosted Connect page. No API key — the session ID is the capability token.
935
1067
  # @param session_id [String]
@@ -1897,6 +2029,74 @@ module Repull
1897
2029
  return data, status_code, headers
1898
2030
  end
1899
2031
 
2032
+ # Submit Track credentials for a Connect session
2033
+ # Completes a credentials-pattern connection for Track (TRACK Hospitality Software) with the property manager's Track domain and an API key + secret. **What syncs.** Units become listings; reservations (with their fee and tax breakdown) and guest message threads are imported, then polled for changes. Bookings can be created, quoted, changed and cancelled in Track — see `capabilities.reservations` on `GET /v1/connect/track`. **Which key.** A **Server Key** — created in Track under Configuration → Company Setup → API Keys — has full access and is recommended. A **Channel Key** — under Configuration → PMS Setup → Distribution Channels — only allows booking. `keyType` defaults to `server`. The key is validated against Track before anything is stored, so an invalid key returns `invalid_credentials` rather than creating a dead connection. On success only the credential fields below are stored, and the first sync of listings and reservations is queued. Track has no webhooks: after the first sync, reservation and message changes are picked up by polling about once a minute. Reconnecting replaces the stored credentials on the workspace's existing Track connection — the `pmsConnectionId` stays the same. No API key required when called with a `sessionId` — the session is the capability token.
2034
+ # @param submit_track_credentials_request [SubmitTrackCredentialsRequest]
2035
+ # @param [Hash] opts the optional parameters
2036
+ # @return [SubmitTrackCredentials200Response]
2037
+ def submit_track_credentials(submit_track_credentials_request, opts = {})
2038
+ data, _status_code, _headers = submit_track_credentials_with_http_info(submit_track_credentials_request, opts)
2039
+ data
2040
+ end
2041
+
2042
+ # Submit Track credentials for a Connect session
2043
+ # Completes a credentials-pattern connection for Track (TRACK Hospitality Software) with the property manager&#39;s Track domain and an API key + secret. **What syncs.** Units become listings; reservations (with their fee and tax breakdown) and guest message threads are imported, then polled for changes. Bookings can be created, quoted, changed and cancelled in Track — see &#x60;capabilities.reservations&#x60; on &#x60;GET /v1/connect/track&#x60;. **Which key.** A **Server Key** — created in Track under Configuration → Company Setup → API Keys — has full access and is recommended. A **Channel Key** — under Configuration → PMS Setup → Distribution Channels — only allows booking. &#x60;keyType&#x60; defaults to &#x60;server&#x60;. The key is validated against Track before anything is stored, so an invalid key returns &#x60;invalid_credentials&#x60; rather than creating a dead connection. On success only the credential fields below are stored, and the first sync of listings and reservations is queued. Track has no webhooks: after the first sync, reservation and message changes are picked up by polling about once a minute. Reconnecting replaces the stored credentials on the workspace&#39;s existing Track connection — the &#x60;pmsConnectionId&#x60; stays the same. No API key required when called with a &#x60;sessionId&#x60; — the session is the capability token.
2044
+ # @param submit_track_credentials_request [SubmitTrackCredentialsRequest]
2045
+ # @param [Hash] opts the optional parameters
2046
+ # @return [Array<(SubmitTrackCredentials200Response, Integer, Hash)>] SubmitTrackCredentials200Response data, response status code and response headers
2047
+ def submit_track_credentials_with_http_info(submit_track_credentials_request, opts = {})
2048
+ if @api_client.config.debugging
2049
+ @api_client.config.logger.debug 'Calling API: ConnectApi.submit_track_credentials ...'
2050
+ end
2051
+ # verify the required parameter 'submit_track_credentials_request' is set
2052
+ if @api_client.config.client_side_validation && submit_track_credentials_request.nil?
2053
+ fail ArgumentError, "Missing the required parameter 'submit_track_credentials_request' when calling ConnectApi.submit_track_credentials"
2054
+ end
2055
+ # resource path
2056
+ local_var_path = '/v1/connect/track/credentials'
2057
+
2058
+ # query parameters
2059
+ query_params = opts[:query_params] || {}
2060
+
2061
+ # header parameters
2062
+ header_params = opts[:header_params] || {}
2063
+ # HTTP header 'Accept' (if needed)
2064
+ header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept']
2065
+ # HTTP header 'Content-Type'
2066
+ content_type = @api_client.select_header_content_type(['application/json'])
2067
+ if !content_type.nil?
2068
+ header_params['Content-Type'] = content_type
2069
+ end
2070
+
2071
+ # form parameters
2072
+ form_params = opts[:form_params] || {}
2073
+
2074
+ # http body (model)
2075
+ post_body = opts[:debug_body] || @api_client.object_to_http_body(submit_track_credentials_request)
2076
+
2077
+ # return_type
2078
+ return_type = opts[:debug_return_type] || 'SubmitTrackCredentials200Response'
2079
+
2080
+ # auth_names
2081
+ auth_names = opts[:debug_auth_names] || ['bearerAuth']
2082
+
2083
+ new_options = opts.merge(
2084
+ :operation => :"ConnectApi.submit_track_credentials",
2085
+ :header_params => header_params,
2086
+ :query_params => query_params,
2087
+ :form_params => form_params,
2088
+ :body => post_body,
2089
+ :auth_names => auth_names,
2090
+ :return_type => return_type
2091
+ )
2092
+
2093
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
2094
+ if @api_client.config.debugging
2095
+ @api_client.config.logger.debug "API called: ConnectApi#submit_track_credentials\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
2096
+ end
2097
+ return data, status_code, headers
2098
+ end
2099
+
1900
2100
  # Submit Vrbo credentials for a Connect session
1901
2101
  # Completes a credentials-pattern connection for Vrbo. Activation handshake — Repull mints the Basic-Auth pair the host pastes into Vrbo Partner Central. The credentials are validated against Vrbo before anything is persisted, so an invalid pair returns `invalid_credentials` rather than creating a dead connection. On success the `pms_connections` row is written and the Connect session moves to its terminal state. No API key required when called with a `sessionId` — the session is the capability token.
1902
2102
  # @param submit_vrbo_credentials_request [SubmitVrboCredentialsRequest]
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7
 
@@ -1,7 +1,7 @@
1
1
  =begin
2
2
  #Repull API
3
3
 
4
- #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | 50 | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
4
+ #The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_live_YOUR_API_KEY ``` ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resetsAt` fields. ## Plan Limits (402 — `listings_limit_exceeded`) The Repull API also enforces a per-tier cap on **active listings**: | Tier | Active listings cap | |---|---| | `free` | 3 | | `starter` | unlimited (10 included, then billed per listing) | | `custom` | unlimited | When a customer's active-listing count is above their tier cap, the API returns **`402 Payment Required`** with `error.code = \"listings_limit_exceeded\"` on every route EXCEPT: - `/v1/health` — uptime probes are never gated. - `/v1/usage/*` — so dashboards can render the over-cap state. - Any `DELETE` — so the customer can trim listings to get back under the cap without paying. Unlike 429, 402 is NOT a \"wait and retry\" condition — `Retry-After` is not set. The only paths back to 200 are: 1. `DELETE` enough listings to come back under the cap, or 2. Upgrade at `https://repull.dev/dashboard/billing`. The server-side usage cache is 60s, so the first 200 after an upgrade may take up to a minute. The envelope mirrors `rate_limit_exceeded` for SDK ergonomics: `tier`, `limit`, `active_listings`, `upgrade_url`, plus the standard `code` / `message` / `fix` / `docs_url` / `request_id`.
5
5
 
6
6
  The version of the OpenAPI document: 1.0.0
7
7