bytekit-sdk 0.5.2__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/CHANGELOG.md +92 -0
  2. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/PKG-INFO +16 -8
  3. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/README.md +15 -7
  4. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/pyproject.toml +1 -1
  5. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/bulk/create_bulk.py +12 -0
  6. bytekit_sdk-0.6.0/src/bytekit/api/bulk/list_bulk_screenshots.py +294 -0
  7. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch_bulk/create_fetch_bulk.py +16 -0
  8. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch_bulk/get_fetch_bulk.py +69 -5
  9. bytekit_sdk-0.6.0/src/bytekit/api/scrape/create_scrape.py +341 -0
  10. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/scrape_bulk/create_scrape_bulk.py +16 -12
  11. bytekit_sdk-0.6.0/src/bytekit/api/scrape_bulk/get_scrape_bulk.py +264 -0
  12. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/errors.py +31 -1
  13. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/__init__.py +44 -0
  14. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_session_response.py +15 -1
  15. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/bandwidth_balance.py +5 -3
  16. bytekit_sdk-0.6.0/src/bytekit/models/bulk_job_counters.py +76 -0
  17. bytekit_sdk-0.6.0/src/bytekit/models/bulk_mandatory_scrape_item.py +147 -0
  18. bytekit_sdk-0.6.0/src/bytekit/models/bulk_mandatory_scrape_item_error.py +105 -0
  19. bytekit_sdk-0.6.0/src/bytekit/models/bulk_mandatory_scrape_item_formats.py +232 -0
  20. bytekit_sdk-0.6.0/src/bytekit/models/bulk_mandatory_scrape_item_terminal_outcome.py +12 -0
  21. bytekit_sdk-0.6.0/src/bytekit/models/bulk_mandatory_scrape_item_type.py +8 -0
  22. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_200.py +25 -2
  23. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_200_items_item.py +162 -78
  24. bytekit_sdk-0.6.0/src/bytekit/models/get_fetch_bulk_response_200_items_item_terminal_outcome.py +12 -0
  25. bytekit_sdk-0.6.0/src/bytekit/models/get_fetch_bulk_response_200_items_item_type.py +8 -0
  26. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_202.py +25 -2
  27. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_202_items_item.py +162 -78
  28. bytekit_sdk-0.6.0/src/bytekit/models/get_fetch_bulk_response_202_items_item_terminal_outcome.py +12 -0
  29. bytekit_sdk-0.6.0/src/bytekit/models/get_fetch_bulk_response_202_items_item_type.py +8 -0
  30. bytekit_sdk-0.6.0/src/bytekit/models/get_fetch_bulk_status.py +12 -0
  31. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_scrape_bulk_response_200.py +54 -10
  32. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_scrape_bulk_response_202.py +52 -9
  33. bytekit_sdk-0.6.0/src/bytekit/models/get_scrape_bulk_status.py +12 -0
  34. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_response_200.py +7 -5
  35. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_bulk_screenshots_response_200.py +35 -0
  36. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_bulk_screenshots_response_200_items_item.py +165 -54
  37. bytekit_sdk-0.6.0/src/bytekit/models/list_bulk_screenshots_response_200_items_item_artifacts.py +211 -0
  38. bytekit_sdk-0.6.0/src/bytekit/models/list_bulk_screenshots_response_200_items_item_terminal_outcome.py +12 -0
  39. bytekit_sdk-0.6.0/src/bytekit/models/list_bulk_screenshots_status.py +12 -0
  40. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request.py +1 -1
  41. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_scrape_options.py +1 -1
  42. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_response.py +4 -2
  43. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response.py +4 -2
  44. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_error_envelope.py +3 -2
  45. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_queued_envelope.py +4 -2
  46. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request.py +10 -2
  47. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_success_envelope.py +8 -4
  48. bytekit_sdk-0.5.2/src/bytekit/api/bulk/list_bulk_screenshots.py +0 -198
  49. bytekit_sdk-0.5.2/src/bytekit/api/scrape/create_scrape.py +0 -200
  50. bytekit_sdk-0.5.2/src/bytekit/api/scrape_bulk/get_scrape_bulk.py +0 -160
  51. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/.gitignore +0 -0
  52. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/LICENSE +0 -0
  53. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/__init__.py +0 -0
  54. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/__init__.py +0 -0
  55. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/account/__init__.py +0 -0
  56. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/account/get_account.py +0 -0
  57. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/bulk/__init__.py +0 -0
  58. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/bulk/delete_bulk.py +0 -0
  59. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/bulk/get_bulk.py +0 -0
  60. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch/__init__.py +0 -0
  61. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch/get_fetch.py +0 -0
  62. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch/post_fetch.py +0 -0
  63. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/fetch_bulk/__init__.py +0 -0
  64. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/__init__.py +0 -0
  65. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/create_monitor.py +0 -0
  66. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/delete_monitor.py +0 -0
  67. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/get_monitor.py +0 -0
  68. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/list_monitor_captures.py +0 -0
  69. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/list_monitors.py +0 -0
  70. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/monitors/update_monitor.py +0 -0
  71. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/scrape/__init__.py +0 -0
  72. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/scrape/get_scrape.py +0 -0
  73. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/scrape_bulk/__init__.py +0 -0
  74. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/screenshots/__init__.py +0 -0
  75. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/screenshots/create_screenshot.py +0 -0
  76. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/screenshots/get_screenshot.py +0 -0
  77. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/search/__init__.py +0 -0
  78. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/search/create_search.py +0 -0
  79. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/sitemap/__init__.py +0 -0
  80. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/sitemap/create_sitemap.py +0 -0
  81. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/sitemap/get_sitemap.py +0 -0
  82. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/usage/__init__.py +0 -0
  83. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/usage/get_usage.py +0 -0
  84. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/usage/get_usage_by_endpoint.py +0 -0
  85. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/usage/get_usage_daily.py +0 -0
  86. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/webhooks/__init__.py +0 -0
  87. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/webhooks/list_webhook_deliveries.py +0 -0
  88. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/api/webhooks/retry_webhook_delivery.py +0 -0
  89. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/client.py +0 -0
  90. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response.py +0 -0
  91. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_api_key.py +0 -0
  92. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_api_key_environment.py +0 -0
  93. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_auto_topup.py +0 -0
  94. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_plan.py +0 -0
  95. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_subscription.py +0 -0
  96. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_subscription_plan.py +0 -0
  97. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_bearer_response_subscription_status.py +0 -0
  98. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_session_response_notifications.py +0 -0
  99. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/account_session_response_plan.py +0 -0
  100. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/billing_factor.py +0 -0
  101. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/billing_factor_name.py +0 -0
  102. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/billing_node.py +0 -0
  103. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/capture_response.py +0 -0
  104. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/capture_response_outcome.py +0 -0
  105. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/clip.py +0 -0
  106. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body.py +0 -0
  107. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults.py +0 -0
  108. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_device.py +0 -0
  109. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_1.py +0 -0
  110. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_2_type_1.py +0 -0
  111. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_3_type_1.py +0 -0
  112. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_formats_item.py +0 -0
  113. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_type.py +0 -0
  114. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_viewport_type_0.py +0 -0
  115. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_defaults_wait_until.py +0 -0
  116. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item.py +0 -0
  117. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_device.py +0 -0
  118. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_formats_item.py +0 -0
  119. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_scenario.py +0 -0
  120. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_type.py +0 -0
  121. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_viewport_type_0.py +0 -0
  122. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_body_items_item_wait_until.py +0 -0
  123. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_response_202.py +0 -0
  124. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_bulk_response_202_status.py +0 -0
  125. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_fetch_bulk_body.py +0 -0
  126. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_fetch_bulk_body_defaults.py +0 -0
  127. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_fetch_bulk_body_urls_item_type_1.py +0 -0
  128. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_fetch_bulk_response_202.py +0 -0
  129. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_fetch_bulk_response_202_status.py +0 -0
  130. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body.py +0 -0
  131. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_custom.py +0 -0
  132. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_defaults.py +0 -0
  133. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_defaults_formats_item.py +0 -0
  134. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_items_item.py +0 -0
  135. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_items_item_custom.py +0 -0
  136. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_body_items_item_formats_item.py +0 -0
  137. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_response_202.py +0 -0
  138. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_scrape_bulk_response_202_status.py +0 -0
  139. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_body.py +0 -0
  140. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_body_date_range.py +0 -0
  141. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_body_type.py +0 -0
  142. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_response_200.py +0 -0
  143. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_response_200_results_item.py +0 -0
  144. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_response_200_results_item_image.py +0 -0
  145. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_response_502.py +0 -0
  146. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/create_search_response_502_error.py +0 -0
  147. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/credit_balance.py +0 -0
  148. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/delete_bulk_response_200.py +0 -0
  149. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/delete_bulk_response_200_status.py +0 -0
  150. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/error.py +0 -0
  151. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/error_error.py +0 -0
  152. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/error_status.py +0 -0
  153. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/fetch_request.py +0 -0
  154. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/fetch_request_cache_ttl_type_1.py +0 -0
  155. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/fetch_request_custom.py +0 -0
  156. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_bulk_response_200.py +0 -0
  157. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_bulk_response_200_status.py +0 -0
  158. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_bulk_response_202.py +0 -0
  159. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_bulk_response_202_status.py +0 -0
  160. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_200_items_item_status.py +0 -0
  161. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_200_status.py +0 -0
  162. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_202_items_item_status.py +0 -0
  163. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_bulk_response_202_status.py +0 -0
  164. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_fetch_cache_ttl_type_1.py +0 -0
  165. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_scrape_bulk_response_200_status.py +0 -0
  166. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_scrape_bulk_response_202_status.py +0 -0
  167. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_by_endpoint_response_200.py +0 -0
  168. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_by_endpoint_response_200_rows_item.py +0 -0
  169. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_by_endpoint_response_200_rows_item_endpoint.py +0 -0
  170. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_by_endpoint_response_200_totals.py +0 -0
  171. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_daily_response_200.py +0 -0
  172. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_daily_response_200_data_item.py +0 -0
  173. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/get_usage_response_200_plan_type.py +0 -0
  174. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_bulk_screenshots_response_200_items_item_status.py +0 -0
  175. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_bulk_screenshots_response_200_items_item_type.py +0 -0
  176. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_monitor_captures_response_200.py +0 -0
  177. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_monitors_response_200.py +0 -0
  178. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_monitors_status.py +0 -0
  179. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_webhook_deliveries_response_200.py +0 -0
  180. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/list_webhook_deliveries_status.py +0 -0
  181. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/metadata.py +0 -0
  182. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_interval_type.py +0 -0
  183. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_notify_on.py +0 -0
  184. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_options.py +0 -0
  185. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_type.py +0 -0
  186. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_create_request_webhook_headers.py +0 -0
  187. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response_interval_type.py +0 -0
  188. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response_metadata_type_0.py +0 -0
  189. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response_status.py +0 -0
  190. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response_type.py +0 -0
  191. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_response_webhook_headers_type_0.py +0 -0
  192. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request.py +0 -0
  193. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_interval_type.py +0 -0
  194. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_notify_on.py +0 -0
  195. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_options.py +0 -0
  196. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_scrape_options.py +0 -0
  197. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_status.py +0 -0
  198. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/monitor_update_request_webhook_headers.py +0 -0
  199. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_error_envelope_error.py +0 -0
  200. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_error_envelope_error_code.py +0 -0
  201. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_error_envelope_schema_version.py +0 -0
  202. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_error_envelope_status.py +0 -0
  203. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_formats.py +0 -0
  204. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_markdown_tokens.py +0 -0
  205. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_metadata.py +0 -0
  206. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_queued_envelope_schema_version.py +0 -0
  207. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_queued_envelope_status.py +0 -0
  208. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_cache_ttl_type_1.py +0 -0
  209. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_custom.py +0 -0
  210. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_events_item.py +0 -0
  211. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_formats_item.py +0 -0
  212. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_markdown_images.py +0 -0
  213. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_markdown_links.py +0 -0
  214. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_markdown_mode.py +0 -0
  215. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_token_encoding.py +0 -0
  216. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_request_x_internal_scrape_path.py +0 -0
  217. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_scored_image.py +0 -0
  218. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_scored_link.py +0 -0
  219. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_stats.py +0 -0
  220. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_success_envelope_cache.py +0 -0
  221. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_success_envelope_custom.py +0 -0
  222. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_success_envelope_schema_version.py +0 -0
  223. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_success_envelope_status.py +0 -0
  224. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_table.py +0 -0
  225. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_table_kind.py +0 -0
  226. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_warning.py +0 -0
  227. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/scrape_warning_code.py +0 -0
  228. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request.py +0 -0
  229. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_device.py +0 -0
  230. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_device_scale_factor_type_1.py +0 -0
  231. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_device_scale_factor_type_2_type_1.py +0 -0
  232. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_device_scale_factor_type_3_type_1.py +0 -0
  233. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_format.py +0 -0
  234. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_request_wait_until.py +0 -0
  235. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_response.py +0 -0
  236. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/screenshot_response_status.py +0 -0
  237. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_request.py +0 -0
  238. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_request_process_type_0.py +0 -0
  239. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_request_process_type_0_options.py +0 -0
  240. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_request_strategy.py +0 -0
  241. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response.py +0 -0
  242. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response_cache.py +0 -0
  243. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response_metadata_type_0.py +0 -0
  244. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response_process_type_0.py +0 -0
  245. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response_sources_type_0.py +0 -0
  246. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/sitemap_response_status.py +0 -0
  247. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/viewport.py +0 -0
  248. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/webhook_delivery_response.py +0 -0
  249. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/webhook_delivery_response_event_type.py +0 -0
  250. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/models/webhook_delivery_response_status.py +0 -0
  251. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/py.typed +0 -0
  252. {bytekit_sdk-0.5.2 → bytekit_sdk-0.6.0}/src/bytekit/types.py +0 -0
@@ -5,6 +5,98 @@ PyPI distribution: `bytekit-sdk`. Import name: `bytekit`.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 0.6.0
9
+
10
+ _Release cut 2026-09-11._
11
+
12
+ ### Changed
13
+
14
+ - **`create_scrape` now raises on a terminal scrape failure, even though it arrives on a
15
+ `200`** (#1870). The synchronous `POST /v1/scrape` used to answer an unreachable host, a
16
+ refused connection, or a bot-protection block that defeated every proxy tier with a `503`.
17
+ It now answers `200` carrying the canonical `failed` envelope, because a failed fetch is a
18
+ result rather than a transport error. Left alone, the generated union would have parsed that
19
+ envelope and RETURNED it on the same arm a caller reads `.formats` from, so the most common
20
+ first-call shape — "it returned, so it worked" — would have silently succeeded on a failed
21
+ scrape. `create_scrape.sync` / `.sync_detailed` / `.asyncio` / `.asyncio_detailed` therefore
22
+ raise `errors.UnexpectedStatus` with `.status_code` `200` and `.code` / `.message` read off
23
+ the envelope's `error`; under `raise_on_unexpected_status=False` they return `None`, as for
24
+ any other unusable body.
25
+
26
+ The carve-out is that one call site. `get_scrape` still RETURNS the identical envelope as a
27
+ typed `ScrapeErrorEnvelope` — polling a job that failed is a successful poll — and every
28
+ documented 4xx/5xx on `create_scrape` still returns its typed `Error` model.
29
+
30
+ **Upgrading:** if you inspected the result of `create_scrape` for `status == "failed"`, move
31
+ that handling into an `except errors.UnexpectedStatus` block. Code that already caught
32
+ `UnexpectedStatus` needs no change.
33
+
34
+ ## 0.5.4 [NEVER PUBLISHED]
35
+
36
+ _Release cut 2026-09-06._
37
+
38
+ > **Never published to PyPI.** Publication is triggered by CI on `main` from the version
39
+ > `pyproject.toml` declares, and 0.6.0 (#1870) superseded 0.5.4 in the tree before any release
40
+ > reached `main` — no `bytekit-sdk` 0.5.4 artifact exists, so `pip install bytekit-sdk==0.5.4`
41
+ > fails. Everything below shipped to users in **0.6.0**, the first published release containing
42
+ > it.
43
+
44
+ ### Added
45
+
46
+ - Bulk fetch, scrape, and mixed-result models now publish cursor pagination, stable item
47
+ identities, whole-job counters, exact mixed artifact keys, artifact warnings, bounded
48
+ webhook recovery metadata, and the `artifact_unavailable` error contract (#3717).
49
+ Generated bulk read functions accept optional `cursor`, `limit`, and `status` parameters.
50
+
51
+ ### Fixed
52
+
53
+ - Corrected the artifact-URL fallback docstrings on `list_bulk_screenshots` (`image_url`,
54
+ `content_url`, `markdown_url`) and the `/v1/logs` row model (`artifact_url`) (#3717). Those
55
+ fields were documented as null-plus-`artifact_unavailable` when no signature can be minted;
56
+ the servers have always returned the row's stored value unchanged instead — `None` while
57
+ nothing is stored, and otherwise the private unsigned storage URL, which answers `401` — and
58
+ raise no warning. `get_fetch_bulk` does null the field and report `artifact_unavailable`, and
59
+ its docstring is unchanged. No server behaviour changed and no model moved; only the
60
+ documentation on them did.
61
+
62
+ ### Changed
63
+
64
+ - Regenerated `GetUsageResponse200` against the corrected `topup_balance_bytes` description
65
+ (#4251). The field's docstring read "Remaining purchased top-up bytes", which contradicted its
66
+ own "Equal to `topup_bytes`" clause: the value covers purchased top-up lots and the one-time
67
+ starter grant, which is what the endpoint has always returned. The clause recording that the
68
+ figure is already net of consumed overage, and the "Present only in dual/bytes billing mode"
69
+ clause, are both unchanged and still true. Types are unchanged and no server value changed;
70
+ only the documentation on them moved.
71
+ - Regenerated `ScrapeSuccessEnvelope` against the clarified `cache_age_s` description (#4237).
72
+ The field's docstring now records that `GET /v1/scrape/{id}` reports `cache: hit` without
73
+ `cache_age_s`: the age is a property of the replay that happened at completion time, is not
74
+ persisted on the row, and cannot be derived honestly afterwards. The one-directional
75
+ "Present only on `cache: hit`" clause is unchanged and still true. Types are unchanged; only
76
+ the documentation on them moved.
77
+ - Regenerated `ScrapeSuccessEnvelope` against the completed `cache` presence list (#4203).
78
+ The field's description now names `GET /v1/scrape/{id}` as a third delivery path, alongside
79
+ the synchronous response and webhook delivery: a polled scrape now reports the cache
80
+ disposition its row recorded, and omits the field — rather than defaulting it to `miss` — for
81
+ a row that recorded none. Types are unchanged; only the documentation on them moved.
82
+ - Regenerated `MonitorCreateRequestScrapeOptions` against the corrected `scrape_options`
83
+ documentation (#4024). The description no longer lists `headers` among the accepted
84
+ fields — `POST /v1/monitors` never honoured a caller-supplied `headers` option and now
85
+ rejects it with the same 400 every other capture endpoint returns for the field. Types are
86
+ unchanged; only the documentation on them moved.
87
+
88
+ ## 0.5.3
89
+
90
+ _Release cut 2026-09-05._
91
+
92
+ ### Changed
93
+
94
+ - Regenerated `ScrapeQueuedEnvelope` against the corrected `status_url` documentation (#3925).
95
+ `status_url` is a root-relative path, never an absolute URI: join it onto the API base URL you
96
+ called (`https://api.bytekit.com`, no trailing slash) to get the URL to poll. The spec had
97
+ declared it `format: uri` with an absolute example, which no server has ever emitted; the
98
+ emitted value is unchanged, so no client behaviour moves.
99
+
8
100
  ## 0.5.2
9
101
 
10
102
  _Release cut 2026-09-03._
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bytekit-sdk
3
- Version: 0.5.2
3
+ Version: 0.6.0
4
4
  Summary: Official Python SDK for the ByteKit API
5
5
  Project-URL: Homepage, https://bytekit.com
6
6
  Project-URL: Repository, https://github.com/Hunt-Labs-Inc/ByteKit
@@ -75,12 +75,19 @@ The SDK has a **two-tier** error contract. Both tiers are safe: an operation nev
75
75
  a bare `json.JSONDecodeError` or a bare `KeyError`, even when a server returns an HTML error
76
76
  page or a payload whose shape has drifted from the spec.
77
77
 
78
- | Situation | What you get |
79
- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
80
- | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body of the documented shape | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
81
- | An **undocumented** status, or a **non-JSON body on a documented status** (HTML error page, load-balancer text, empty body) | `errors.UnexpectedStatus` is **raised**, carrying `.status_code` and the raw `.content`. When the body is the documented `Error` envelope, `.code` / `.message` are populated too. |
82
- | A **documented status whose JSON body does not match the documented schema** — a field the server renamed, dropped or retyped | `errors.UnexpectedStatus` is **raised**, same shape as the row above. The underlying parse failure (e.g. `KeyError: 'schema_version'`) is attached as `__cause__` for diagnosis. |
83
- | Any of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
78
+ | Situation | What you get |
79
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
80
+ | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body of the documented shape | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
81
+ | An **undocumented** status, or a **non-JSON body on a documented status** (HTML error page, load-balancer text, empty body) | `errors.UnexpectedStatus` is **raised**, carrying `.status_code` and the raw `.content`. When the body is the documented `Error` envelope, `.code` / `.message` are populated too. |
82
+ | A **documented status whose JSON body does not match the documented schema** — a field the server renamed, dropped or retyped | `errors.UnexpectedStatus` is **raised**, same shape as the row above. The underlying parse failure (e.g. `KeyError: 'schema_version'`) is attached as `__cause__` for diagnosis. |
83
+ | A **`200` from `create_scrape` carrying a `status: "failed"` envelope** — a terminal upstream failure (unreachable host, refused connection, bot protection that defeats every proxy tier) | `errors.UnexpectedStatus` is **raised**, with `.status_code` `200` and `.code` / `.message` read off the envelope's `error`. `get_scrape` is unchanged: polling a job that failed still **returns** the typed `ScrapeErrorEnvelope`. |
84
+ | Any of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
85
+
86
+ A failed scrape is a _result_, not a transport error, so the API reports it on a `200` rather
87
+ than a 5xx — but a returned failure is exactly the shape a first call misreads as success
88
+ (`result.formats` on a `ScrapeErrorEnvelope` is an `AttributeError`). `create_scrape` therefore
89
+ raises it. The carve-out is that one call: the identical envelope from `get_scrape` is the
90
+ correct answer to "how did that job end?" and is still returned.
84
91
 
85
92
  The table describes the **generated operations** (`create_scrape.sync`, `get_usage.sync`, …),
86
93
  whose return types are `Optional[...]` accordingly. The hand-written
@@ -111,7 +118,8 @@ try:
111
118
  ),
112
119
  )
113
120
  except UnexpectedStatus as err:
114
- # Undocumented status, or a non-JSON body on a documented one. Never a JSONDecodeError.
121
+ # Undocumented status, a non-JSON body on a documented one, or a 200 whose envelope
122
+ # says the scrape itself failed. Never a JSONDecodeError.
115
123
  print(f"request failed with status {err.status_code}: {err.code} {err.message}")
116
124
  else:
117
125
  if isinstance(result, Error):
@@ -49,12 +49,19 @@ The SDK has a **two-tier** error contract. Both tiers are safe: an operation nev
49
49
  a bare `json.JSONDecodeError` or a bare `KeyError`, even when a server returns an HTML error
50
50
  page or a payload whose shape has drifted from the spec.
51
51
 
52
- | Situation | What you get |
53
- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
54
- | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body of the documented shape | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
55
- | An **undocumented** status, or a **non-JSON body on a documented status** (HTML error page, load-balancer text, empty body) | `errors.UnexpectedStatus` is **raised**, carrying `.status_code` and the raw `.content`. When the body is the documented `Error` envelope, `.code` / `.message` are populated too. |
56
- | A **documented status whose JSON body does not match the documented schema** — a field the server renamed, dropped or retyped | `errors.UnexpectedStatus` is **raised**, same shape as the row above. The underlying parse failure (e.g. `KeyError: 'schema_version'`) is attached as `__cause__` for diagnosis. |
57
- | Any of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
52
+ | Situation | What you get |
53
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
54
+ | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body of the documented shape | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
55
+ | An **undocumented** status, or a **non-JSON body on a documented status** (HTML error page, load-balancer text, empty body) | `errors.UnexpectedStatus` is **raised**, carrying `.status_code` and the raw `.content`. When the body is the documented `Error` envelope, `.code` / `.message` are populated too. |
56
+ | A **documented status whose JSON body does not match the documented schema** — a field the server renamed, dropped or retyped | `errors.UnexpectedStatus` is **raised**, same shape as the row above. The underlying parse failure (e.g. `KeyError: 'schema_version'`) is attached as `__cause__` for diagnosis. |
57
+ | A **`200` from `create_scrape` carrying a `status: "failed"` envelope** — a terminal upstream failure (unreachable host, refused connection, bot protection that defeats every proxy tier) | `errors.UnexpectedStatus` is **raised**, with `.status_code` `200` and `.code` / `.message` read off the envelope's `error`. `get_scrape` is unchanged: polling a job that failed still **returns** the typed `ScrapeErrorEnvelope`. |
58
+ | Any of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
59
+
60
+ A failed scrape is a _result_, not a transport error, so the API reports it on a `200` rather
61
+ than a 5xx — but a returned failure is exactly the shape a first call misreads as success
62
+ (`result.formats` on a `ScrapeErrorEnvelope` is an `AttributeError`). `create_scrape` therefore
63
+ raises it. The carve-out is that one call: the identical envelope from `get_scrape` is the
64
+ correct answer to "how did that job end?" and is still returned.
58
65
 
59
66
  The table describes the **generated operations** (`create_scrape.sync`, `get_usage.sync`, …),
60
67
  whose return types are `Optional[...]` accordingly. The hand-written
@@ -85,7 +92,8 @@ try:
85
92
  ),
86
93
  )
87
94
  except UnexpectedStatus as err:
88
- # Undocumented status, or a non-JSON body on a documented one. Never a JSONDecodeError.
95
+ # Undocumented status, a non-JSON body on a documented one, or a 200 whose envelope
96
+ # says the scrape itself failed. Never a JSONDecodeError.
89
97
  print(f"request failed with status {err.status_code}: {err.code} {err.message}")
90
98
  else:
91
99
  if isinstance(result, Error):
@@ -7,7 +7,7 @@
7
7
  # `pip install bytekit-sdk` yields a working `import bytekit`. Mirrors the npm sibling
8
8
  # @hunt-labs/bytekit-sdk.
9
9
  name = "bytekit-sdk"
10
- version = "0.5.2"
10
+ version = "0.6.0"
11
11
  description = "Official Python SDK for the ByteKit API"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -76,6 +76,9 @@ def sync_detailed(
76
76
  Provide `urls` (simple list) or `items` (per-item config), not both.
77
77
  Webhook deliveries include `X-ByteKit-Event: bulk.completed` so
78
78
  receivers can dispatch on the header without parsing the body shape.
79
+ The body follows `BulkCompletedWebhook`: at most 500 complete items and
80
+ 1 MiB, followed by cursor recovery through the existing mixed-item route
81
+ whenever `recovery_required` is true.
79
82
 
80
83
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
81
84
  with no `Content-Length` header is capped at 4 MB before your API key
@@ -140,6 +143,9 @@ def sync(
140
143
  Provide `urls` (simple list) or `items` (per-item config), not both.
141
144
  Webhook deliveries include `X-ByteKit-Event: bulk.completed` so
142
145
  receivers can dispatch on the header without parsing the body shape.
146
+ The body follows `BulkCompletedWebhook`: at most 500 complete items and
147
+ 1 MiB, followed by cursor recovery through the existing mixed-item route
148
+ whenever `recovery_required` is true.
143
149
 
144
150
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
145
151
  with no `Content-Length` header is capped at 4 MB before your API key
@@ -199,6 +205,9 @@ async def asyncio_detailed(
199
205
  Provide `urls` (simple list) or `items` (per-item config), not both.
200
206
  Webhook deliveries include `X-ByteKit-Event: bulk.completed` so
201
207
  receivers can dispatch on the header without parsing the body shape.
208
+ The body follows `BulkCompletedWebhook`: at most 500 complete items and
209
+ 1 MiB, followed by cursor recovery through the existing mixed-item route
210
+ whenever `recovery_required` is true.
202
211
 
203
212
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
204
213
  with no `Content-Length` header is capped at 4 MB before your API key
@@ -261,6 +270,9 @@ async def asyncio(
261
270
  Provide `urls` (simple list) or `items` (per-item config), not both.
262
271
  Webhook deliveries include `X-ByteKit-Event: bulk.completed` so
263
272
  receivers can dispatch on the header without parsing the body shape.
273
+ The body follows `BulkCompletedWebhook`: at most 500 complete items and
274
+ 1 MiB, followed by cursor recovery through the existing mixed-item route
275
+ whenever `recovery_required` is true.
264
276
 
265
277
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
266
278
  with no `Content-Length` header is capped at 4 MB before your API key
@@ -0,0 +1,294 @@
1
+ from typing import Any, Optional, Union
2
+ from urllib.parse import quote # BYTEKIT-PATH-QUOTE
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.list_bulk_screenshots_response_200 import ListBulkScreenshotsResponse200
9
+ from ...models.list_bulk_screenshots_status import ListBulkScreenshotsStatus
10
+ from ...types import UNSET, Response, Unset
11
+
12
+
13
+ def _get_kwargs(
14
+ id: str,
15
+ *,
16
+ cursor: Union[Unset, str] = UNSET,
17
+ limit: Union[Unset, int] = UNSET,
18
+ status: Union[Unset, ListBulkScreenshotsStatus] = UNSET,
19
+ ) -> dict[str, Any]:
20
+ params: dict[str, Any] = {}
21
+
22
+ params["cursor"] = cursor
23
+
24
+ params["limit"] = limit
25
+
26
+ json_status: Union[Unset, str] = UNSET
27
+ if not isinstance(status, Unset):
28
+ json_status = status.value
29
+
30
+ params["status"] = json_status
31
+
32
+ params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
33
+
34
+ _kwargs: dict[str, Any] = {
35
+ "method": "get",
36
+ "url": "/v1/bulk/{id}/screenshots".format(id=quote(str(id), safe="")),
37
+ "params": params,
38
+ }
39
+
40
+ return _kwargs
41
+
42
+
43
+ def _parse_response(
44
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
45
+ ) -> Optional[ListBulkScreenshotsResponse200]:
46
+ if response.status_code == 200:
47
+ response_200 = errors.bytekit_parse(ListBulkScreenshotsResponse200.from_dict, client=client, response=response)
48
+
49
+ return response_200
50
+ if client.raise_on_unexpected_status:
51
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
52
+ else:
53
+ return None
54
+
55
+
56
+ def _build_response(
57
+ *, client: Union[AuthenticatedClient, Client], response: httpx.Response
58
+ ) -> Response[ListBulkScreenshotsResponse200]:
59
+ return Response(
60
+ status_code=errors.bytekit_status_code(response.status_code), # BYTEKIT-STATUS-COERCE
61
+ content=response.content,
62
+ headers=response.headers,
63
+ parsed=_parse_response(client=client, response=response),
64
+ )
65
+
66
+
67
+ def sync_detailed(
68
+ id: str,
69
+ *,
70
+ client: Union[AuthenticatedClient, Client],
71
+ cursor: Union[Unset, str] = UNSET,
72
+ limit: Union[Unset, int] = UNSET,
73
+ status: Union[Unset, ListBulkScreenshotsStatus] = UNSET,
74
+ ) -> Response[ListBulkScreenshotsResponse200]:
75
+ """List bulk job items
76
+
77
+ Returns the bulk job's items, discriminated by `type`.
78
+
79
+ **Downloading item artifacts.** For a `completed` item with a storage key,
80
+ `image_url` (`type: screenshot`) and both `content_url` and `markdown_url`
81
+ (`type: scrape`) are **pre-signed** URLs, minted fresh on every read of
82
+ this endpoint and valid for **600 seconds (10 minutes)** —
83
+ the same signing lifetime as `content_url` on `GET /v1/fetch/bulk/{id}`.
84
+ Download inside that window, or re-poll this endpoint for a fresh
85
+ signature.
86
+
87
+ **When no signature is minted.** Three cases mint none: an item that is not
88
+ `completed`, a `completed` item with no storage key, and a `completed` item
89
+ whose object could not be signed — during an object-storage outage, for
90
+ instance. In all three the item's stored value is returned unchanged: `null`
91
+ while nothing has been stored, and otherwise a **private, unsigned**
92
+ object-storage URL that answers `401`. These fields are neither nulled nor
93
+ flagged in that case, so treat an artifact URL as usable only once you have
94
+ downloaded it, and re-poll for a fresh signature otherwise.
95
+ `artifact_warnings` and its `artifact_unavailable` code describe the sibling
96
+ `artifacts` object on `type: scrape` items only — they say nothing about
97
+ `image_url`, `content_url`, or `markdown_url`.
98
+
99
+ Args:
100
+ id (str):
101
+ cursor (Union[Unset, str]):
102
+ limit (Union[Unset, int]):
103
+ status (Union[Unset, ListBulkScreenshotsStatus]):
104
+
105
+ Raises:
106
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
107
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
108
+
109
+ Returns:
110
+ Response[ListBulkScreenshotsResponse200]
111
+ """
112
+
113
+ kwargs = _get_kwargs(
114
+ id=id,
115
+ cursor=cursor,
116
+ limit=limit,
117
+ status=status,
118
+ )
119
+
120
+ response = client.get_httpx_client().request(
121
+ **kwargs,
122
+ )
123
+
124
+ return _build_response(client=client, response=response)
125
+
126
+
127
+ def sync(
128
+ id: str,
129
+ *,
130
+ client: Union[AuthenticatedClient, Client],
131
+ cursor: Union[Unset, str] = UNSET,
132
+ limit: Union[Unset, int] = UNSET,
133
+ status: Union[Unset, ListBulkScreenshotsStatus] = UNSET,
134
+ ) -> Optional[ListBulkScreenshotsResponse200]:
135
+ """List bulk job items
136
+
137
+ Returns the bulk job's items, discriminated by `type`.
138
+
139
+ **Downloading item artifacts.** For a `completed` item with a storage key,
140
+ `image_url` (`type: screenshot`) and both `content_url` and `markdown_url`
141
+ (`type: scrape`) are **pre-signed** URLs, minted fresh on every read of
142
+ this endpoint and valid for **600 seconds (10 minutes)** —
143
+ the same signing lifetime as `content_url` on `GET /v1/fetch/bulk/{id}`.
144
+ Download inside that window, or re-poll this endpoint for a fresh
145
+ signature.
146
+
147
+ **When no signature is minted.** Three cases mint none: an item that is not
148
+ `completed`, a `completed` item with no storage key, and a `completed` item
149
+ whose object could not be signed — during an object-storage outage, for
150
+ instance. In all three the item's stored value is returned unchanged: `null`
151
+ while nothing has been stored, and otherwise a **private, unsigned**
152
+ object-storage URL that answers `401`. These fields are neither nulled nor
153
+ flagged in that case, so treat an artifact URL as usable only once you have
154
+ downloaded it, and re-poll for a fresh signature otherwise.
155
+ `artifact_warnings` and its `artifact_unavailable` code describe the sibling
156
+ `artifacts` object on `type: scrape` items only — they say nothing about
157
+ `image_url`, `content_url`, or `markdown_url`.
158
+
159
+ Args:
160
+ id (str):
161
+ cursor (Union[Unset, str]):
162
+ limit (Union[Unset, int]):
163
+ status (Union[Unset, ListBulkScreenshotsStatus]):
164
+
165
+ Raises:
166
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
167
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
168
+
169
+ Returns:
170
+ ListBulkScreenshotsResponse200
171
+ """
172
+
173
+ return sync_detailed(
174
+ id=id,
175
+ client=client,
176
+ cursor=cursor,
177
+ limit=limit,
178
+ status=status,
179
+ ).parsed
180
+
181
+
182
+ async def asyncio_detailed(
183
+ id: str,
184
+ *,
185
+ client: Union[AuthenticatedClient, Client],
186
+ cursor: Union[Unset, str] = UNSET,
187
+ limit: Union[Unset, int] = UNSET,
188
+ status: Union[Unset, ListBulkScreenshotsStatus] = UNSET,
189
+ ) -> Response[ListBulkScreenshotsResponse200]:
190
+ """List bulk job items
191
+
192
+ Returns the bulk job's items, discriminated by `type`.
193
+
194
+ **Downloading item artifacts.** For a `completed` item with a storage key,
195
+ `image_url` (`type: screenshot`) and both `content_url` and `markdown_url`
196
+ (`type: scrape`) are **pre-signed** URLs, minted fresh on every read of
197
+ this endpoint and valid for **600 seconds (10 minutes)** —
198
+ the same signing lifetime as `content_url` on `GET /v1/fetch/bulk/{id}`.
199
+ Download inside that window, or re-poll this endpoint for a fresh
200
+ signature.
201
+
202
+ **When no signature is minted.** Three cases mint none: an item that is not
203
+ `completed`, a `completed` item with no storage key, and a `completed` item
204
+ whose object could not be signed — during an object-storage outage, for
205
+ instance. In all three the item's stored value is returned unchanged: `null`
206
+ while nothing has been stored, and otherwise a **private, unsigned**
207
+ object-storage URL that answers `401`. These fields are neither nulled nor
208
+ flagged in that case, so treat an artifact URL as usable only once you have
209
+ downloaded it, and re-poll for a fresh signature otherwise.
210
+ `artifact_warnings` and its `artifact_unavailable` code describe the sibling
211
+ `artifacts` object on `type: scrape` items only — they say nothing about
212
+ `image_url`, `content_url`, or `markdown_url`.
213
+
214
+ Args:
215
+ id (str):
216
+ cursor (Union[Unset, str]):
217
+ limit (Union[Unset, int]):
218
+ status (Union[Unset, ListBulkScreenshotsStatus]):
219
+
220
+ Raises:
221
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
222
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
223
+
224
+ Returns:
225
+ Response[ListBulkScreenshotsResponse200]
226
+ """
227
+
228
+ kwargs = _get_kwargs(
229
+ id=id,
230
+ cursor=cursor,
231
+ limit=limit,
232
+ status=status,
233
+ )
234
+
235
+ response = await client.get_async_httpx_client().request(**kwargs)
236
+
237
+ return _build_response(client=client, response=response)
238
+
239
+
240
+ async def asyncio(
241
+ id: str,
242
+ *,
243
+ client: Union[AuthenticatedClient, Client],
244
+ cursor: Union[Unset, str] = UNSET,
245
+ limit: Union[Unset, int] = UNSET,
246
+ status: Union[Unset, ListBulkScreenshotsStatus] = UNSET,
247
+ ) -> Optional[ListBulkScreenshotsResponse200]:
248
+ """List bulk job items
249
+
250
+ Returns the bulk job's items, discriminated by `type`.
251
+
252
+ **Downloading item artifacts.** For a `completed` item with a storage key,
253
+ `image_url` (`type: screenshot`) and both `content_url` and `markdown_url`
254
+ (`type: scrape`) are **pre-signed** URLs, minted fresh on every read of
255
+ this endpoint and valid for **600 seconds (10 minutes)** —
256
+ the same signing lifetime as `content_url` on `GET /v1/fetch/bulk/{id}`.
257
+ Download inside that window, or re-poll this endpoint for a fresh
258
+ signature.
259
+
260
+ **When no signature is minted.** Three cases mint none: an item that is not
261
+ `completed`, a `completed` item with no storage key, and a `completed` item
262
+ whose object could not be signed — during an object-storage outage, for
263
+ instance. In all three the item's stored value is returned unchanged: `null`
264
+ while nothing has been stored, and otherwise a **private, unsigned**
265
+ object-storage URL that answers `401`. These fields are neither nulled nor
266
+ flagged in that case, so treat an artifact URL as usable only once you have
267
+ downloaded it, and re-poll for a fresh signature otherwise.
268
+ `artifact_warnings` and its `artifact_unavailable` code describe the sibling
269
+ `artifacts` object on `type: scrape` items only — they say nothing about
270
+ `image_url`, `content_url`, or `markdown_url`.
271
+
272
+ Args:
273
+ id (str):
274
+ cursor (Union[Unset, str]):
275
+ limit (Union[Unset, int]):
276
+ status (Union[Unset, ListBulkScreenshotsStatus]):
277
+
278
+ Raises:
279
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
280
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
281
+
282
+ Returns:
283
+ ListBulkScreenshotsResponse200
284
+ """
285
+
286
+ return (
287
+ await asyncio_detailed(
288
+ id=id,
289
+ client=client,
290
+ cursor=cursor,
291
+ limit=limit,
292
+ status=status,
293
+ )
294
+ ).parsed
@@ -74,6 +74,10 @@ def sync_detailed(
74
74
 
75
75
  Enqueues multiple URLs for HTTP fetching. Results delivered via webhook.
76
76
  Does not support options that require page rendering (wait_for_selector, etc.).
77
+ Completion deliveries use `X-ByteKit-Event: bulk.completed` and the
78
+ `BulkCompletedWebhook` contract: at most 500 complete items and 1 MiB,
79
+ followed by cursor recovery through `GET /v1/fetch/bulk/{id}` whenever
80
+ `recovery_required` is true.
77
81
 
78
82
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
79
83
  with no `Content-Length` header is capped at 2 MB before your API key
@@ -117,6 +121,10 @@ def sync(
117
121
 
118
122
  Enqueues multiple URLs for HTTP fetching. Results delivered via webhook.
119
123
  Does not support options that require page rendering (wait_for_selector, etc.).
124
+ Completion deliveries use `X-ByteKit-Event: bulk.completed` and the
125
+ `BulkCompletedWebhook` contract: at most 500 complete items and 1 MiB,
126
+ followed by cursor recovery through `GET /v1/fetch/bulk/{id}` whenever
127
+ `recovery_required` is true.
120
128
 
121
129
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
122
130
  with no `Content-Length` header is capped at 2 MB before your API key
@@ -155,6 +163,10 @@ async def asyncio_detailed(
155
163
 
156
164
  Enqueues multiple URLs for HTTP fetching. Results delivered via webhook.
157
165
  Does not support options that require page rendering (wait_for_selector, etc.).
166
+ Completion deliveries use `X-ByteKit-Event: bulk.completed` and the
167
+ `BulkCompletedWebhook` contract: at most 500 complete items and 1 MiB,
168
+ followed by cursor recovery through `GET /v1/fetch/bulk/{id}` whenever
169
+ `recovery_required` is true.
158
170
 
159
171
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
160
172
  with no `Content-Length` header is capped at 2 MB before your API key
@@ -196,6 +208,10 @@ async def asyncio(
196
208
 
197
209
  Enqueues multiple URLs for HTTP fetching. Results delivered via webhook.
198
210
  Does not support options that require page rendering (wait_for_selector, etc.).
211
+ Completion deliveries use `X-ByteKit-Event: bulk.completed` and the
212
+ `BulkCompletedWebhook` contract: at most 500 complete items and 1 MiB,
213
+ followed by cursor recovery through `GET /v1/fetch/bulk/{id}` whenever
214
+ `recovery_required` is true.
199
215
 
200
216
  **Limits:** request bodies are guarded in a two-tier shape. A streamed body
201
217
  with no `Content-Length` header is capped at 2 MB before your API key