bytekit-sdk 0.3.0__tar.gz → 0.3.2__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 (268) hide show
  1. bytekit_sdk-0.3.2/CHANGELOG.md +89 -0
  2. bytekit_sdk-0.3.2/LICENSE +21 -0
  3. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/PKG-INFO +48 -40
  4. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/README.md +46 -39
  5. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/pyproject.toml +2 -1
  6. bytekit_sdk-0.3.2/src/bytekit/__init__.py +39 -0
  7. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/account/get_account.py +2 -2
  8. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/bulk/create_bulk.py +4 -4
  9. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/bulk/delete_bulk.py +3 -3
  10. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/bulk/get_bulk.py +3 -3
  11. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/bulk/list_bulk_screenshots.py +2 -2
  12. bytekit_sdk-0.3.2/src/bytekit/api/fetch/get_fetch.py +254 -0
  13. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/fetch/post_fetch.py +4 -4
  14. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/fetch_bulk/create_fetch_bulk.py +4 -4
  15. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/fetch_bulk/get_fetch_bulk.py +3 -3
  16. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/create_monitor.py +5 -5
  17. bytekit_sdk-0.3.2/src/bytekit/api/monitors/delete_monitor.py +155 -0
  18. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/get_monitor.py +3 -3
  19. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/list_monitor_captures.py +2 -2
  20. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/list_monitors.py +2 -2
  21. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/update_monitor.py +6 -6
  22. bytekit_sdk-0.3.2/src/bytekit/api/scrape/create_scrape.py +197 -0
  23. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/scrape/get_scrape.py +3 -3
  24. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/scrape_bulk/create_scrape_bulk.py +4 -4
  25. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/scrape_bulk/get_scrape_bulk.py +3 -3
  26. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/screenshots/create_screenshot.py +6 -6
  27. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/screenshots/get_screenshot.py +4 -4
  28. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/search/create_search.py +7 -7
  29. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/sitemap/create_sitemap.py +4 -4
  30. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/sitemap/get_sitemap.py +3 -3
  31. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/usage/get_usage.py +2 -2
  32. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/usage/get_usage_by_endpoint.py +2 -2
  33. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/usage/get_usage_daily.py +2 -2
  34. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/webhooks/list_webhook_deliveries.py +2 -2
  35. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/webhooks/retry_webhook_delivery.py +3 -3
  36. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/client.py +52 -41
  37. bytekit_sdk-0.3.2/src/bytekit/errors.py +106 -0
  38. bytekit_sdk-0.3.2/tests/test_op_error_paths.py +360 -0
  39. bytekit_sdk-0.3.2/tests/test_patch_functions.py +308 -0
  40. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_prune_stale_api.py +296 -1
  41. bytekit_sdk-0.3.2/tests/test_readme_examples.py +127 -0
  42. bytekit_sdk-0.3.2/tests/test_regen_durability.py +170 -0
  43. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_sdist_contents.py +27 -0
  44. bytekit_sdk-0.3.2/tests/test_typed_search_surface.py +181 -0
  45. bytekit_sdk-0.3.2/tests/test_version.py +110 -0
  46. bytekit_sdk-0.3.0/CHANGELOG.md +0 -33
  47. bytekit_sdk-0.3.0/src/bytekit/__init__.py +0 -8
  48. bytekit_sdk-0.3.0/src/bytekit/errors.py +0 -18
  49. bytekit_sdk-0.3.0/tests/test_patch_functions.py +0 -93
  50. bytekit_sdk-0.3.0/tests/test_regen_durability.py +0 -36
  51. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/.gitignore +0 -0
  52. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/__init__.py +0 -0
  53. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/account/__init__.py +0 -0
  54. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/bulk/__init__.py +0 -0
  55. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/fetch/__init__.py +0 -0
  56. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/fetch_bulk/__init__.py +0 -0
  57. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/monitors/__init__.py +0 -0
  58. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/scrape/__init__.py +0 -0
  59. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/scrape_bulk/__init__.py +0 -0
  60. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/screenshots/__init__.py +0 -0
  61. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/search/__init__.py +0 -0
  62. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/sitemap/__init__.py +0 -0
  63. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/usage/__init__.py +0 -0
  64. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/api/webhooks/__init__.py +0 -0
  65. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/__init__.py +0 -0
  66. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response.py +0 -0
  67. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_api_key.py +0 -0
  68. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_api_key_environment.py +0 -0
  69. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_auto_topup.py +0 -0
  70. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_plan.py +0 -0
  71. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_subscription.py +0 -0
  72. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_subscription_plan.py +0 -0
  73. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_bearer_response_subscription_status.py +0 -0
  74. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_session_response.py +0 -0
  75. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_session_response_notifications.py +0 -0
  76. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/account_session_response_plan.py +0 -0
  77. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/bandwidth_balance.py +0 -0
  78. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/capture_response.py +0 -0
  79. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/capture_response_outcome.py +0 -0
  80. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/clip.py +0 -0
  81. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/cookie.py +0 -0
  82. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body.py +0 -0
  83. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults.py +0 -0
  84. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_device.py +0 -0
  85. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_1.py +0 -0
  86. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_2_type_1.py +0 -0
  87. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_device_scale_factor_type_3_type_1.py +0 -0
  88. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_formats_item.py +0 -0
  89. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_type.py +0 -0
  90. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_viewport_type_0.py +0 -0
  91. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_defaults_wait_until.py +0 -0
  92. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item.py +0 -0
  93. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_device.py +0 -0
  94. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_formats_item.py +0 -0
  95. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_scenario.py +0 -0
  96. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_type.py +0 -0
  97. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_viewport_type_0.py +0 -0
  98. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_body_items_item_wait_until.py +0 -0
  99. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_response_202.py +0 -0
  100. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_bulk_response_202_status.py +0 -0
  101. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body.py +0 -0
  102. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body_defaults.py +0 -0
  103. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body_defaults_format.py +0 -0
  104. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body_metadata.py +0 -0
  105. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body_urls_item_type_1.py +0 -0
  106. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_body_urls_item_type_1_format.py +0 -0
  107. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_fetch_bulk_response_202.py +0 -0
  108. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body.py +0 -0
  109. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_custom.py +0 -0
  110. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_defaults.py +0 -0
  111. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_defaults_formats_item.py +0 -0
  112. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_defaults_headers.py +0 -0
  113. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_items_item.py +0 -0
  114. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_items_item_custom.py +0 -0
  115. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_items_item_formats_item.py +0 -0
  116. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_items_item_headers.py +0 -0
  117. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_body_items_item_metadata.py +0 -0
  118. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_response_202.py +0 -0
  119. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_scrape_bulk_response_202_status.py +0 -0
  120. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_body.py +0 -0
  121. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_body_date_range.py +0 -0
  122. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_body_type.py +0 -0
  123. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_response_200.py +0 -0
  124. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_response_200_results_item.py +0 -0
  125. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_response_200_results_item_image.py +0 -0
  126. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_response_502.py +0 -0
  127. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/create_search_response_502_error.py +0 -0
  128. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/credit_balance.py +0 -0
  129. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/delete_bulk_response_200.py +0 -0
  130. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/delete_bulk_response_200_status.py +0 -0
  131. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/error.py +0 -0
  132. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/error_error.py +0 -0
  133. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/error_status.py +0 -0
  134. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request.py +0 -0
  135. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_cache_ttl_type_1.py +0 -0
  136. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_custom.py +0 -0
  137. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_format.py +0 -0
  138. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_markdown_images.py +0 -0
  139. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_markdown_links.py +0 -0
  140. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/fetch_request_markdown_mode.py +0 -0
  141. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_bulk_response_200.py +0 -0
  142. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_bulk_response_200_status.py +0 -0
  143. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_fetch_bulk_response_200.py +0 -0
  144. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_fetch_cache_ttl_type_1.py +0 -0
  145. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_fetch_format.py +0 -0
  146. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_scrape_bulk_response_200.py +0 -0
  147. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_scrape_bulk_response_200_status.py +0 -0
  148. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_by_endpoint_response_200.py +0 -0
  149. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_by_endpoint_response_200_rows_item.py +0 -0
  150. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_by_endpoint_response_200_rows_item_endpoint.py +0 -0
  151. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_by_endpoint_response_200_totals.py +0 -0
  152. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_daily_response_200.py +0 -0
  153. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_daily_response_200_data_item.py +0 -0
  154. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_response_200.py +0 -0
  155. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/get_usage_response_200_plan_type.py +0 -0
  156. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_bulk_screenshots_response_200.py +0 -0
  157. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_monitor_captures_response_200.py +0 -0
  158. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_monitors_response_200.py +0 -0
  159. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_monitors_status.py +0 -0
  160. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_webhook_deliveries_response_200.py +0 -0
  161. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/list_webhook_deliveries_status.py +0 -0
  162. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/metadata.py +0 -0
  163. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request.py +0 -0
  164. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_interval_type.py +0 -0
  165. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_notify_on.py +0 -0
  166. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_options.py +0 -0
  167. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_scrape_options.py +0 -0
  168. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_type.py +0 -0
  169. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_request_webhook_headers.py +0 -0
  170. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_create_response.py +0 -0
  171. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response.py +0 -0
  172. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response_interval_type.py +0 -0
  173. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response_metadata_type_0.py +0 -0
  174. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response_status.py +0 -0
  175. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response_type.py +0 -0
  176. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_response_webhook_headers_type_0.py +0 -0
  177. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request.py +0 -0
  178. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_interval_type.py +0 -0
  179. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_notify_on.py +0 -0
  180. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_options.py +0 -0
  181. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_scrape_options.py +0 -0
  182. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_status.py +0 -0
  183. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/monitor_update_request_webhook_headers.py +0 -0
  184. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_error_envelope.py +0 -0
  185. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_error_envelope_error.py +0 -0
  186. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_error_envelope_error_code.py +0 -0
  187. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_error_envelope_schema_version.py +0 -0
  188. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_error_envelope_status.py +0 -0
  189. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_formats.py +0 -0
  190. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_markdown_tokens.py +0 -0
  191. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_metadata.py +0 -0
  192. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_queued_envelope.py +0 -0
  193. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_queued_envelope_schema_version.py +0 -0
  194. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_queued_envelope_status.py +0 -0
  195. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request.py +0 -0
  196. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_cache_ttl_type_1.py +0 -0
  197. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_custom.py +0 -0
  198. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_events_item.py +0 -0
  199. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_formats_item.py +0 -0
  200. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_headers.py +0 -0
  201. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_markdown_images.py +0 -0
  202. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_markdown_links.py +0 -0
  203. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_markdown_mode.py +0 -0
  204. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_token_encoding.py +0 -0
  205. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_request_x_internal_scrape_path.py +0 -0
  206. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_scored_image.py +0 -0
  207. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_scored_link.py +0 -0
  208. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_stats.py +0 -0
  209. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_success_envelope.py +0 -0
  210. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_success_envelope_cache.py +0 -0
  211. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_success_envelope_custom.py +0 -0
  212. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_success_envelope_schema_version.py +0 -0
  213. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_success_envelope_status.py +0 -0
  214. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_table.py +0 -0
  215. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_table_kind.py +0 -0
  216. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_warning.py +0 -0
  217. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/scrape_warning_code.py +0 -0
  218. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request.py +0 -0
  219. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_device.py +0 -0
  220. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_device_scale_factor_type_1.py +0 -0
  221. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_device_scale_factor_type_2_type_1.py +0 -0
  222. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_device_scale_factor_type_3_type_1.py +0 -0
  223. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_format.py +0 -0
  224. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_headers.py +0 -0
  225. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_request_wait_until.py +0 -0
  226. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_response.py +0 -0
  227. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/screenshot_response_status.py +0 -0
  228. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_request.py +0 -0
  229. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_request_process_type_0.py +0 -0
  230. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_request_process_type_0_options.py +0 -0
  231. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_request_strategy.py +0 -0
  232. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response.py +0 -0
  233. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response_cache.py +0 -0
  234. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response_metadata_type_0.py +0 -0
  235. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response_process_type_0.py +0 -0
  236. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response_sources_type_0.py +0 -0
  237. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/sitemap_response_status.py +0 -0
  238. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/viewport.py +0 -0
  239. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/webhook_delivery_response.py +0 -0
  240. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/webhook_delivery_response_event_type.py +0 -0
  241. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/models/webhook_delivery_response_status.py +0 -0
  242. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/py.typed +0 -0
  243. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/src/bytekit/types.py +0 -0
  244. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/__init__.py +0 -0
  245. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/conftest.py +0 -0
  246. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/fixtures/unpatched_client.py.snapshot +0 -0
  247. /bytekit_sdk-0.3.0/src/bytekit/api/scrape/create_scrape.py → /bytekit_sdk-0.3.2/tests/fixtures/unpatched_create_scrape.py.snapshot +0 -0
  248. /bytekit_sdk-0.3.0/src/bytekit/api/monitors/delete_monitor.py → /bytekit_sdk-0.3.2/tests/fixtures/unpatched_delete_monitor.py.snapshot +0 -0
  249. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/fixtures/unpatched_errors.py.snapshot +0 -0
  250. /bytekit_sdk-0.3.0/src/bytekit/api/fetch/get_fetch.py → /bytekit_sdk-0.3.2/tests/fixtures/unpatched_get_fetch.py.snapshot +0 -0
  251. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_bulk_delete.py +0 -0
  252. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_client.py +0 -0
  253. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_client_defaults.py +0 -0
  254. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_deactivated_resources.py +0 -0
  255. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_generate_docs.py +0 -0
  256. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_models.py +0 -0
  257. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_no_materialized_defaults.py +0 -0
  258. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_package_identity.py +0 -0
  259. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_publish_metadata.py +0 -0
  260. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_removed_surface.py +0 -0
  261. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_scrape_markdown_opts.py +0 -0
  262. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_scrape_scored_formats.py +0 -0
  263. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_search.py +0 -0
  264. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_search_errors.py +0 -0
  265. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_spec_field_parity.py +0 -0
  266. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_usage.py +0 -0
  267. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_webhook_deliveries.py +0 -0
  268. {bytekit_sdk-0.3.0 → bytekit_sdk-0.3.2}/tests/test_wheel_contents.py +0 -0
@@ -0,0 +1,89 @@
1
+ # Changelog
2
+
3
+ All notable changes to the ByteKit Python SDK are documented here.
4
+ PyPI distribution: `bytekit-sdk`. Import name: `bytekit`.
5
+
6
+ ## 0.3.2
7
+
8
+ ### Added
9
+
10
+ - **`bytekit.__version__`** reports the installed distribution version, resolved at import
11
+ time from `importlib.metadata` (so it can never drift from `pyproject.toml`'s
12
+ `[project].version`). When the package is imported from a source tree with no installed
13
+ distribution it reads `0.0.0.dev0` rather than raising. The dead version override in
14
+ `sdk-python-config.yaml` — inert under `--meta none` and contradicting the real
15
+ version — has been removed, leaving one authoritative version.
16
+
17
+ ### Fixed
18
+
19
+ - **`AuthenticatedClient.search()` is now visible to type checkers.** It was attached to the
20
+ class after creation, so despite the package shipping a `py.typed` marker, `mypy` and
21
+ `pyright` reported `"AuthenticatedClient" has no attribute "search"`. It is now declared as a
22
+ real method in the class body that delegates to the same implementation: **runtime behavior,
23
+ arguments, return type and raised errors are unchanged** — only the static surface is fixed.
24
+
25
+ ## 0.3.1
26
+
27
+ ### Fixed
28
+
29
+ - **The "never a bare `json.JSONDecodeError`" guarantee is now package-wide across all
30
+ generated operations**, not only the `AuthenticatedClient.search()` wrapper. Every
31
+ generated operation previously called `response.json()` unconditionally on a
32
+ DOCUMENTED status, so a `500`/`502` serving an HTML load-balancer page raised a bare
33
+ `json.JSONDecodeError` from inside the SDK. All operations now parse documented
34
+ statuses through a shared guard: a non-JSON body raises the typed
35
+ `errors.UnexpectedStatus` (or returns `None` when
36
+ `raise_on_unexpected_status=False`), carrying the status code and the raw body.
37
+ - **`errors.UnexpectedStatus.code` / `.message` are now populated for generated
38
+ operations too**, from the documented `Error` envelope — previously they were always
39
+ `None` outside `search()`. A string-valued `error` (the masked search-provider `502`)
40
+ still never enriches, so the upstream provider's identity is never surfaced.
41
+ - Behavior on JSON bodies is unchanged: JSON success bodies still parse into their typed
42
+ success models, documented JSON error bodies are still **returned** as typed `Error`
43
+ models rather than raised, and `raise_on_unexpected_status` semantics are untouched.
44
+ The documented non-JSON success paths — `get_fetch`/`post_fetch`'s raw-text `200` and
45
+ `delete_monitor`'s empty `204` — are likewise unaffected.
46
+ - **README error documentation corrected.** The quick-start example wrapped a call in
47
+ `try/except UnexpectedStatus` and then read `response.formats.markdown`, but a
48
+ documented `4xx` _returns_ a typed `Error` model without raising — so the documented
49
+ example failed with `AttributeError: 'Error' object has no attribute 'formats'`. The
50
+ README now documents the real two-tier contract, and the snippet is executed by
51
+ `tests/test_readme_examples.py` so it cannot silently drift again.
52
+
53
+ ### Documentation
54
+
55
+ - Removed the contributor-only `Publishing`, `Regenerating`, and `Development` sections
56
+ from the published README (the PyPI long description) — they described internal CI
57
+ mechanics and a monorepo-contributor workflow that do not belong on a public package
58
+ index. The regeneration/development knowledge is preserved in-repo in
59
+ `packages/sdk-python/CLAUDE.md` (not shipped in the distribution).
60
+ - Added a `## License` section and a `LICENSE` file, matching the npm sibling packages.
61
+
62
+ ## 0.3.0
63
+
64
+ ### Breaking
65
+
66
+ - **PyPI distribution renamed `bytekit` -> `bytekit-sdk`.** PyPI administratively
67
+ denylists the bare name `bytekit`, so the package installs as
68
+ `pip install bytekit-sdk`. The **import name is unchanged** — `import bytekit`
69
+ still works, and no module path moved. Nothing was ever published under the old
70
+ distribution name, so there is no migration for existing installs.
71
+ - **`raise_on_unexpected_status` now defaults to `True`.** Undocumented response
72
+ statuses now raise `errors.UnexpectedStatus` instead of silently returning `None`.
73
+ Callers that relied on the old `None`-return behavior must pass
74
+ `raise_on_unexpected_status=False` explicitly to opt out.
75
+ - **`base_url` is now a keyword-only argument.** It gained a default
76
+ (`https://api.bytekit.com`), and to satisfy attrs field ordering it became
77
+ keyword-only. Any caller passing `base_url` positionally must switch to the
78
+ `base_url=` keyword form. (`base_url=` was already the documented usage.)
79
+
80
+ ### Added
81
+
82
+ - `AuthenticatedClient(token=...)` now works out of the box against production:
83
+ `base_url` defaults to `https://api.bytekit.com`.
84
+ - Finite default request timeout of `120s` (`httpx.Timeout(120.0)`) — requests no
85
+ longer hang indefinitely. Override with `timeout=`.
86
+ - `errors.UnexpectedStatus` now carries optional `.code` / `.message` attributes.
87
+ The `AuthenticatedClient.search()` wrapper populates them from the documented
88
+ `Error` envelope, and safely raises a typed error (never a bare
89
+ `json.JSONDecodeError`) on a non-JSON documented-status body such as an HTML 502.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Hunt Labs, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bytekit-sdk
3
- Version: 0.3.0
3
+ Version: 0.3.2
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
7
7
  Project-URL: Documentation, https://bytekit.com/docs
8
8
  License-Expression: MIT
9
+ License-File: LICENSE
9
10
  Keywords: api,bytekit,crawler,llm,markdown,scraping,screenshots,sdk,web-scraping
10
11
  Classifier: Development Status :: 4 - Beta
11
12
  Classifier: Intended Audience :: Developers
@@ -37,26 +38,64 @@ Generated from the OpenAPI spec using [openapi-python-client](https://github.com
37
38
  pip install bytekit-sdk
38
39
  ```
39
40
 
41
+ The installed version is available as `bytekit.__version__`.
42
+
40
43
  ## Quick start
41
44
 
42
45
  ```python
43
46
  from bytekit import AuthenticatedClient
44
47
  from bytekit.api.scrape import create_scrape
45
- from bytekit.errors import UnexpectedStatus
46
48
  from bytekit.models.scrape_request import ScrapeRequest
49
+ from bytekit.models.scrape_success_envelope import ScrapeSuccessEnvelope
47
50
 
48
51
  # base_url defaults to https://api.bytekit.com, so only the token is required.
49
52
  client = AuthenticatedClient(token="sk_live_your_api_key_here")
50
53
 
51
- body = ScrapeRequest(url="https://example.com")
54
+ result = create_scrape.sync(client=client, body=ScrapeRequest(url="https://example.com"))
55
+
56
+ if isinstance(result, ScrapeSuccessEnvelope):
57
+ # formats.markdown is str | Unset — only set when "markdown" was among the
58
+ # requested formats.
59
+ print(result.formats.markdown)
60
+ ```
61
+
62
+ See [Error handling](#error-handling) for what `result` can be when the request fails.
63
+
64
+ ### Error handling
65
+
66
+ The SDK has a **two-tier** error contract. Both tiers are safe: an operation never raises
67
+ a bare `json.JSONDecodeError`, even when a server returns an HTML error page.
68
+
69
+ | Situation | What you get |
70
+ | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
71
+ | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
72
+ | 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. |
73
+ | Either of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
74
+
75
+ ```python
76
+ from bytekit import AuthenticatedClient
77
+ from bytekit.api.scrape import create_scrape
78
+ from bytekit.errors import UnexpectedStatus
79
+ from bytekit.models.error import Error
80
+ from bytekit.models.scrape_request import ScrapeRequest
81
+ from bytekit.models.scrape_success_envelope import ScrapeSuccessEnvelope
82
+
83
+ client = AuthenticatedClient(token="sk_live_your_api_key_here")
52
84
 
53
85
  try:
54
- response = create_scrape.sync(client=client, body=body)
55
- # response.formats.markdown is str | Unset — only present when "markdown" was requested
56
- print(response.formats.markdown)
86
+ result = create_scrape.sync(client=client, body=ScrapeRequest(url="https://example.com"))
57
87
  except UnexpectedStatus as err:
58
- # Errors now raise loudly by default instead of returning None.
88
+ # Undocumented status, or a non-JSON body on a documented one. Never a JSONDecodeError.
59
89
  print(f"request failed with status {err.status_code}: {err.code} {err.message}")
90
+ else:
91
+ if isinstance(result, Error):
92
+ # Documented 4xx/5xx with a JSON body: RETURNED as a typed model, not raised.
93
+ print(f"api error {result.error.code}: {result.error.message}")
94
+ elif isinstance(result, ScrapeSuccessEnvelope):
95
+ print(result.formats.markdown)
96
+ else:
97
+ # 202 ScrapeQueuedEnvelope — poll get_scrape with this id until it completes.
98
+ print(f"queued as {result.id}")
60
99
  ```
61
100
 
62
101
  ### Defaults
@@ -105,37 +144,6 @@ asyncio.run(main())
105
144
  | `api.webhooks` | `list_webhook_deliveries`, `retry_webhook_delivery` | Webhook delivery log & retry |
106
145
  | `api.account` | `get_account` | Account details |
107
146
 
108
- ## Regenerating
109
-
110
- To regenerate the client after API changes:
111
-
112
- ```bash
113
- pnpm --filter @bytekit/sdk-python generate
114
- ```
115
-
116
- This runs `scripts/filter-spec.ts` to produce `filtered-openapi.yaml` (filtered to v0.1 operations), runs `scripts/prune-stale-api.py` to delete any `src/bytekit/api/<tag>/` directory the filtered spec no longer produces (`generate --overwrite` itself already rebuilds `api/` from scratch on every run, so this step is defense-in-depth for a standalone run of the prune script or a future generator version — the path that actually needs the guard is `pnpm generate:docs`, which enumerates `api/` on disk independent of `generate` and can otherwise resurrect a tag whose tracked files were `git rm`-ed but whose untracked `__pycache__/` survives; see `scripts/prune-stale-api.py`'s module docstring and `has_operations()` in `scripts/generate-docs.py`), invokes `openapi-python-client generate` to update `src/bytekit/`, then runs `scripts/inject-handwritten.py` to re-append hand-written fragments (e.g. the `AuthenticatedClient.search()` convenience method) from `scripts/hand_written/` and re-patch the generated `client.py`/`errors.py` with the runtime defaults and error enrichment described above — because `--overwrite` overwrites every file it emits, both the hand-written code and these patches are wiped on every regen and must be re-applied afterward.
117
-
118
- ## Development
119
-
120
- ```bash
121
- # Run tests
122
- cd packages/sdk-python
123
- python3 -m pytest tests/ -v
124
- ```
147
+ ## License
125
148
 
126
- ## Publishing
127
-
128
- PyPI publish is handled in [#2226](https://github.com/Hunt-Labs-Inc/ByteKit/issues/2226) —
129
- `.woodpecker/publish.yaml`'s `publish-pypi` step, version-gated the same way as the npm
130
- siblings (publishes only when the local `pyproject.toml` version differs from what's live on
131
- PyPI).
132
-
133
- **`bytekit-sdk` has never been published.** Before the commit that arms
134
- `packages/sdk-python/pyproject.toml` in `publish.yaml`'s workflow-level `when.path.include` is
135
- promoted from `staging` to `main`, an operator MUST publish `0.3.0` to PyPI manually and under
136
- supervision. Reason: bytekit-sdk 404s on PyPI today, so the automatic version-compare gate's
137
- `|| echo "0.0.0"` fallback always fires — the first time that arming reaches `main`, it would
138
- trigger a real, irreversible first `twine upload` with no manual confirmation step in between.
139
- Once the manual first release exists, PUBLISHED == CURRENT and every later automatic run at an
140
- unchanged version is a no-op, same as the npm packages. See the comment at the armed
141
- `when.path.include` entry in `.woodpecker/publish.yaml` for the mechanism.
149
+ MIT — see [LICENSE](./LICENSE).
@@ -12,26 +12,64 @@ Generated from the OpenAPI spec using [openapi-python-client](https://github.com
12
12
  pip install bytekit-sdk
13
13
  ```
14
14
 
15
+ The installed version is available as `bytekit.__version__`.
16
+
15
17
  ## Quick start
16
18
 
17
19
  ```python
18
20
  from bytekit import AuthenticatedClient
19
21
  from bytekit.api.scrape import create_scrape
20
- from bytekit.errors import UnexpectedStatus
21
22
  from bytekit.models.scrape_request import ScrapeRequest
23
+ from bytekit.models.scrape_success_envelope import ScrapeSuccessEnvelope
22
24
 
23
25
  # base_url defaults to https://api.bytekit.com, so only the token is required.
24
26
  client = AuthenticatedClient(token="sk_live_your_api_key_here")
25
27
 
26
- body = ScrapeRequest(url="https://example.com")
28
+ result = create_scrape.sync(client=client, body=ScrapeRequest(url="https://example.com"))
29
+
30
+ if isinstance(result, ScrapeSuccessEnvelope):
31
+ # formats.markdown is str | Unset — only set when "markdown" was among the
32
+ # requested formats.
33
+ print(result.formats.markdown)
34
+ ```
35
+
36
+ See [Error handling](#error-handling) for what `result` can be when the request fails.
37
+
38
+ ### Error handling
39
+
40
+ The SDK has a **two-tier** error contract. Both tiers are safe: an operation never raises
41
+ a bare `json.JSONDecodeError`, even when a server returns an HTML error page.
42
+
43
+ | Situation | What you get |
44
+ | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
45
+ | A status the OpenAPI spec **documents** for that operation (e.g. a `422` or `500` on `create_scrape`), with a JSON body | The typed `Error` model is **returned**, not raised. Check with `isinstance(result, Error)` and read `result.error.code` / `result.error.message`. |
46
+ | 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. |
47
+ | Either of the above, with `raise_on_unexpected_status=False` | Nothing is raised; the operation returns `None`. |
48
+
49
+ ```python
50
+ from bytekit import AuthenticatedClient
51
+ from bytekit.api.scrape import create_scrape
52
+ from bytekit.errors import UnexpectedStatus
53
+ from bytekit.models.error import Error
54
+ from bytekit.models.scrape_request import ScrapeRequest
55
+ from bytekit.models.scrape_success_envelope import ScrapeSuccessEnvelope
56
+
57
+ client = AuthenticatedClient(token="sk_live_your_api_key_here")
27
58
 
28
59
  try:
29
- response = create_scrape.sync(client=client, body=body)
30
- # response.formats.markdown is str | Unset — only present when "markdown" was requested
31
- print(response.formats.markdown)
60
+ result = create_scrape.sync(client=client, body=ScrapeRequest(url="https://example.com"))
32
61
  except UnexpectedStatus as err:
33
- # Errors now raise loudly by default instead of returning None.
62
+ # Undocumented status, or a non-JSON body on a documented one. Never a JSONDecodeError.
34
63
  print(f"request failed with status {err.status_code}: {err.code} {err.message}")
64
+ else:
65
+ if isinstance(result, Error):
66
+ # Documented 4xx/5xx with a JSON body: RETURNED as a typed model, not raised.
67
+ print(f"api error {result.error.code}: {result.error.message}")
68
+ elif isinstance(result, ScrapeSuccessEnvelope):
69
+ print(result.formats.markdown)
70
+ else:
71
+ # 202 ScrapeQueuedEnvelope — poll get_scrape with this id until it completes.
72
+ print(f"queued as {result.id}")
35
73
  ```
36
74
 
37
75
  ### Defaults
@@ -80,37 +118,6 @@ asyncio.run(main())
80
118
  | `api.webhooks` | `list_webhook_deliveries`, `retry_webhook_delivery` | Webhook delivery log & retry |
81
119
  | `api.account` | `get_account` | Account details |
82
120
 
83
- ## Regenerating
84
-
85
- To regenerate the client after API changes:
86
-
87
- ```bash
88
- pnpm --filter @bytekit/sdk-python generate
89
- ```
90
-
91
- This runs `scripts/filter-spec.ts` to produce `filtered-openapi.yaml` (filtered to v0.1 operations), runs `scripts/prune-stale-api.py` to delete any `src/bytekit/api/<tag>/` directory the filtered spec no longer produces (`generate --overwrite` itself already rebuilds `api/` from scratch on every run, so this step is defense-in-depth for a standalone run of the prune script or a future generator version — the path that actually needs the guard is `pnpm generate:docs`, which enumerates `api/` on disk independent of `generate` and can otherwise resurrect a tag whose tracked files were `git rm`-ed but whose untracked `__pycache__/` survives; see `scripts/prune-stale-api.py`'s module docstring and `has_operations()` in `scripts/generate-docs.py`), invokes `openapi-python-client generate` to update `src/bytekit/`, then runs `scripts/inject-handwritten.py` to re-append hand-written fragments (e.g. the `AuthenticatedClient.search()` convenience method) from `scripts/hand_written/` and re-patch the generated `client.py`/`errors.py` with the runtime defaults and error enrichment described above — because `--overwrite` overwrites every file it emits, both the hand-written code and these patches are wiped on every regen and must be re-applied afterward.
92
-
93
- ## Development
94
-
95
- ```bash
96
- # Run tests
97
- cd packages/sdk-python
98
- python3 -m pytest tests/ -v
99
- ```
121
+ ## License
100
122
 
101
- ## Publishing
102
-
103
- PyPI publish is handled in [#2226](https://github.com/Hunt-Labs-Inc/ByteKit/issues/2226) —
104
- `.woodpecker/publish.yaml`'s `publish-pypi` step, version-gated the same way as the npm
105
- siblings (publishes only when the local `pyproject.toml` version differs from what's live on
106
- PyPI).
107
-
108
- **`bytekit-sdk` has never been published.** Before the commit that arms
109
- `packages/sdk-python/pyproject.toml` in `publish.yaml`'s workflow-level `when.path.include` is
110
- promoted from `staging` to `main`, an operator MUST publish `0.3.0` to PyPI manually and under
111
- supervision. Reason: bytekit-sdk 404s on PyPI today, so the automatic version-compare gate's
112
- `|| echo "0.0.0"` fallback always fires — the first time that arming reaches `main`, it would
113
- trigger a real, irreversible first `twine upload` with no manual confirmation step in between.
114
- Once the manual first release exists, PUBLISHED == CURRENT and every later automatic run at an
115
- unchanged version is a no-op, same as the npm packages. See the comment at the armed
116
- `when.path.include` entry in `.woodpecker/publish.yaml` for the mechanism.
123
+ MIT — see [LICENSE](./LICENSE).
@@ -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.3.0"
10
+ version = "0.3.2"
11
11
  description = "Official Python SDK for the ByteKit API"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.10"
@@ -87,6 +87,7 @@ include = [
87
87
  "tests/**",
88
88
  "README.md",
89
89
  "CHANGELOG.md",
90
+ "LICENSE",
90
91
  ]
91
92
  exclude = [
92
93
  "node_modules",
@@ -0,0 +1,39 @@
1
+ """A client library for accessing ByteKit API"""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
9
+
10
+
11
+ # BYTEKIT-HANDWRITTEN: __version__ (injected post-generation)
12
+ #
13
+ # This fragment is APPENDED to the generated src/bytekit/__init__.py by
14
+ # scripts/inject-handwritten.py after every regeneration. It lives here (outside
15
+ # src/bytekit/) so `openapi-python-client generate --overwrite`, which deletes and
16
+ # recreates the entire src/bytekit/ package, can never delete it.
17
+ #
18
+ # ONE AUTHORITATIVE VERSION (#2549). The value is RESOLVED, never restated: it comes from the
19
+ # installed distribution's metadata, which IS pyproject.toml's `[project].version` once the
20
+ # distribution is built or installed. There is nothing here to keep in sync and nothing that can
21
+ # drift — which is the whole point, since the dead generator-config version override this
22
+ # replaced (inert under `--meta none`) had silently contradicted the real version.
23
+ #
24
+ # Note the DISTRIBUTION name is `bytekit-sdk` while the IMPORT name is `bytekit` (#2530): PyPI
25
+ # administratively denylists the bare name. `importlib.metadata.version` takes the DISTRIBUTION.
26
+ #
27
+ # `__all__` is deliberately NOT extended: dunder module attributes are conventionally excluded
28
+ # from it, and this fragment is appended AFTER the generated `__all__` tuple, so mutating it
29
+ # would require a patch rather than an append.
30
+ from importlib.metadata import PackageNotFoundError
31
+ from importlib.metadata import version as _dist_version
32
+
33
+ try:
34
+ __version__ = _dist_version("bytekit-sdk")
35
+ except PackageNotFoundError:
36
+ # Imported from a source tree with no installed distribution — the default for this repo's
37
+ # own test suite, which runs install-free via pyproject.toml's `pythonpath = ["src"]`.
38
+ # A valid PEP 440 development version, never an empty string and never an import-time raise.
39
+ __version__ = "0.0.0.dev0"
@@ -41,11 +41,11 @@ def _parse_response(
41
41
 
42
42
  return response_200_type_1
43
43
 
44
- response_200 = _parse_response_200(response.json())
44
+ response_200 = errors.bytekit_parse(_parse_response_200, client=client, response=response)
45
45
 
46
46
  return response_200
47
47
  if client.raise_on_unexpected_status:
48
- raise errors.UnexpectedStatus(response.status_code, response.content)
48
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
49
49
  else:
50
50
  return None
51
51
 
@@ -34,19 +34,19 @@ def _parse_response(
34
34
  *, client: Union[AuthenticatedClient, Client], response: httpx.Response
35
35
  ) -> Optional[Union[CreateBulkResponse202, Error]]:
36
36
  if response.status_code == 202:
37
- response_202 = CreateBulkResponse202.from_dict(response.json())
37
+ response_202 = errors.bytekit_parse(CreateBulkResponse202.from_dict, client=client, response=response)
38
38
 
39
39
  return response_202
40
40
  if response.status_code == 400:
41
- response_400 = Error.from_dict(response.json())
41
+ response_400 = errors.bytekit_parse(Error.from_dict, client=client, response=response)
42
42
 
43
43
  return response_400
44
44
  if response.status_code == 422:
45
- response_422 = Error.from_dict(response.json())
45
+ response_422 = errors.bytekit_parse(Error.from_dict, client=client, response=response)
46
46
 
47
47
  return response_422
48
48
  if client.raise_on_unexpected_status:
49
- raise errors.UnexpectedStatus(response.status_code, response.content)
49
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
50
50
  else:
51
51
  return None
52
52
 
@@ -27,15 +27,15 @@ def _parse_response(
27
27
  *, client: Union[AuthenticatedClient, Client], response: httpx.Response
28
28
  ) -> Optional[Union[DeleteBulkResponse200, Error]]:
29
29
  if response.status_code == 200:
30
- response_200 = DeleteBulkResponse200.from_dict(response.json())
30
+ response_200 = errors.bytekit_parse(DeleteBulkResponse200.from_dict, client=client, response=response)
31
31
 
32
32
  return response_200
33
33
  if response.status_code == 404:
34
- response_404 = Error.from_dict(response.json())
34
+ response_404 = errors.bytekit_parse(Error.from_dict, client=client, response=response)
35
35
 
36
36
  return response_404
37
37
  if client.raise_on_unexpected_status:
38
- raise errors.UnexpectedStatus(response.status_code, response.content)
38
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
39
39
  else:
40
40
  return None
41
41
 
@@ -27,15 +27,15 @@ def _parse_response(
27
27
  *, client: Union[AuthenticatedClient, Client], response: httpx.Response
28
28
  ) -> Optional[Union[Error, GetBulkResponse200]]:
29
29
  if response.status_code == 200:
30
- response_200 = GetBulkResponse200.from_dict(response.json())
30
+ response_200 = errors.bytekit_parse(GetBulkResponse200.from_dict, client=client, response=response)
31
31
 
32
32
  return response_200
33
33
  if response.status_code == 404:
34
- response_404 = Error.from_dict(response.json())
34
+ response_404 = errors.bytekit_parse(Error.from_dict, client=client, response=response)
35
35
 
36
36
  return response_404
37
37
  if client.raise_on_unexpected_status:
38
- raise errors.UnexpectedStatus(response.status_code, response.content)
38
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
39
39
  else:
40
40
  return None
41
41
 
@@ -26,11 +26,11 @@ def _parse_response(
26
26
  *, client: Union[AuthenticatedClient, Client], response: httpx.Response
27
27
  ) -> Optional[ListBulkScreenshotsResponse200]:
28
28
  if response.status_code == 200:
29
- response_200 = ListBulkScreenshotsResponse200.from_dict(response.json())
29
+ response_200 = errors.bytekit_parse(ListBulkScreenshotsResponse200.from_dict, client=client, response=response)
30
30
 
31
31
  return response_200
32
32
  if client.raise_on_unexpected_status:
33
- raise errors.UnexpectedStatus(response.status_code, response.content)
33
+ raise errors.bytekit_unexpected(response) # BYTEKIT-OP-GUARD
34
34
  else:
35
35
  return None
36
36