bytekit-sdk 0.3.0__py3-none-any.whl

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 (227) hide show
  1. bytekit/__init__.py +8 -0
  2. bytekit/api/__init__.py +1 -0
  3. bytekit/api/account/__init__.py +1 -0
  4. bytekit/api/account/get_account.py +157 -0
  5. bytekit/api/bulk/__init__.py +1 -0
  6. bytekit/api/bulk/create_bulk.py +204 -0
  7. bytekit/api/bulk/delete_bulk.py +177 -0
  8. bytekit/api/bulk/get_bulk.py +157 -0
  9. bytekit/api/bulk/list_bulk_screenshots.py +152 -0
  10. bytekit/api/fetch/__init__.py +1 -0
  11. bytekit/api/fetch/get_fetch.py +254 -0
  12. bytekit/api/fetch/post_fetch.py +178 -0
  13. bytekit/api/fetch_bulk/__init__.py +1 -0
  14. bytekit/api/fetch_bulk/create_fetch_bulk.py +180 -0
  15. bytekit/api/fetch_bulk/get_fetch_bulk.py +157 -0
  16. bytekit/api/monitors/__init__.py +1 -0
  17. bytekit/api/monitors/create_monitor.py +180 -0
  18. bytekit/api/monitors/delete_monitor.py +155 -0
  19. bytekit/api/monitors/get_monitor.py +157 -0
  20. bytekit/api/monitors/list_monitor_captures.py +188 -0
  21. bytekit/api/monitors/list_monitors.py +193 -0
  22. bytekit/api/monitors/update_monitor.py +191 -0
  23. bytekit/api/scrape/__init__.py +1 -0
  24. bytekit/api/scrape/create_scrape.py +197 -0
  25. bytekit/api/scrape/get_scrape.py +231 -0
  26. bytekit/api/scrape_bulk/__init__.py +1 -0
  27. bytekit/api/scrape_bulk/create_scrape_bulk.py +188 -0
  28. bytekit/api/scrape_bulk/get_scrape_bulk.py +157 -0
  29. bytekit/api/screenshots/__init__.py +1 -0
  30. bytekit/api/screenshots/create_screenshot.py +208 -0
  31. bytekit/api/screenshots/get_screenshot.py +177 -0
  32. bytekit/api/search/__init__.py +1 -0
  33. bytekit/api/search/create_search.py +225 -0
  34. bytekit/api/sitemap/__init__.py +1 -0
  35. bytekit/api/sitemap/create_sitemap.py +192 -0
  36. bytekit/api/sitemap/get_sitemap.py +157 -0
  37. bytekit/api/usage/__init__.py +1 -0
  38. bytekit/api/usage/get_usage.py +126 -0
  39. bytekit/api/usage/get_usage_by_endpoint.py +215 -0
  40. bytekit/api/usage/get_usage_daily.py +203 -0
  41. bytekit/api/webhooks/__init__.py +1 -0
  42. bytekit/api/webhooks/list_webhook_deliveries.py +214 -0
  43. bytekit/api/webhooks/retry_webhook_delivery.py +165 -0
  44. bytekit/client.py +418 -0
  45. bytekit/errors.py +18 -0
  46. bytekit/models/__init__.py +401 -0
  47. bytekit/models/account_bearer_response.py +207 -0
  48. bytekit/models/account_bearer_response_api_key.py +134 -0
  49. bytekit/models/account_bearer_response_api_key_environment.py +8 -0
  50. bytekit/models/account_bearer_response_auto_topup.py +83 -0
  51. bytekit/models/account_bearer_response_plan.py +150 -0
  52. bytekit/models/account_bearer_response_subscription.py +85 -0
  53. bytekit/models/account_bearer_response_subscription_plan.py +99 -0
  54. bytekit/models/account_bearer_response_subscription_status.py +10 -0
  55. bytekit/models/account_session_response.py +164 -0
  56. bytekit/models/account_session_response_notifications.py +51 -0
  57. bytekit/models/account_session_response_plan.py +150 -0
  58. bytekit/models/bandwidth_balance.py +91 -0
  59. bytekit/models/capture_response.py +216 -0
  60. bytekit/models/capture_response_outcome.py +10 -0
  61. bytekit/models/clip.py +83 -0
  62. bytekit/models/cookie.py +90 -0
  63. bytekit/models/create_bulk_body.py +155 -0
  64. bytekit/models/create_bulk_body_defaults.py +423 -0
  65. bytekit/models/create_bulk_body_defaults_device.py +9 -0
  66. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_1.py +9 -0
  67. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_2_type_1.py +9 -0
  68. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_3_type_1.py +9 -0
  69. bytekit/models/create_bulk_body_defaults_formats_item.py +12 -0
  70. bytekit/models/create_bulk_body_defaults_type.py +9 -0
  71. bytekit/models/create_bulk_body_defaults_viewport_type_0.py +67 -0
  72. bytekit/models/create_bulk_body_defaults_wait_until.py +10 -0
  73. bytekit/models/create_bulk_body_items_item.py +380 -0
  74. bytekit/models/create_bulk_body_items_item_device.py +9 -0
  75. bytekit/models/create_bulk_body_items_item_formats_item.py +12 -0
  76. bytekit/models/create_bulk_body_items_item_scenario.py +10 -0
  77. bytekit/models/create_bulk_body_items_item_type.py +9 -0
  78. bytekit/models/create_bulk_body_items_item_viewport_type_0.py +67 -0
  79. bytekit/models/create_bulk_body_items_item_wait_until.py +10 -0
  80. bytekit/models/create_bulk_response_202.py +164 -0
  81. bytekit/models/create_bulk_response_202_status.py +10 -0
  82. bytekit/models/create_fetch_bulk_body.py +161 -0
  83. bytekit/models/create_fetch_bulk_body_defaults.py +91 -0
  84. bytekit/models/create_fetch_bulk_body_defaults_format.py +9 -0
  85. bytekit/models/create_fetch_bulk_body_metadata.py +44 -0
  86. bytekit/models/create_fetch_bulk_body_urls_item_type_1.py +102 -0
  87. bytekit/models/create_fetch_bulk_body_urls_item_type_1_format.py +9 -0
  88. bytekit/models/create_fetch_bulk_response_202.py +44 -0
  89. bytekit/models/create_scrape_bulk_body.py +179 -0
  90. bytekit/models/create_scrape_bulk_body_custom.py +52 -0
  91. bytekit/models/create_scrape_bulk_body_defaults.py +167 -0
  92. bytekit/models/create_scrape_bulk_body_defaults_formats_item.py +12 -0
  93. bytekit/models/create_scrape_bulk_body_defaults_headers.py +44 -0
  94. bytekit/models/create_scrape_bulk_body_items_item.py +226 -0
  95. bytekit/models/create_scrape_bulk_body_items_item_custom.py +50 -0
  96. bytekit/models/create_scrape_bulk_body_items_item_formats_item.py +12 -0
  97. bytekit/models/create_scrape_bulk_body_items_item_headers.py +44 -0
  98. bytekit/models/create_scrape_bulk_body_items_item_metadata.py +44 -0
  99. bytekit/models/create_scrape_bulk_response_202.py +166 -0
  100. bytekit/models/create_scrape_bulk_response_202_status.py +10 -0
  101. bytekit/models/create_search_body.py +140 -0
  102. bytekit/models/create_search_body_date_range.py +13 -0
  103. bytekit/models/create_search_body_type.py +10 -0
  104. bytekit/models/create_search_response_200.py +119 -0
  105. bytekit/models/create_search_response_200_results_item.py +161 -0
  106. bytekit/models/create_search_response_200_results_item_image.py +113 -0
  107. bytekit/models/create_search_response_502.py +46 -0
  108. bytekit/models/create_search_response_502_error.py +8 -0
  109. bytekit/models/credit_balance.py +91 -0
  110. bytekit/models/delete_bulk_response_200.py +164 -0
  111. bytekit/models/delete_bulk_response_200_status.py +11 -0
  112. bytekit/models/error.py +83 -0
  113. bytekit/models/error_error.py +100 -0
  114. bytekit/models/error_status.py +8 -0
  115. bytekit/models/fetch_request.py +276 -0
  116. bytekit/models/fetch_request_cache_ttl_type_1.py +8 -0
  117. bytekit/models/fetch_request_custom.py +48 -0
  118. bytekit/models/fetch_request_format.py +9 -0
  119. bytekit/models/fetch_request_markdown_images.py +11 -0
  120. bytekit/models/fetch_request_markdown_links.py +11 -0
  121. bytekit/models/fetch_request_markdown_mode.py +10 -0
  122. bytekit/models/get_bulk_response_200.py +164 -0
  123. bytekit/models/get_bulk_response_200_status.py +11 -0
  124. bytekit/models/get_fetch_bulk_response_200.py +44 -0
  125. bytekit/models/get_fetch_cache_ttl_type_1.py +8 -0
  126. bytekit/models/get_fetch_format.py +9 -0
  127. bytekit/models/get_scrape_bulk_response_200.py +164 -0
  128. bytekit/models/get_scrape_bulk_response_200_status.py +11 -0
  129. bytekit/models/get_usage_by_endpoint_response_200.py +114 -0
  130. bytekit/models/get_usage_by_endpoint_response_200_rows_item.py +90 -0
  131. bytekit/models/get_usage_by_endpoint_response_200_rows_item_endpoint.py +17 -0
  132. bytekit/models/get_usage_by_endpoint_response_200_totals.py +67 -0
  133. bytekit/models/get_usage_daily_response_200.py +97 -0
  134. bytekit/models/get_usage_daily_response_200_data_item.py +219 -0
  135. bytekit/models/get_usage_response_200.py +344 -0
  136. bytekit/models/get_usage_response_200_plan_type.py +10 -0
  137. bytekit/models/list_bulk_screenshots_response_200.py +44 -0
  138. bytekit/models/list_monitor_captures_response_200.py +101 -0
  139. bytekit/models/list_monitors_response_200.py +101 -0
  140. bytekit/models/list_monitors_status.py +12 -0
  141. bytekit/models/list_webhook_deliveries_response_200.py +101 -0
  142. bytekit/models/list_webhook_deliveries_status.py +11 -0
  143. bytekit/models/metadata.py +44 -0
  144. bytekit/models/monitor_create_request.py +219 -0
  145. bytekit/models/monitor_create_request_interval_type.py +11 -0
  146. bytekit/models/monitor_create_request_notify_on.py +9 -0
  147. bytekit/models/monitor_create_request_options.py +44 -0
  148. bytekit/models/monitor_create_request_scrape_options.py +44 -0
  149. bytekit/models/monitor_create_request_type.py +9 -0
  150. bytekit/models/monitor_create_request_webhook_headers.py +44 -0
  151. bytekit/models/monitor_create_response.py +423 -0
  152. bytekit/models/monitor_response.py +411 -0
  153. bytekit/models/monitor_response_interval_type.py +11 -0
  154. bytekit/models/monitor_response_metadata_type_0.py +44 -0
  155. bytekit/models/monitor_response_status.py +12 -0
  156. bytekit/models/monitor_response_type.py +9 -0
  157. bytekit/models/monitor_response_webhook_headers_type_0.py +44 -0
  158. bytekit/models/monitor_update_request.py +223 -0
  159. bytekit/models/monitor_update_request_interval_type.py +11 -0
  160. bytekit/models/monitor_update_request_notify_on.py +9 -0
  161. bytekit/models/monitor_update_request_options.py +44 -0
  162. bytekit/models/monitor_update_request_scrape_options.py +44 -0
  163. bytekit/models/monitor_update_request_status.py +9 -0
  164. bytekit/models/monitor_update_request_webhook_headers.py +44 -0
  165. bytekit/models/scrape_error_envelope.py +113 -0
  166. bytekit/models/scrape_error_envelope_error.py +93 -0
  167. bytekit/models/scrape_error_envelope_error_code.py +18 -0
  168. bytekit/models/scrape_error_envelope_schema_version.py +8 -0
  169. bytekit/models/scrape_error_envelope_status.py +8 -0
  170. bytekit/models/scrape_formats.py +183 -0
  171. bytekit/models/scrape_markdown_tokens.py +75 -0
  172. bytekit/models/scrape_metadata.py +262 -0
  173. bytekit/models/scrape_queued_envelope.py +124 -0
  174. bytekit/models/scrape_queued_envelope_schema_version.py +8 -0
  175. bytekit/models/scrape_queued_envelope_status.py +8 -0
  176. bytekit/models/scrape_request.py +485 -0
  177. bytekit/models/scrape_request_cache_ttl_type_1.py +8 -0
  178. bytekit/models/scrape_request_custom.py +48 -0
  179. bytekit/models/scrape_request_events_item.py +10 -0
  180. bytekit/models/scrape_request_formats_item.py +12 -0
  181. bytekit/models/scrape_request_headers.py +44 -0
  182. bytekit/models/scrape_request_markdown_images.py +11 -0
  183. bytekit/models/scrape_request_markdown_links.py +11 -0
  184. bytekit/models/scrape_request_markdown_mode.py +10 -0
  185. bytekit/models/scrape_request_token_encoding.py +9 -0
  186. bytekit/models/scrape_request_x_internal_scrape_path.py +8 -0
  187. bytekit/models/scrape_scored_image.py +128 -0
  188. bytekit/models/scrape_scored_link.py +94 -0
  189. bytekit/models/scrape_stats.py +75 -0
  190. bytekit/models/scrape_success_envelope.py +345 -0
  191. bytekit/models/scrape_success_envelope_cache.py +10 -0
  192. bytekit/models/scrape_success_envelope_custom.py +48 -0
  193. bytekit/models/scrape_success_envelope_schema_version.py +8 -0
  194. bytekit/models/scrape_success_envelope_status.py +8 -0
  195. bytekit/models/scrape_table.py +96 -0
  196. bytekit/models/scrape_table_kind.py +10 -0
  197. bytekit/models/scrape_warning.py +88 -0
  198. bytekit/models/scrape_warning_code.py +17 -0
  199. bytekit/models/screenshot_request.py +445 -0
  200. bytekit/models/screenshot_request_device.py +9 -0
  201. bytekit/models/screenshot_request_device_scale_factor_type_1.py +9 -0
  202. bytekit/models/screenshot_request_device_scale_factor_type_2_type_1.py +9 -0
  203. bytekit/models/screenshot_request_device_scale_factor_type_3_type_1.py +9 -0
  204. bytekit/models/screenshot_request_format.py +9 -0
  205. bytekit/models/screenshot_request_headers.py +44 -0
  206. bytekit/models/screenshot_request_wait_until.py +10 -0
  207. bytekit/models/screenshot_response.py +264 -0
  208. bytekit/models/screenshot_response_status.py +11 -0
  209. bytekit/models/sitemap_request.py +210 -0
  210. bytekit/models/sitemap_request_process_type_0.py +90 -0
  211. bytekit/models/sitemap_request_process_type_0_options.py +44 -0
  212. bytekit/models/sitemap_request_strategy.py +10 -0
  213. bytekit/models/sitemap_response.py +418 -0
  214. bytekit/models/sitemap_response_cache.py +10 -0
  215. bytekit/models/sitemap_response_metadata_type_0.py +44 -0
  216. bytekit/models/sitemap_response_process_type_0.py +44 -0
  217. bytekit/models/sitemap_response_sources_type_0.py +44 -0
  218. bytekit/models/sitemap_response_status.py +11 -0
  219. bytekit/models/viewport.py +67 -0
  220. bytekit/models/webhook_delivery_response.py +270 -0
  221. bytekit/models/webhook_delivery_response_event_type.py +14 -0
  222. bytekit/models/webhook_delivery_response_status.py +11 -0
  223. bytekit/py.typed +0 -0
  224. bytekit/types.py +54 -0
  225. bytekit_sdk-0.3.0.dist-info/METADATA +141 -0
  226. bytekit_sdk-0.3.0.dist-info/RECORD +227 -0
  227. bytekit_sdk-0.3.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,128 @@
1
+ from collections.abc import Mapping
2
+ from typing import (
3
+ Any,
4
+ TypeVar,
5
+ Union,
6
+ cast,
7
+ )
8
+
9
+ from attrs import define as _attrs_define
10
+ from attrs import field as _attrs_field
11
+
12
+ T = TypeVar("T", bound="ScrapeScoredImage")
13
+
14
+
15
+ @_attrs_define
16
+ class ScrapeScoredImage:
17
+ """
18
+ Attributes:
19
+ url (str):
20
+ alt (Union[None, str]):
21
+ width (Union[None, int]):
22
+ height (Union[None, int]):
23
+ format_ (Union[None, str]):
24
+ score (float):
25
+ """
26
+
27
+ url: str
28
+ alt: Union[None, str]
29
+ width: Union[None, int]
30
+ height: Union[None, int]
31
+ format_: Union[None, str]
32
+ score: float
33
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
34
+
35
+ def to_dict(self) -> dict[str, Any]:
36
+ url = self.url
37
+
38
+ alt: Union[None, str]
39
+ alt = self.alt
40
+
41
+ width: Union[None, int]
42
+ width = self.width
43
+
44
+ height: Union[None, int]
45
+ height = self.height
46
+
47
+ format_: Union[None, str]
48
+ format_ = self.format_
49
+
50
+ score = self.score
51
+
52
+ field_dict: dict[str, Any] = {}
53
+ field_dict.update(self.additional_properties)
54
+ field_dict.update(
55
+ {
56
+ "url": url,
57
+ "alt": alt,
58
+ "width": width,
59
+ "height": height,
60
+ "format": format_,
61
+ "score": score,
62
+ }
63
+ )
64
+
65
+ return field_dict
66
+
67
+ @classmethod
68
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
69
+ d = dict(src_dict)
70
+ url = d.pop("url")
71
+
72
+ def _parse_alt(data: object) -> Union[None, str]:
73
+ if data is None:
74
+ return data
75
+ return cast(Union[None, str], data)
76
+
77
+ alt = _parse_alt(d.pop("alt"))
78
+
79
+ def _parse_width(data: object) -> Union[None, int]:
80
+ if data is None:
81
+ return data
82
+ return cast(Union[None, int], data)
83
+
84
+ width = _parse_width(d.pop("width"))
85
+
86
+ def _parse_height(data: object) -> Union[None, int]:
87
+ if data is None:
88
+ return data
89
+ return cast(Union[None, int], data)
90
+
91
+ height = _parse_height(d.pop("height"))
92
+
93
+ def _parse_format_(data: object) -> Union[None, str]:
94
+ if data is None:
95
+ return data
96
+ return cast(Union[None, str], data)
97
+
98
+ format_ = _parse_format_(d.pop("format"))
99
+
100
+ score = d.pop("score")
101
+
102
+ scrape_scored_image = cls(
103
+ url=url,
104
+ alt=alt,
105
+ width=width,
106
+ height=height,
107
+ format_=format_,
108
+ score=score,
109
+ )
110
+
111
+ scrape_scored_image.additional_properties = d
112
+ return scrape_scored_image
113
+
114
+ @property
115
+ def additional_keys(self) -> list[str]:
116
+ return list(self.additional_properties.keys())
117
+
118
+ def __getitem__(self, key: str) -> Any:
119
+ return self.additional_properties[key]
120
+
121
+ def __setitem__(self, key: str, value: Any) -> None:
122
+ self.additional_properties[key] = value
123
+
124
+ def __delitem__(self, key: str) -> None:
125
+ del self.additional_properties[key]
126
+
127
+ def __contains__(self, key: str) -> bool:
128
+ return key in self.additional_properties
@@ -0,0 +1,94 @@
1
+ from collections.abc import Mapping
2
+ from typing import (
3
+ Any,
4
+ TypeVar,
5
+ Union,
6
+ cast,
7
+ )
8
+
9
+ from attrs import define as _attrs_define
10
+ from attrs import field as _attrs_field
11
+
12
+ T = TypeVar("T", bound="ScrapeScoredLink")
13
+
14
+
15
+ @_attrs_define
16
+ class ScrapeScoredLink:
17
+ """
18
+ Attributes:
19
+ url (str):
20
+ text (str):
21
+ is_internal (bool):
22
+ rel (Union[None, str]):
23
+ """
24
+
25
+ url: str
26
+ text: str
27
+ is_internal: bool
28
+ rel: Union[None, str]
29
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
+
31
+ def to_dict(self) -> dict[str, Any]:
32
+ url = self.url
33
+
34
+ text = self.text
35
+
36
+ is_internal = self.is_internal
37
+
38
+ rel: Union[None, str]
39
+ rel = self.rel
40
+
41
+ field_dict: dict[str, Any] = {}
42
+ field_dict.update(self.additional_properties)
43
+ field_dict.update(
44
+ {
45
+ "url": url,
46
+ "text": text,
47
+ "isInternal": is_internal,
48
+ "rel": rel,
49
+ }
50
+ )
51
+
52
+ return field_dict
53
+
54
+ @classmethod
55
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
56
+ d = dict(src_dict)
57
+ url = d.pop("url")
58
+
59
+ text = d.pop("text")
60
+
61
+ is_internal = d.pop("isInternal")
62
+
63
+ def _parse_rel(data: object) -> Union[None, str]:
64
+ if data is None:
65
+ return data
66
+ return cast(Union[None, str], data)
67
+
68
+ rel = _parse_rel(d.pop("rel"))
69
+
70
+ scrape_scored_link = cls(
71
+ url=url,
72
+ text=text,
73
+ is_internal=is_internal,
74
+ rel=rel,
75
+ )
76
+
77
+ scrape_scored_link.additional_properties = d
78
+ return scrape_scored_link
79
+
80
+ @property
81
+ def additional_keys(self) -> list[str]:
82
+ return list(self.additional_properties.keys())
83
+
84
+ def __getitem__(self, key: str) -> Any:
85
+ return self.additional_properties[key]
86
+
87
+ def __setitem__(self, key: str, value: Any) -> None:
88
+ self.additional_properties[key] = value
89
+
90
+ def __delitem__(self, key: str) -> None:
91
+ del self.additional_properties[key]
92
+
93
+ def __contains__(self, key: str) -> bool:
94
+ return key in self.additional_properties
@@ -0,0 +1,75 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ T = TypeVar("T", bound="ScrapeStats")
8
+
9
+
10
+ @_attrs_define
11
+ class ScrapeStats:
12
+ """
13
+ Attributes:
14
+ chars (int):
15
+ tokens (int):
16
+ blocks (int):
17
+ """
18
+
19
+ chars: int
20
+ tokens: int
21
+ blocks: int
22
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ chars = self.chars
26
+
27
+ tokens = self.tokens
28
+
29
+ blocks = self.blocks
30
+
31
+ field_dict: dict[str, Any] = {}
32
+ field_dict.update(self.additional_properties)
33
+ field_dict.update(
34
+ {
35
+ "chars": chars,
36
+ "tokens": tokens,
37
+ "blocks": blocks,
38
+ }
39
+ )
40
+
41
+ return field_dict
42
+
43
+ @classmethod
44
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
45
+ d = dict(src_dict)
46
+ chars = d.pop("chars")
47
+
48
+ tokens = d.pop("tokens")
49
+
50
+ blocks = d.pop("blocks")
51
+
52
+ scrape_stats = cls(
53
+ chars=chars,
54
+ tokens=tokens,
55
+ blocks=blocks,
56
+ )
57
+
58
+ scrape_stats.additional_properties = d
59
+ return scrape_stats
60
+
61
+ @property
62
+ def additional_keys(self) -> list[str]:
63
+ return list(self.additional_properties.keys())
64
+
65
+ def __getitem__(self, key: str) -> Any:
66
+ return self.additional_properties[key]
67
+
68
+ def __setitem__(self, key: str, value: Any) -> None:
69
+ self.additional_properties[key] = value
70
+
71
+ def __delitem__(self, key: str) -> None:
72
+ del self.additional_properties[key]
73
+
74
+ def __contains__(self, key: str) -> bool:
75
+ return key in self.additional_properties
@@ -0,0 +1,345 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import (
4
+ TYPE_CHECKING,
5
+ Any,
6
+ TypeVar,
7
+ Union,
8
+ cast,
9
+ )
10
+
11
+ from attrs import define as _attrs_define
12
+ from attrs import field as _attrs_field
13
+ from dateutil.parser import isoparse
14
+
15
+ from ..models.scrape_success_envelope_cache import ScrapeSuccessEnvelopeCache
16
+ from ..models.scrape_success_envelope_schema_version import (
17
+ ScrapeSuccessEnvelopeSchemaVersion,
18
+ )
19
+ from ..models.scrape_success_envelope_status import ScrapeSuccessEnvelopeStatus
20
+ from ..types import UNSET, Unset
21
+
22
+ if TYPE_CHECKING:
23
+ from ..models.scrape_formats import ScrapeFormats
24
+ from ..models.scrape_markdown_tokens import ScrapeMarkdownTokens
25
+ from ..models.scrape_metadata import ScrapeMetadata
26
+ from ..models.scrape_stats import ScrapeStats
27
+ from ..models.scrape_success_envelope_custom import ScrapeSuccessEnvelopeCustom
28
+ from ..models.scrape_table import ScrapeTable
29
+ from ..models.scrape_warning import ScrapeWarning
30
+
31
+
32
+ T = TypeVar("T", bound="ScrapeSuccessEnvelope")
33
+
34
+
35
+ @_attrs_define
36
+ class ScrapeSuccessEnvelope:
37
+ r"""
38
+ Example:
39
+ {'schema_version': 1, 'status': 'success', 'id': 'sc_01j9abc123', 'url': 'https://example.com', 'final_url':
40
+ 'https://example.com/', 'content_type': 'text/html; charset=UTF-8', 'content_length': 1256, 'status_code': 200,
41
+ 'retrieved_at': datetime.datetime(2025, 1, 15, 12, 0, tzinfo=datetime.timezone(datetime.timedelta(0), 'Z')),
42
+ 'formats': {'raw_html': '<html><body><h1>Hello World</h1><p>Example page with a <a href="/about">link</a> and an
43
+ image.</p></body></html>', 'html': '<html><body><h1>Hello World</h1><p>Example page with a <a
44
+ href="/about">link</a> and an image.</p></body></html>', 'markdown': '# Hello World\n\nExample page with a
45
+ [link](/about) and an image.\n\n![Alt text](https://example.com/photo.png)', 'links': [{'url':
46
+ 'https://example.com/about', 'text': 'link', 'isInternal': True, 'rel': None}], 'images': [{'url':
47
+ 'https://example.com/photo.png', 'alt': 'Alt text', 'width': 800, 'height': 600, 'format': 'png', 'score':
48
+ 0.95}]}, 'metadata': {'title': 'Example Domain', 'description': 'An example page for demonstration', 'language':
49
+ 'en', 'canonicalUrl': 'https://example.com', 'ogTitle': 'Example Domain', 'ogDescription': None, 'ogImage':
50
+ None, 'byline': 'Jane Doe', 'publishedAt': datetime.datetime(2025, 1, 15, 9, 0,
51
+ tzinfo=datetime.timezone(datetime.timedelta(0), 'Z'))}, 'tables': [{'kind': 'data', 'gfm': '| Col1 | Col2
52
+ |\n|------|------|\n| A | B |', 'rows': 2, 'cols': 2}], 'warnings': [{'code': 'lossy_table', 'message': 'Table
53
+ at index 3 was simplified', 'element': '<table>...</table>'}], 'stats': {'chars': 1256, 'tokens': 312, 'blocks':
54
+ 4}}
55
+
56
+ Attributes:
57
+ schema_version (ScrapeSuccessEnvelopeSchemaVersion): Envelope contract version emitted by current producers.
58
+ Consumers reading persisted envelopes must tolerate its absence as legacy v0 during rolling deploys.
59
+ status (ScrapeSuccessEnvelopeStatus):
60
+ id (str): Stable job identifier (sc_… prefixed). Canonical field. Example: sc_01j9abc123.
61
+ url (str):
62
+ final_url (str):
63
+ content_type (str):
64
+ content_length (int): Compressed wire bytes transferred for this request — the basis for
65
+ bandwidth-billed plans. Reflects what crossed the network on your behalf
66
+ (e.g. gzip/brotli-compressed size), not the decompressed content length.
67
+ status_code (Union[None, int]):
68
+ retrieved_at (datetime.datetime):
69
+ formats (ScrapeFormats):
70
+ metadata (ScrapeMetadata):
71
+ tables (Union[Unset, list['ScrapeTable']]): Tables extracted from the page. Present only when
72
+ markdown_include_media=true. Present only on the synchronous response and webhook delivery. Not included in `GET
73
+ /v1/scrape/:id`, bulk results, or cached hits.
74
+ warnings (Union[Unset, list['ScrapeWarning']]): Warnings about markdown processing, tag filtering, or requested
75
+ persisted artifacts. Markdown-pipeline and tag-filter warnings require `markdown_include_warnings=true`;
76
+ `artifact_unavailable` may appear independently when a requested persisted format cannot be rehydrated.
77
+ stats (Union[Unset, ScrapeStats]):
78
+ markdown_tokens (Union[Unset, ScrapeMarkdownTokens]):
79
+ billing_multiplier (Union[Unset, float]): The multiplier applied to wire bytes to compute `billed_bytes` for
80
+ this call (e.g. 0.5 for a cache hit, 1.0-2.0 for format combinations, or higher when `clean_markdown`
81
+ succeeded). Present whenever this call's billing amount has been finalized; omitted if unavailable.
82
+ billed_bytes (Union[Unset, int]): The actual bandwidth billed for this call — `round(content_length *
83
+ billing_multiplier)`. Present alongside `billing_multiplier`.
84
+ custom (Union[Unset, ScrapeSuccessEnvelopeCustom]): Custom metadata provided by the caller in the request
85
+ `custom` field. Stored verbatim and round-tripped on the synchronous response and webhook delivery. Not included
86
+ in `GET /v1/scrape/:id`, bulk results, or cached hits. Omitted when no custom metadata was provided.
87
+ cache (Union[Unset, ScrapeSuccessEnvelopeCache]): Cache verdict for the request that produced this envelope.
88
+ `hit` — served
89
+ from a prior cache entry (billed at 0.5×). `miss` — no reusable entry was
90
+ found, so the result was freshly fetched. `bypass` — `cache_ttl: '0'`
91
+ skipped the read. Cache-eligible fresh results are written through;
92
+ safety-classified WAF husks remain live-only. Present on the async success
93
+ envelope (synchronous and webhook delivery); omitted by paths with no cache
94
+ verdict (e.g. bulk results).
95
+ cache_age_s (Union[Unset, int]): Age in whole seconds of the cache entry replayed on a `hit`. Clamped to ≥ 0 to
96
+ absorb clock skew. Present only on `cache: hit`.
97
+ """
98
+
99
+ schema_version: ScrapeSuccessEnvelopeSchemaVersion
100
+ status: ScrapeSuccessEnvelopeStatus
101
+ id: str
102
+ url: str
103
+ final_url: str
104
+ content_type: str
105
+ content_length: int
106
+ status_code: Union[None, int]
107
+ retrieved_at: datetime.datetime
108
+ formats: "ScrapeFormats"
109
+ metadata: "ScrapeMetadata"
110
+ tables: Union[Unset, list["ScrapeTable"]] = UNSET
111
+ warnings: Union[Unset, list["ScrapeWarning"]] = UNSET
112
+ stats: Union[Unset, "ScrapeStats"] = UNSET
113
+ markdown_tokens: Union[Unset, "ScrapeMarkdownTokens"] = UNSET
114
+ billing_multiplier: Union[Unset, float] = UNSET
115
+ billed_bytes: Union[Unset, int] = UNSET
116
+ custom: Union[Unset, "ScrapeSuccessEnvelopeCustom"] = UNSET
117
+ cache: Union[Unset, ScrapeSuccessEnvelopeCache] = UNSET
118
+ cache_age_s: Union[Unset, int] = UNSET
119
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
120
+
121
+ def to_dict(self) -> dict[str, Any]:
122
+ schema_version = self.schema_version.value
123
+
124
+ status = self.status.value
125
+
126
+ id = self.id
127
+
128
+ url = self.url
129
+
130
+ final_url = self.final_url
131
+
132
+ content_type = self.content_type
133
+
134
+ content_length = self.content_length
135
+
136
+ status_code: Union[None, int]
137
+ status_code = self.status_code
138
+
139
+ retrieved_at = self.retrieved_at.isoformat()
140
+
141
+ formats = self.formats.to_dict()
142
+
143
+ metadata = self.metadata.to_dict()
144
+
145
+ tables: Union[Unset, list[dict[str, Any]]] = UNSET
146
+ if not isinstance(self.tables, Unset):
147
+ tables = []
148
+ for tables_item_data in self.tables:
149
+ tables_item = tables_item_data.to_dict()
150
+ tables.append(tables_item)
151
+
152
+ warnings: Union[Unset, list[dict[str, Any]]] = UNSET
153
+ if not isinstance(self.warnings, Unset):
154
+ warnings = []
155
+ for warnings_item_data in self.warnings:
156
+ warnings_item = warnings_item_data.to_dict()
157
+ warnings.append(warnings_item)
158
+
159
+ stats: Union[Unset, dict[str, Any]] = UNSET
160
+ if not isinstance(self.stats, Unset):
161
+ stats = self.stats.to_dict()
162
+
163
+ markdown_tokens: Union[Unset, dict[str, Any]] = UNSET
164
+ if not isinstance(self.markdown_tokens, Unset):
165
+ markdown_tokens = self.markdown_tokens.to_dict()
166
+
167
+ billing_multiplier = self.billing_multiplier
168
+
169
+ billed_bytes = self.billed_bytes
170
+
171
+ custom: Union[Unset, dict[str, Any]] = UNSET
172
+ if not isinstance(self.custom, Unset):
173
+ custom = self.custom.to_dict()
174
+
175
+ cache: Union[Unset, str] = UNSET
176
+ if not isinstance(self.cache, Unset):
177
+ cache = self.cache.value
178
+
179
+ cache_age_s = self.cache_age_s
180
+
181
+ field_dict: dict[str, Any] = {}
182
+ field_dict.update(self.additional_properties)
183
+ field_dict.update(
184
+ {
185
+ "schema_version": schema_version,
186
+ "status": status,
187
+ "id": id,
188
+ "url": url,
189
+ "final_url": final_url,
190
+ "content_type": content_type,
191
+ "content_length": content_length,
192
+ "status_code": status_code,
193
+ "retrieved_at": retrieved_at,
194
+ "formats": formats,
195
+ "metadata": metadata,
196
+ }
197
+ )
198
+ if tables is not UNSET:
199
+ field_dict["tables"] = tables
200
+ if warnings is not UNSET:
201
+ field_dict["warnings"] = warnings
202
+ if stats is not UNSET:
203
+ field_dict["stats"] = stats
204
+ if markdown_tokens is not UNSET:
205
+ field_dict["markdown_tokens"] = markdown_tokens
206
+ if billing_multiplier is not UNSET:
207
+ field_dict["billing_multiplier"] = billing_multiplier
208
+ if billed_bytes is not UNSET:
209
+ field_dict["billed_bytes"] = billed_bytes
210
+ if custom is not UNSET:
211
+ field_dict["custom"] = custom
212
+ if cache is not UNSET:
213
+ field_dict["cache"] = cache
214
+ if cache_age_s is not UNSET:
215
+ field_dict["cache_age_s"] = cache_age_s
216
+
217
+ return field_dict
218
+
219
+ @classmethod
220
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
221
+ from ..models.scrape_formats import ScrapeFormats
222
+ from ..models.scrape_markdown_tokens import ScrapeMarkdownTokens
223
+ from ..models.scrape_metadata import ScrapeMetadata
224
+ from ..models.scrape_stats import ScrapeStats
225
+ from ..models.scrape_success_envelope_custom import ScrapeSuccessEnvelopeCustom
226
+ from ..models.scrape_table import ScrapeTable
227
+ from ..models.scrape_warning import ScrapeWarning
228
+
229
+ d = dict(src_dict)
230
+ schema_version = ScrapeSuccessEnvelopeSchemaVersion(d.pop("schema_version"))
231
+
232
+ status = ScrapeSuccessEnvelopeStatus(d.pop("status"))
233
+
234
+ id = d.pop("id")
235
+
236
+ url = d.pop("url")
237
+
238
+ final_url = d.pop("final_url")
239
+
240
+ content_type = d.pop("content_type")
241
+
242
+ content_length = d.pop("content_length")
243
+
244
+ def _parse_status_code(data: object) -> Union[None, int]:
245
+ if data is None:
246
+ return data
247
+ return cast(Union[None, int], data)
248
+
249
+ status_code = _parse_status_code(d.pop("status_code"))
250
+
251
+ retrieved_at = isoparse(d.pop("retrieved_at"))
252
+
253
+ formats = ScrapeFormats.from_dict(d.pop("formats"))
254
+
255
+ metadata = ScrapeMetadata.from_dict(d.pop("metadata"))
256
+
257
+ tables = []
258
+ _tables = d.pop("tables", UNSET)
259
+ for tables_item_data in _tables or []:
260
+ tables_item = ScrapeTable.from_dict(tables_item_data)
261
+
262
+ tables.append(tables_item)
263
+
264
+ warnings = []
265
+ _warnings = d.pop("warnings", UNSET)
266
+ for warnings_item_data in _warnings or []:
267
+ warnings_item = ScrapeWarning.from_dict(warnings_item_data)
268
+
269
+ warnings.append(warnings_item)
270
+
271
+ _stats = d.pop("stats", UNSET)
272
+ stats: Union[Unset, ScrapeStats]
273
+ if isinstance(_stats, Unset):
274
+ stats = UNSET
275
+ else:
276
+ stats = ScrapeStats.from_dict(_stats)
277
+
278
+ _markdown_tokens = d.pop("markdown_tokens", UNSET)
279
+ markdown_tokens: Union[Unset, ScrapeMarkdownTokens]
280
+ if isinstance(_markdown_tokens, Unset):
281
+ markdown_tokens = UNSET
282
+ else:
283
+ markdown_tokens = ScrapeMarkdownTokens.from_dict(_markdown_tokens)
284
+
285
+ billing_multiplier = d.pop("billing_multiplier", UNSET)
286
+
287
+ billed_bytes = d.pop("billed_bytes", UNSET)
288
+
289
+ _custom = d.pop("custom", UNSET)
290
+ custom: Union[Unset, ScrapeSuccessEnvelopeCustom]
291
+ if isinstance(_custom, Unset):
292
+ custom = UNSET
293
+ else:
294
+ custom = ScrapeSuccessEnvelopeCustom.from_dict(_custom)
295
+
296
+ _cache = d.pop("cache", UNSET)
297
+ cache: Union[Unset, ScrapeSuccessEnvelopeCache]
298
+ if isinstance(_cache, Unset):
299
+ cache = UNSET
300
+ else:
301
+ cache = ScrapeSuccessEnvelopeCache(_cache)
302
+
303
+ cache_age_s = d.pop("cache_age_s", UNSET)
304
+
305
+ scrape_success_envelope = cls(
306
+ schema_version=schema_version,
307
+ status=status,
308
+ id=id,
309
+ url=url,
310
+ final_url=final_url,
311
+ content_type=content_type,
312
+ content_length=content_length,
313
+ status_code=status_code,
314
+ retrieved_at=retrieved_at,
315
+ formats=formats,
316
+ metadata=metadata,
317
+ tables=tables,
318
+ warnings=warnings,
319
+ stats=stats,
320
+ markdown_tokens=markdown_tokens,
321
+ billing_multiplier=billing_multiplier,
322
+ billed_bytes=billed_bytes,
323
+ custom=custom,
324
+ cache=cache,
325
+ cache_age_s=cache_age_s,
326
+ )
327
+
328
+ scrape_success_envelope.additional_properties = d
329
+ return scrape_success_envelope
330
+
331
+ @property
332
+ def additional_keys(self) -> list[str]:
333
+ return list(self.additional_properties.keys())
334
+
335
+ def __getitem__(self, key: str) -> Any:
336
+ return self.additional_properties[key]
337
+
338
+ def __setitem__(self, key: str, value: Any) -> None:
339
+ self.additional_properties[key] = value
340
+
341
+ def __delitem__(self, key: str) -> None:
342
+ del self.additional_properties[key]
343
+
344
+ def __contains__(self, key: str) -> bool:
345
+ return key in self.additional_properties
@@ -0,0 +1,10 @@
1
+ from enum import Enum
2
+
3
+
4
+ class ScrapeSuccessEnvelopeCache(str, Enum):
5
+ BYPASS = "bypass"
6
+ HIT = "hit"
7
+ MISS = "miss"
8
+
9
+ def __str__(self) -> str:
10
+ return str(self.value)
@@ -0,0 +1,48 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ T = TypeVar("T", bound="ScrapeSuccessEnvelopeCustom")
8
+
9
+
10
+ @_attrs_define
11
+ class ScrapeSuccessEnvelopeCustom:
12
+ """Custom metadata provided by the caller in the request `custom` field. Stored verbatim and round-tripped on the
13
+ synchronous response and webhook delivery. Not included in `GET /v1/scrape/:id`, bulk results, or cached hits.
14
+ Omitted when no custom metadata was provided.
15
+
16
+ """
17
+
18
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
19
+
20
+ def to_dict(self) -> dict[str, Any]:
21
+ field_dict: dict[str, Any] = {}
22
+ field_dict.update(self.additional_properties)
23
+
24
+ return field_dict
25
+
26
+ @classmethod
27
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
28
+ d = dict(src_dict)
29
+ scrape_success_envelope_custom = cls()
30
+
31
+ scrape_success_envelope_custom.additional_properties = d
32
+ return scrape_success_envelope_custom
33
+
34
+ @property
35
+ def additional_keys(self) -> list[str]:
36
+ return list(self.additional_properties.keys())
37
+
38
+ def __getitem__(self, key: str) -> Any:
39
+ return self.additional_properties[key]
40
+
41
+ def __setitem__(self, key: str, value: Any) -> None:
42
+ self.additional_properties[key] = value
43
+
44
+ def __delitem__(self, key: str) -> None:
45
+ del self.additional_properties[key]
46
+
47
+ def __contains__(self, key: str) -> bool:
48
+ return key in self.additional_properties