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,167 @@
1
+ from collections.abc import Mapping
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ TypeVar,
6
+ Union,
7
+ )
8
+
9
+ from attrs import define as _attrs_define
10
+ from attrs import field as _attrs_field
11
+
12
+ from ..models.create_scrape_bulk_body_defaults_formats_item import (
13
+ CreateScrapeBulkBodyDefaultsFormatsItem,
14
+ )
15
+ from ..types import UNSET, Unset
16
+
17
+ if TYPE_CHECKING:
18
+ from ..models.cookie import Cookie
19
+ from ..models.create_scrape_bulk_body_defaults_headers import (
20
+ CreateScrapeBulkBodyDefaultsHeaders,
21
+ )
22
+
23
+
24
+ T = TypeVar("T", bound="CreateScrapeBulkBodyDefaults")
25
+
26
+
27
+ @_attrs_define
28
+ class CreateScrapeBulkBodyDefaults:
29
+ """
30
+ Attributes:
31
+ formats (Union[Unset, list[CreateScrapeBulkBodyDefaultsFormatsItem]]):
32
+ country (Union[Unset, str]): Default: 'US'.
33
+ cookies (Union[Unset, list['Cookie']]):
34
+ headers (Union[Unset, CreateScrapeBulkBodyDefaultsHeaders]):
35
+ delay_ms (Union[Unset, int]): Default: 0.
36
+ timeout_ms (Union[Unset, int]): Default: 30000.
37
+ clean_markdown (Union[Unset, bool]): Bulk-level default for LLM markdown cleaning, applied to
38
+ every scrape entry that does not set its own
39
+ `clean_markdown`. When `true` and `markdown` is in
40
+ `formats`, the converted markdown is sent to Groq for
41
+ cleaning before delivery; any Groq failure returns the
42
+ raw markdown plus a warning. Billing: 3× credits and wire
43
+ bytes applied only when cleaning succeeds.
44
+ Default: False.
45
+ """
46
+
47
+ formats: Union[Unset, list[CreateScrapeBulkBodyDefaultsFormatsItem]] = UNSET
48
+ country: Union[Unset, str] = "US"
49
+ cookies: Union[Unset, list["Cookie"]] = UNSET
50
+ headers: Union[Unset, "CreateScrapeBulkBodyDefaultsHeaders"] = UNSET
51
+ delay_ms: Union[Unset, int] = 0
52
+ timeout_ms: Union[Unset, int] = 30000
53
+ clean_markdown: Union[Unset, bool] = False
54
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
55
+
56
+ def to_dict(self) -> dict[str, Any]:
57
+ formats: Union[Unset, list[str]] = UNSET
58
+ if not isinstance(self.formats, Unset):
59
+ formats = []
60
+ for formats_item_data in self.formats:
61
+ formats_item = formats_item_data.value
62
+ formats.append(formats_item)
63
+
64
+ country = self.country
65
+
66
+ cookies: Union[Unset, list[dict[str, Any]]] = UNSET
67
+ if not isinstance(self.cookies, Unset):
68
+ cookies = []
69
+ for cookies_item_data in self.cookies:
70
+ cookies_item = cookies_item_data.to_dict()
71
+ cookies.append(cookies_item)
72
+
73
+ headers: Union[Unset, dict[str, Any]] = UNSET
74
+ if not isinstance(self.headers, Unset):
75
+ headers = self.headers.to_dict()
76
+
77
+ delay_ms = self.delay_ms
78
+
79
+ timeout_ms = self.timeout_ms
80
+
81
+ clean_markdown = self.clean_markdown
82
+
83
+ field_dict: dict[str, Any] = {}
84
+ field_dict.update(self.additional_properties)
85
+ field_dict.update({})
86
+ if formats is not UNSET:
87
+ field_dict["formats"] = formats
88
+ if country is not UNSET:
89
+ field_dict["country"] = country
90
+ if cookies is not UNSET:
91
+ field_dict["cookies"] = cookies
92
+ if headers is not UNSET:
93
+ field_dict["headers"] = headers
94
+ if delay_ms is not UNSET:
95
+ field_dict["delay_ms"] = delay_ms
96
+ if timeout_ms is not UNSET:
97
+ field_dict["timeout_ms"] = timeout_ms
98
+ if clean_markdown is not UNSET:
99
+ field_dict["clean_markdown"] = clean_markdown
100
+
101
+ return field_dict
102
+
103
+ @classmethod
104
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
105
+ from ..models.cookie import Cookie
106
+ from ..models.create_scrape_bulk_body_defaults_headers import (
107
+ CreateScrapeBulkBodyDefaultsHeaders,
108
+ )
109
+
110
+ d = dict(src_dict)
111
+ formats = []
112
+ _formats = d.pop("formats", UNSET)
113
+ for formats_item_data in _formats or []:
114
+ formats_item = CreateScrapeBulkBodyDefaultsFormatsItem(formats_item_data)
115
+
116
+ formats.append(formats_item)
117
+
118
+ country = d.pop("country", UNSET)
119
+
120
+ cookies = []
121
+ _cookies = d.pop("cookies", UNSET)
122
+ for cookies_item_data in _cookies or []:
123
+ cookies_item = Cookie.from_dict(cookies_item_data)
124
+
125
+ cookies.append(cookies_item)
126
+
127
+ _headers = d.pop("headers", UNSET)
128
+ headers: Union[Unset, CreateScrapeBulkBodyDefaultsHeaders]
129
+ if isinstance(_headers, Unset):
130
+ headers = UNSET
131
+ else:
132
+ headers = CreateScrapeBulkBodyDefaultsHeaders.from_dict(_headers)
133
+
134
+ delay_ms = d.pop("delay_ms", UNSET)
135
+
136
+ timeout_ms = d.pop("timeout_ms", UNSET)
137
+
138
+ clean_markdown = d.pop("clean_markdown", UNSET)
139
+
140
+ create_scrape_bulk_body_defaults = cls(
141
+ formats=formats,
142
+ country=country,
143
+ cookies=cookies,
144
+ headers=headers,
145
+ delay_ms=delay_ms,
146
+ timeout_ms=timeout_ms,
147
+ clean_markdown=clean_markdown,
148
+ )
149
+
150
+ create_scrape_bulk_body_defaults.additional_properties = d
151
+ return create_scrape_bulk_body_defaults
152
+
153
+ @property
154
+ def additional_keys(self) -> list[str]:
155
+ return list(self.additional_properties.keys())
156
+
157
+ def __getitem__(self, key: str) -> Any:
158
+ return self.additional_properties[key]
159
+
160
+ def __setitem__(self, key: str, value: Any) -> None:
161
+ self.additional_properties[key] = value
162
+
163
+ def __delitem__(self, key: str) -> None:
164
+ del self.additional_properties[key]
165
+
166
+ def __contains__(self, key: str) -> bool:
167
+ return key in self.additional_properties
@@ -0,0 +1,12 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CreateScrapeBulkBodyDefaultsFormatsItem(str, Enum):
5
+ HTML = "html"
6
+ IMAGES = "images"
7
+ LINKS = "links"
8
+ MARKDOWN = "markdown"
9
+ RAW_HTML = "raw_html"
10
+
11
+ def __str__(self) -> str:
12
+ return str(self.value)
@@ -0,0 +1,44 @@
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="CreateScrapeBulkBodyDefaultsHeaders")
8
+
9
+
10
+ @_attrs_define
11
+ class CreateScrapeBulkBodyDefaultsHeaders:
12
+ """ """
13
+
14
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ create_scrape_bulk_body_defaults_headers = cls()
26
+
27
+ create_scrape_bulk_body_defaults_headers.additional_properties = d
28
+ return create_scrape_bulk_body_defaults_headers
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> str:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: str) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,226 @@
1
+ from collections.abc import Mapping
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ TypeVar,
6
+ Union,
7
+ )
8
+
9
+ from attrs import define as _attrs_define
10
+ from attrs import field as _attrs_field
11
+
12
+ from ..models.create_scrape_bulk_body_items_item_formats_item import (
13
+ CreateScrapeBulkBodyItemsItemFormatsItem,
14
+ )
15
+ from ..types import UNSET, Unset
16
+
17
+ if TYPE_CHECKING:
18
+ from ..models.cookie import Cookie
19
+ from ..models.create_scrape_bulk_body_items_item_custom import (
20
+ CreateScrapeBulkBodyItemsItemCustom,
21
+ )
22
+ from ..models.create_scrape_bulk_body_items_item_headers import (
23
+ CreateScrapeBulkBodyItemsItemHeaders,
24
+ )
25
+ from ..models.create_scrape_bulk_body_items_item_metadata import (
26
+ CreateScrapeBulkBodyItemsItemMetadata,
27
+ )
28
+
29
+
30
+ T = TypeVar("T", bound="CreateScrapeBulkBodyItemsItem")
31
+
32
+
33
+ @_attrs_define
34
+ class CreateScrapeBulkBodyItemsItem:
35
+ """
36
+ Attributes:
37
+ url (str):
38
+ formats (Union[Unset, list[CreateScrapeBulkBodyItemsItemFormatsItem]]):
39
+ country (Union[Unset, str]):
40
+ cookies (Union[Unset, list['Cookie']]):
41
+ headers (Union[Unset, CreateScrapeBulkBodyItemsItemHeaders]):
42
+ delay_ms (Union[Unset, int]):
43
+ timeout_ms (Union[Unset, int]):
44
+ metadata (Union[Unset, CreateScrapeBulkBodyItemsItemMetadata]):
45
+ clean_markdown (Union[Unset, bool]): Per-item override for LLM markdown cleaning. When
46
+ `true` and `markdown` is in `formats`, the converted
47
+ markdown is sent to Groq for cleaning (boilerplate
48
+ removal, ad stripping) before delivery. Graceful
49
+ degradation: any Groq failure returns the raw markdown
50
+ unchanged plus a warning. Billing: 3× credits and wire
51
+ bytes applied only when cleaning succeeds.
52
+ Default: False.
53
+ custom (Union[Unset, CreateScrapeBulkBodyItemsItemCustom]): Per-item user-supplied JSON payload, capped at 4096
54
+ UTF-8 bytes. Overrides the top-level `custom` for this
55
+ entry. Echoed on the entry's success envelope in the
56
+ bulk results response. Applies to scrape-type entries
57
+ only.
58
+ """
59
+
60
+ url: str
61
+ formats: Union[Unset, list[CreateScrapeBulkBodyItemsItemFormatsItem]] = UNSET
62
+ country: Union[Unset, str] = UNSET
63
+ cookies: Union[Unset, list["Cookie"]] = UNSET
64
+ headers: Union[Unset, "CreateScrapeBulkBodyItemsItemHeaders"] = UNSET
65
+ delay_ms: Union[Unset, int] = UNSET
66
+ timeout_ms: Union[Unset, int] = UNSET
67
+ metadata: Union[Unset, "CreateScrapeBulkBodyItemsItemMetadata"] = UNSET
68
+ clean_markdown: Union[Unset, bool] = False
69
+ custom: Union[Unset, "CreateScrapeBulkBodyItemsItemCustom"] = UNSET
70
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
71
+
72
+ def to_dict(self) -> dict[str, Any]:
73
+ url = self.url
74
+
75
+ formats: Union[Unset, list[str]] = UNSET
76
+ if not isinstance(self.formats, Unset):
77
+ formats = []
78
+ for formats_item_data in self.formats:
79
+ formats_item = formats_item_data.value
80
+ formats.append(formats_item)
81
+
82
+ country = self.country
83
+
84
+ cookies: Union[Unset, list[dict[str, Any]]] = UNSET
85
+ if not isinstance(self.cookies, Unset):
86
+ cookies = []
87
+ for cookies_item_data in self.cookies:
88
+ cookies_item = cookies_item_data.to_dict()
89
+ cookies.append(cookies_item)
90
+
91
+ headers: Union[Unset, dict[str, Any]] = UNSET
92
+ if not isinstance(self.headers, Unset):
93
+ headers = self.headers.to_dict()
94
+
95
+ delay_ms = self.delay_ms
96
+
97
+ timeout_ms = self.timeout_ms
98
+
99
+ metadata: Union[Unset, dict[str, Any]] = UNSET
100
+ if not isinstance(self.metadata, Unset):
101
+ metadata = self.metadata.to_dict()
102
+
103
+ clean_markdown = self.clean_markdown
104
+
105
+ custom: Union[Unset, dict[str, Any]] = UNSET
106
+ if not isinstance(self.custom, Unset):
107
+ custom = self.custom.to_dict()
108
+
109
+ field_dict: dict[str, Any] = {}
110
+ field_dict.update(self.additional_properties)
111
+ field_dict.update(
112
+ {
113
+ "url": url,
114
+ }
115
+ )
116
+ if formats is not UNSET:
117
+ field_dict["formats"] = formats
118
+ if country is not UNSET:
119
+ field_dict["country"] = country
120
+ if cookies is not UNSET:
121
+ field_dict["cookies"] = cookies
122
+ if headers is not UNSET:
123
+ field_dict["headers"] = headers
124
+ if delay_ms is not UNSET:
125
+ field_dict["delay_ms"] = delay_ms
126
+ if timeout_ms is not UNSET:
127
+ field_dict["timeout_ms"] = timeout_ms
128
+ if metadata is not UNSET:
129
+ field_dict["metadata"] = metadata
130
+ if clean_markdown is not UNSET:
131
+ field_dict["clean_markdown"] = clean_markdown
132
+ if custom is not UNSET:
133
+ field_dict["custom"] = custom
134
+
135
+ return field_dict
136
+
137
+ @classmethod
138
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
139
+ from ..models.cookie import Cookie
140
+ from ..models.create_scrape_bulk_body_items_item_custom import (
141
+ CreateScrapeBulkBodyItemsItemCustom,
142
+ )
143
+ from ..models.create_scrape_bulk_body_items_item_headers import (
144
+ CreateScrapeBulkBodyItemsItemHeaders,
145
+ )
146
+ from ..models.create_scrape_bulk_body_items_item_metadata import (
147
+ CreateScrapeBulkBodyItemsItemMetadata,
148
+ )
149
+
150
+ d = dict(src_dict)
151
+ url = d.pop("url")
152
+
153
+ formats = []
154
+ _formats = d.pop("formats", UNSET)
155
+ for formats_item_data in _formats or []:
156
+ formats_item = CreateScrapeBulkBodyItemsItemFormatsItem(formats_item_data)
157
+
158
+ formats.append(formats_item)
159
+
160
+ country = d.pop("country", UNSET)
161
+
162
+ cookies = []
163
+ _cookies = d.pop("cookies", UNSET)
164
+ for cookies_item_data in _cookies or []:
165
+ cookies_item = Cookie.from_dict(cookies_item_data)
166
+
167
+ cookies.append(cookies_item)
168
+
169
+ _headers = d.pop("headers", UNSET)
170
+ headers: Union[Unset, CreateScrapeBulkBodyItemsItemHeaders]
171
+ if isinstance(_headers, Unset):
172
+ headers = UNSET
173
+ else:
174
+ headers = CreateScrapeBulkBodyItemsItemHeaders.from_dict(_headers)
175
+
176
+ delay_ms = d.pop("delay_ms", UNSET)
177
+
178
+ timeout_ms = d.pop("timeout_ms", UNSET)
179
+
180
+ _metadata = d.pop("metadata", UNSET)
181
+ metadata: Union[Unset, CreateScrapeBulkBodyItemsItemMetadata]
182
+ if isinstance(_metadata, Unset):
183
+ metadata = UNSET
184
+ else:
185
+ metadata = CreateScrapeBulkBodyItemsItemMetadata.from_dict(_metadata)
186
+
187
+ clean_markdown = d.pop("clean_markdown", UNSET)
188
+
189
+ _custom = d.pop("custom", UNSET)
190
+ custom: Union[Unset, CreateScrapeBulkBodyItemsItemCustom]
191
+ if isinstance(_custom, Unset):
192
+ custom = UNSET
193
+ else:
194
+ custom = CreateScrapeBulkBodyItemsItemCustom.from_dict(_custom)
195
+
196
+ create_scrape_bulk_body_items_item = cls(
197
+ url=url,
198
+ formats=formats,
199
+ country=country,
200
+ cookies=cookies,
201
+ headers=headers,
202
+ delay_ms=delay_ms,
203
+ timeout_ms=timeout_ms,
204
+ metadata=metadata,
205
+ clean_markdown=clean_markdown,
206
+ custom=custom,
207
+ )
208
+
209
+ create_scrape_bulk_body_items_item.additional_properties = d
210
+ return create_scrape_bulk_body_items_item
211
+
212
+ @property
213
+ def additional_keys(self) -> list[str]:
214
+ return list(self.additional_properties.keys())
215
+
216
+ def __getitem__(self, key: str) -> Any:
217
+ return self.additional_properties[key]
218
+
219
+ def __setitem__(self, key: str, value: Any) -> None:
220
+ self.additional_properties[key] = value
221
+
222
+ def __delitem__(self, key: str) -> None:
223
+ del self.additional_properties[key]
224
+
225
+ def __contains__(self, key: str) -> bool:
226
+ return key in self.additional_properties
@@ -0,0 +1,50 @@
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="CreateScrapeBulkBodyItemsItemCustom")
8
+
9
+
10
+ @_attrs_define
11
+ class CreateScrapeBulkBodyItemsItemCustom:
12
+ """Per-item user-supplied JSON payload, capped at 4096
13
+ UTF-8 bytes. Overrides the top-level `custom` for this
14
+ entry. Echoed on the entry's success envelope in the
15
+ bulk results response. Applies to scrape-type entries
16
+ only.
17
+
18
+ """
19
+
20
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
21
+
22
+ def to_dict(self) -> dict[str, Any]:
23
+ field_dict: dict[str, Any] = {}
24
+ field_dict.update(self.additional_properties)
25
+
26
+ return field_dict
27
+
28
+ @classmethod
29
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
30
+ d = dict(src_dict)
31
+ create_scrape_bulk_body_items_item_custom = cls()
32
+
33
+ create_scrape_bulk_body_items_item_custom.additional_properties = d
34
+ return create_scrape_bulk_body_items_item_custom
35
+
36
+ @property
37
+ def additional_keys(self) -> list[str]:
38
+ return list(self.additional_properties.keys())
39
+
40
+ def __getitem__(self, key: str) -> Any:
41
+ return self.additional_properties[key]
42
+
43
+ def __setitem__(self, key: str, value: Any) -> None:
44
+ self.additional_properties[key] = value
45
+
46
+ def __delitem__(self, key: str) -> None:
47
+ del self.additional_properties[key]
48
+
49
+ def __contains__(self, key: str) -> bool:
50
+ return key in self.additional_properties
@@ -0,0 +1,12 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CreateScrapeBulkBodyItemsItemFormatsItem(str, Enum):
5
+ HTML = "html"
6
+ IMAGES = "images"
7
+ LINKS = "links"
8
+ MARKDOWN = "markdown"
9
+ RAW_HTML = "raw_html"
10
+
11
+ def __str__(self) -> str:
12
+ return str(self.value)
@@ -0,0 +1,44 @@
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="CreateScrapeBulkBodyItemsItemHeaders")
8
+
9
+
10
+ @_attrs_define
11
+ class CreateScrapeBulkBodyItemsItemHeaders:
12
+ """ """
13
+
14
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ create_scrape_bulk_body_items_item_headers = cls()
26
+
27
+ create_scrape_bulk_body_items_item_headers.additional_properties = d
28
+ return create_scrape_bulk_body_items_item_headers
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> str:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: str) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,44 @@
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="CreateScrapeBulkBodyItemsItemMetadata")
8
+
9
+
10
+ @_attrs_define
11
+ class CreateScrapeBulkBodyItemsItemMetadata:
12
+ """ """
13
+
14
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ create_scrape_bulk_body_items_item_metadata = cls()
26
+
27
+ create_scrape_bulk_body_items_item_metadata.additional_properties = d
28
+ return create_scrape_bulk_body_items_item_metadata
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> Any:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: Any) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties