context.dev 2.18.0 → 2.20.0

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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +220 -0
  3. data/README.md +1 -1
  4. data/lib/context_dev/client.rb +0 -4
  5. data/lib/context_dev/models/monitor_retrieve_run_params.rb +26 -0
  6. data/lib/context_dev/models/monitor_retrieve_run_response.rb +232 -0
  7. data/lib/context_dev/models/monitor_rotate_webhook_secret_params.rb +20 -0
  8. data/lib/context_dev/models/monitor_rotate_webhook_secret_response.rb +765 -0
  9. data/lib/context_dev/models/{web_web_scrape_sitemap_params.rb → web_map_urls_params.rb} +14 -14
  10. data/lib/context_dev/models/web_map_urls_response.rb +123 -0
  11. data/lib/context_dev/models/web_scrape_params.rb +1035 -0
  12. data/lib/context_dev/models/web_scrape_response.rb +974 -0
  13. data/lib/context_dev/models/web_screenshot_params.rb +15 -1
  14. data/lib/context_dev/models/web_screenshot_response.rb +3 -3
  15. data/lib/context_dev/models.rb +8 -22
  16. data/lib/context_dev/resources/brand.rb +0 -36
  17. data/lib/context_dev/resources/monitors.rb +47 -0
  18. data/lib/context_dev/resources/web.rb +118 -486
  19. data/lib/context_dev/version.rb +1 -1
  20. data/lib/context_dev.rb +8 -23
  21. data/rbi/context_dev/client.rbi +0 -3
  22. data/rbi/context_dev/models/monitor_retrieve_run_params.rbi +46 -0
  23. data/rbi/context_dev/models/monitor_retrieve_run_response.rbi +452 -0
  24. data/rbi/context_dev/models/monitor_rotate_webhook_secret_params.rbi +38 -0
  25. data/rbi/context_dev/models/monitor_rotate_webhook_secret_response.rbi +1367 -0
  26. data/rbi/context_dev/models/{web_web_scrape_sitemap_params.rbi → web_map_urls_params.rbi} +23 -45
  27. data/rbi/context_dev/models/web_map_urls_response.rbi +226 -0
  28. data/rbi/context_dev/models/web_scrape_params.rbi +2221 -0
  29. data/rbi/context_dev/models/web_scrape_response.rbi +1874 -0
  30. data/rbi/context_dev/models/web_screenshot_params.rbi +23 -0
  31. data/rbi/context_dev/models/web_screenshot_response.rbi +4 -4
  32. data/rbi/context_dev/models.rbi +9 -24
  33. data/rbi/context_dev/resources/brand.rbi +0 -35
  34. data/rbi/context_dev/resources/monitors.rbi +24 -0
  35. data/rbi/context_dev/resources/web.rbi +152 -654
  36. data/sig/context_dev/client.rbs +0 -2
  37. data/sig/context_dev/models/monitor_retrieve_run_params.rbs +28 -0
  38. data/sig/context_dev/models/monitor_retrieve_run_response.rbs +182 -0
  39. data/sig/context_dev/models/monitor_rotate_webhook_secret_params.rbs +23 -0
  40. data/sig/context_dev/models/monitor_rotate_webhook_secret_response.rbs +545 -0
  41. data/sig/context_dev/models/{web_web_scrape_sitemap_params.rbs → web_map_urls_params.rbs} +22 -22
  42. data/sig/context_dev/models/web_map_urls_response.rbs +125 -0
  43. data/sig/context_dev/models/web_scrape_params.rbs +925 -0
  44. data/sig/context_dev/models/web_scrape_response.rbs +782 -0
  45. data/sig/context_dev/models/web_screenshot_params.rbs +7 -0
  46. data/sig/context_dev/models.rbs +8 -22
  47. data/sig/context_dev/resources/brand.rbs +0 -9
  48. data/sig/context_dev/resources/monitors.rbs +11 -0
  49. data/sig/context_dev/resources/web.rbs +33 -128
  50. metadata +26 -71
  51. data/lib/context_dev/models/ai_extract_product_params.rb +0 -125
  52. data/lib/context_dev/models/ai_extract_product_response.rb +0 -402
  53. data/lib/context_dev/models/ai_extract_products_params.rb +0 -233
  54. data/lib/context_dev/models/ai_extract_products_response.rb +0 -370
  55. data/lib/context_dev/models/brand_retrieve_simplified_params.rb +0 -120
  56. data/lib/context_dev/models/brand_retrieve_simplified_response.rb +0 -441
  57. data/lib/context_dev/models/web_extract_fonts_params.rb +0 -114
  58. data/lib/context_dev/models/web_extract_fonts_response.rb +0 -291
  59. data/lib/context_dev/models/web_extract_params.rb +0 -419
  60. data/lib/context_dev/models/web_extract_response.rb +0 -287
  61. data/lib/context_dev/models/web_web_scrape_bytes_params.rb +0 -346
  62. data/lib/context_dev/models/web_web_scrape_bytes_response.rb +0 -135
  63. data/lib/context_dev/models/web_web_scrape_html_params.rb +0 -812
  64. data/lib/context_dev/models/web_web_scrape_html_response.rb +0 -628
  65. data/lib/context_dev/models/web_web_scrape_images_params.rb +0 -373
  66. data/lib/context_dev/models/web_web_scrape_images_response.rb +0 -409
  67. data/lib/context_dev/models/web_web_scrape_md_params.rb +0 -670
  68. data/lib/context_dev/models/web_web_scrape_md_response.rb +0 -567
  69. data/lib/context_dev/models/web_web_scrape_screenshot_params.rb +0 -471
  70. data/lib/context_dev/models/web_web_scrape_screenshot_response.rb +0 -169
  71. data/lib/context_dev/models/web_web_scrape_sitemap_response.rb +0 -144
  72. data/lib/context_dev/resources/ai.rb +0 -71
  73. data/rbi/context_dev/models/ai_extract_product_params.rbi +0 -253
  74. data/rbi/context_dev/models/ai_extract_product_response.rbi +0 -791
  75. data/rbi/context_dev/models/ai_extract_products_params.rbi +0 -490
  76. data/rbi/context_dev/models/ai_extract_products_response.rbi +0 -718
  77. data/rbi/context_dev/models/brand_retrieve_simplified_params.rbi +0 -256
  78. data/rbi/context_dev/models/brand_retrieve_simplified_response.rbi +0 -1040
  79. data/rbi/context_dev/models/web_extract_fonts_params.rbi +0 -223
  80. data/rbi/context_dev/models/web_extract_fonts_response.rbi +0 -563
  81. data/rbi/context_dev/models/web_extract_params.rbi +0 -781
  82. data/rbi/context_dev/models/web_extract_response.rbi +0 -512
  83. data/rbi/context_dev/models/web_web_scrape_bytes_params.rbi +0 -702
  84. data/rbi/context_dev/models/web_web_scrape_bytes_response.rbi +0 -238
  85. data/rbi/context_dev/models/web_web_scrape_html_params.rbi +0 -1690
  86. data/rbi/context_dev/models/web_web_scrape_html_response.rbi +0 -1287
  87. data/rbi/context_dev/models/web_web_scrape_images_params.rbi +0 -728
  88. data/rbi/context_dev/models/web_web_scrape_images_response.rbi +0 -910
  89. data/rbi/context_dev/models/web_web_scrape_md_params.rbi +0 -1052
  90. data/rbi/context_dev/models/web_web_scrape_md_response.rbi +0 -1088
  91. data/rbi/context_dev/models/web_web_scrape_screenshot_params.rbi +0 -1580
  92. data/rbi/context_dev/models/web_web_scrape_screenshot_response.rbi +0 -332
  93. data/rbi/context_dev/models/web_web_scrape_sitemap_response.rbi +0 -258
  94. data/rbi/context_dev/resources/ai.rbi +0 -63
  95. data/sig/context_dev/models/ai_extract_product_params.rbs +0 -106
  96. data/sig/context_dev/models/ai_extract_product_response.rbs +0 -314
  97. data/sig/context_dev/models/ai_extract_products_params.rbs +0 -202
  98. data/sig/context_dev/models/ai_extract_products_response.rbs +0 -293
  99. data/sig/context_dev/models/brand_retrieve_simplified_params.rbs +0 -104
  100. data/sig/context_dev/models/brand_retrieve_simplified_response.rbs +0 -413
  101. data/sig/context_dev/models/web_extract_fonts_params.rbs +0 -93
  102. data/sig/context_dev/models/web_extract_fonts_response.rbs +0 -230
  103. data/sig/context_dev/models/web_extract_params.rbs +0 -324
  104. data/sig/context_dev/models/web_extract_response.rbs +0 -239
  105. data/sig/context_dev/models/web_web_scrape_bytes_params.rbs +0 -531
  106. data/sig/context_dev/models/web_web_scrape_bytes_response.rbs +0 -108
  107. data/sig/context_dev/models/web_web_scrape_html_params.rbs +0 -878
  108. data/sig/context_dev/models/web_web_scrape_html_response.rbs +0 -525
  109. data/sig/context_dev/models/web_web_scrape_images_params.rbs +0 -281
  110. data/sig/context_dev/models/web_web_scrape_images_response.rbs +0 -371
  111. data/sig/context_dev/models/web_web_scrape_md_params.rbs +0 -758
  112. data/sig/context_dev/models/web_web_scrape_md_response.rbs +0 -465
  113. data/sig/context_dev/models/web_web_scrape_screenshot_params.rbs +0 -619
  114. data/sig/context_dev/models/web_web_scrape_screenshot_response.rbs +0 -127
  115. data/sig/context_dev/models/web_web_scrape_sitemap_response.rbs +0 -117
  116. data/sig/context_dev/resources/ai.rbs +0 -21
@@ -0,0 +1,1874 @@
1
+ # typed: strong
2
+
3
+ module ContextDev
4
+ module Models
5
+ class WebScrapeResponse < ContextDev::Internal::Type::BaseModel
6
+ OrHash =
7
+ T.type_alias do
8
+ T.any(
9
+ ContextDev::Models::WebScrapeResponse,
10
+ ContextDev::Internal::AnyHash
11
+ )
12
+ end
13
+
14
+ # Original HTTP response body. Waiting, actions, and content filters never change
15
+ # it.
16
+ sig { returns(ContextDev::Models::WebScrapeResponse::Bytes) }
17
+ attr_reader :bytes
18
+
19
+ sig do
20
+ params(bytes: ContextDev::Models::WebScrapeResponse::Bytes::OrHash).void
21
+ end
22
+ attr_writer :bytes
23
+
24
+ # Cache outcome for this response. Composite responses are hits only when every
25
+ # cache-controlled fetch contributing to the output was a hit; age_ms is the
26
+ # oldest contributing hit.
27
+ sig { returns(ContextDev::Models::WebScrapeResponse::CacheMetadata) }
28
+ attr_reader :cache_metadata
29
+
30
+ sig do
31
+ params(
32
+ cache_metadata:
33
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::OrHash
34
+ ).void
35
+ end
36
+ attr_writer :cache_metadata
37
+
38
+ # Plain-text passages relevant to highlightsParams.query, in page order, each
39
+ # prefixed with its section heading in square brackets. Empty when the page has no
40
+ # text.
41
+ sig { returns(ContextDev::Models::WebScrapeResponse::Highlights) }
42
+ attr_reader :highlights
43
+
44
+ sig do
45
+ params(
46
+ highlights: ContextDev::Models::WebScrapeResponse::Highlights::OrHash
47
+ ).void
48
+ end
49
+ attr_writer :highlights
50
+
51
+ # Rendered HTML after content filters.
52
+ sig { returns(ContextDev::Models::WebScrapeResponse::HTML) }
53
+ attr_reader :html
54
+
55
+ sig do
56
+ params(html: ContextDev::Models::WebScrapeResponse::HTML::OrHash).void
57
+ end
58
+ attr_writer :html
59
+
60
+ # Images after content filters. Empty when none are found.
61
+ sig { returns(ContextDev::Models::WebScrapeResponse::Images) }
62
+ attr_reader :images
63
+
64
+ sig do
65
+ params(
66
+ images: ContextDev::Models::WebScrapeResponse::Images::OrHash
67
+ ).void
68
+ end
69
+ attr_writer :images
70
+
71
+ # Page data extracted into jsonParams.schema, after shared content filters. Values
72
+ # are grounded in the page; optional fields the page does not state are omitted,
73
+ # or null when their type allows null. An empty object when the filters leave no
74
+ # text.
75
+ sig { returns(ContextDev::Models::WebScrapeResponse::Json) }
76
+ attr_reader :json
77
+
78
+ sig do
79
+ params(json: ContextDev::Models::WebScrapeResponse::Json::OrHash).void
80
+ end
81
+ attr_writer :json
82
+
83
+ # Markdown after content filters.
84
+ sig { returns(ContextDev::Models::WebScrapeResponse::Markdown) }
85
+ attr_reader :markdown
86
+
87
+ sig do
88
+ params(
89
+ markdown: ContextDev::Models::WebScrapeResponse::Markdown::OrHash
90
+ ).void
91
+ end
92
+ attr_writer :markdown
93
+
94
+ # Page details, when available.
95
+ sig { returns(ContextDev::Models::WebScrapeResponse::Metadata) }
96
+ attr_reader :metadata
97
+
98
+ sig do
99
+ params(
100
+ metadata: ContextDev::Models::WebScrapeResponse::Metadata::OrHash
101
+ ).void
102
+ end
103
+ attr_writer :metadata
104
+
105
+ # Fields produced by parseParams.rules, after shared content filters.
106
+ sig { returns(ContextDev::Models::WebScrapeResponse::Parsed) }
107
+ attr_reader :parsed
108
+
109
+ sig do
110
+ params(
111
+ parsed: ContextDev::Models::WebScrapeResponse::Parsed::OrHash
112
+ ).void
113
+ end
114
+ attr_writer :parsed
115
+
116
+ # Product detail page classification and the extracted product.
117
+ sig { returns(ContextDev::Models::WebScrapeResponse::Product) }
118
+ attr_reader :product
119
+
120
+ sig do
121
+ params(
122
+ product: ContextDev::Models::WebScrapeResponse::Product::OrHash
123
+ ).void
124
+ end
125
+ attr_writer :product
126
+
127
+ # Unique id of this API call, also sent in the X-Request-Id response header. Quote
128
+ # it when contacting support about a failed request.
129
+ sig { returns(String) }
130
+ attr_accessor :request_id
131
+
132
+ # An image data URL. Use directly as an image src.
133
+ sig { returns(ContextDev::Models::WebScrapeResponse::Screenshot) }
134
+ attr_reader :screenshot
135
+
136
+ sig do
137
+ params(
138
+ screenshot: ContextDev::Models::WebScrapeResponse::Screenshot::OrHash
139
+ ).void
140
+ end
141
+ attr_writer :screenshot
142
+
143
+ # Final URL after redirects and browser actions.
144
+ sig { returns(String) }
145
+ attr_accessor :url
146
+
147
+ # Present when return-partial captures a page that is still loading, returns
148
+ # images before image processing finishes, or cuts product AI extraction short.
149
+ # Also present if the optional product AI fallback fails. Partial responses are
150
+ # not cached.
151
+ sig do
152
+ returns(
153
+ T.nilable(
154
+ ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
155
+ )
156
+ )
157
+ end
158
+ attr_reader :is_partial
159
+
160
+ sig do
161
+ params(
162
+ is_partial:
163
+ ContextDev::Models::WebScrapeResponse::IsPartial::OrBoolean
164
+ ).void
165
+ end
166
+ attr_writer :is_partial
167
+
168
+ # Credit usage, included whenever a valid API key is provided.
169
+ sig do
170
+ returns(T.nilable(ContextDev::Models::WebScrapeResponse::KeyMetadata))
171
+ end
172
+ attr_reader :key_metadata
173
+
174
+ sig do
175
+ params(
176
+ key_metadata:
177
+ ContextDev::Models::WebScrapeResponse::KeyMetadata::OrHash
178
+ ).void
179
+ end
180
+ attr_writer :key_metadata
181
+
182
+ sig do
183
+ params(
184
+ bytes: ContextDev::Models::WebScrapeResponse::Bytes::OrHash,
185
+ cache_metadata:
186
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::OrHash,
187
+ highlights: ContextDev::Models::WebScrapeResponse::Highlights::OrHash,
188
+ html: ContextDev::Models::WebScrapeResponse::HTML::OrHash,
189
+ images: ContextDev::Models::WebScrapeResponse::Images::OrHash,
190
+ json: ContextDev::Models::WebScrapeResponse::Json::OrHash,
191
+ markdown: ContextDev::Models::WebScrapeResponse::Markdown::OrHash,
192
+ metadata: ContextDev::Models::WebScrapeResponse::Metadata::OrHash,
193
+ parsed: ContextDev::Models::WebScrapeResponse::Parsed::OrHash,
194
+ product: ContextDev::Models::WebScrapeResponse::Product::OrHash,
195
+ request_id: String,
196
+ screenshot: ContextDev::Models::WebScrapeResponse::Screenshot::OrHash,
197
+ url: String,
198
+ is_partial:
199
+ ContextDev::Models::WebScrapeResponse::IsPartial::OrBoolean,
200
+ key_metadata:
201
+ ContextDev::Models::WebScrapeResponse::KeyMetadata::OrHash
202
+ ).returns(T.attached_class)
203
+ end
204
+ def self.new(
205
+ # Original HTTP response body. Waiting, actions, and content filters never change
206
+ # it.
207
+ bytes:,
208
+ # Cache outcome for this response. Composite responses are hits only when every
209
+ # cache-controlled fetch contributing to the output was a hit; age_ms is the
210
+ # oldest contributing hit.
211
+ cache_metadata:,
212
+ # Plain-text passages relevant to highlightsParams.query, in page order, each
213
+ # prefixed with its section heading in square brackets. Empty when the page has no
214
+ # text.
215
+ highlights:,
216
+ # Rendered HTML after content filters.
217
+ html:,
218
+ # Images after content filters. Empty when none are found.
219
+ images:,
220
+ # Page data extracted into jsonParams.schema, after shared content filters. Values
221
+ # are grounded in the page; optional fields the page does not state are omitted,
222
+ # or null when their type allows null. An empty object when the filters leave no
223
+ # text.
224
+ json:,
225
+ # Markdown after content filters.
226
+ markdown:,
227
+ # Page details, when available.
228
+ metadata:,
229
+ # Fields produced by parseParams.rules, after shared content filters.
230
+ parsed:,
231
+ # Product detail page classification and the extracted product.
232
+ product:,
233
+ # Unique id of this API call, also sent in the X-Request-Id response header. Quote
234
+ # it when contacting support about a failed request.
235
+ request_id:,
236
+ # An image data URL. Use directly as an image src.
237
+ screenshot:,
238
+ # Final URL after redirects and browser actions.
239
+ url:,
240
+ # Present when return-partial captures a page that is still loading, returns
241
+ # images before image processing finishes, or cuts product AI extraction short.
242
+ # Also present if the optional product AI fallback fails. Partial responses are
243
+ # not cached.
244
+ is_partial: nil,
245
+ # Credit usage, included whenever a valid API key is provided.
246
+ key_metadata: nil
247
+ )
248
+ end
249
+
250
+ sig do
251
+ override.returns(
252
+ {
253
+ bytes: ContextDev::Models::WebScrapeResponse::Bytes,
254
+ cache_metadata:
255
+ ContextDev::Models::WebScrapeResponse::CacheMetadata,
256
+ highlights: ContextDev::Models::WebScrapeResponse::Highlights,
257
+ html: ContextDev::Models::WebScrapeResponse::HTML,
258
+ images: ContextDev::Models::WebScrapeResponse::Images,
259
+ json: ContextDev::Models::WebScrapeResponse::Json,
260
+ markdown: ContextDev::Models::WebScrapeResponse::Markdown,
261
+ metadata: ContextDev::Models::WebScrapeResponse::Metadata,
262
+ parsed: ContextDev::Models::WebScrapeResponse::Parsed,
263
+ product: ContextDev::Models::WebScrapeResponse::Product,
264
+ request_id: String,
265
+ screenshot: ContextDev::Models::WebScrapeResponse::Screenshot,
266
+ url: String,
267
+ is_partial:
268
+ ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean,
269
+ key_metadata: ContextDev::Models::WebScrapeResponse::KeyMetadata
270
+ }
271
+ )
272
+ end
273
+ def to_hash
274
+ end
275
+
276
+ class Bytes < ContextDev::Internal::Type::BaseModel
277
+ OrHash =
278
+ T.type_alias do
279
+ T.any(
280
+ ContextDev::Models::WebScrapeResponse::Bytes,
281
+ ContextDev::Internal::AnyHash
282
+ )
283
+ end
284
+
285
+ sig do
286
+ returns(T.nilable(ContextDev::Models::WebScrapeResponse::Bytes::Data))
287
+ end
288
+ attr_reader :data
289
+
290
+ sig do
291
+ params(
292
+ data:
293
+ T.nilable(
294
+ ContextDev::Models::WebScrapeResponse::Bytes::Data::OrHash
295
+ )
296
+ ).void
297
+ end
298
+ attr_writer :data
299
+
300
+ sig { returns(T::Boolean) }
301
+ attr_accessor :requested
302
+
303
+ # Original HTTP response body. Waiting, actions, and content filters never change
304
+ # it.
305
+ sig do
306
+ params(
307
+ data:
308
+ T.nilable(
309
+ ContextDev::Models::WebScrapeResponse::Bytes::Data::OrHash
310
+ ),
311
+ requested: T::Boolean
312
+ ).returns(T.attached_class)
313
+ end
314
+ def self.new(data:, requested:)
315
+ end
316
+
317
+ sig do
318
+ override.returns(
319
+ {
320
+ data:
321
+ T.nilable(ContextDev::Models::WebScrapeResponse::Bytes::Data),
322
+ requested: T::Boolean
323
+ }
324
+ )
325
+ end
326
+ def to_hash
327
+ end
328
+
329
+ class Data < ContextDev::Internal::Type::BaseModel
330
+ OrHash =
331
+ T.type_alias do
332
+ T.any(
333
+ ContextDev::Models::WebScrapeResponse::Bytes::Data,
334
+ ContextDev::Internal::AnyHash
335
+ )
336
+ end
337
+
338
+ # Original response body as base64, after HTTP decompression. Maximum decoded
339
+ # size: 20 MiB.
340
+ sig { returns(String) }
341
+ attr_accessor :base64
342
+
343
+ sig { returns(String) }
344
+ attr_accessor :content_type
345
+
346
+ sig do
347
+ params(base64: String, content_type: String).returns(
348
+ T.attached_class
349
+ )
350
+ end
351
+ def self.new(
352
+ # Original response body as base64, after HTTP decompression. Maximum decoded
353
+ # size: 20 MiB.
354
+ base64:,
355
+ content_type:
356
+ )
357
+ end
358
+
359
+ sig { override.returns({ base64: String, content_type: String }) }
360
+ def to_hash
361
+ end
362
+ end
363
+ end
364
+
365
+ class CacheMetadata < ContextDev::Internal::Type::BaseModel
366
+ OrHash =
367
+ T.type_alias do
368
+ T.any(
369
+ ContextDev::Models::WebScrapeResponse::CacheMetadata,
370
+ ContextDev::Internal::AnyHash
371
+ )
372
+ end
373
+
374
+ # Age of the cached data in milliseconds. Zero for miss and zdr responses.
375
+ sig { returns(Integer) }
376
+ attr_accessor :age_ms
377
+
378
+ # Whether the response was served from cache, required fresh work, or honored
379
+ # zero-data-retention cache bypass.
380
+ sig do
381
+ returns(
382
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
383
+ )
384
+ end
385
+ attr_accessor :status
386
+
387
+ # Cache outcome for this response. Composite responses are hits only when every
388
+ # cache-controlled fetch contributing to the output was a hit; age_ms is the
389
+ # oldest contributing hit.
390
+ sig do
391
+ params(
392
+ age_ms: Integer,
393
+ status:
394
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::OrSymbol
395
+ ).returns(T.attached_class)
396
+ end
397
+ def self.new(
398
+ # Age of the cached data in milliseconds. Zero for miss and zdr responses.
399
+ age_ms:,
400
+ # Whether the response was served from cache, required fresh work, or honored
401
+ # zero-data-retention cache bypass.
402
+ status:
403
+ )
404
+ end
405
+
406
+ sig do
407
+ override.returns(
408
+ {
409
+ age_ms: Integer,
410
+ status:
411
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
412
+ }
413
+ )
414
+ end
415
+ def to_hash
416
+ end
417
+
418
+ # Whether the response was served from cache, required fresh work, or honored
419
+ # zero-data-retention cache bypass.
420
+ module Status
421
+ extend ContextDev::Internal::Type::Enum
422
+
423
+ TaggedSymbol =
424
+ T.type_alias do
425
+ T.all(
426
+ Symbol,
427
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status
428
+ )
429
+ end
430
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
431
+
432
+ HIT =
433
+ T.let(
434
+ :hit,
435
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
436
+ )
437
+ MISS =
438
+ T.let(
439
+ :miss,
440
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
441
+ )
442
+ ZDR =
443
+ T.let(
444
+ :zdr,
445
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
446
+ )
447
+
448
+ sig do
449
+ override.returns(
450
+ T::Array[
451
+ ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
452
+ ]
453
+ )
454
+ end
455
+ def self.values
456
+ end
457
+ end
458
+ end
459
+
460
+ class Highlights < ContextDev::Internal::Type::BaseModel
461
+ OrHash =
462
+ T.type_alias do
463
+ T.any(
464
+ ContextDev::Models::WebScrapeResponse::Highlights,
465
+ ContextDev::Internal::AnyHash
466
+ )
467
+ end
468
+
469
+ sig { returns(T.nilable(T::Array[String])) }
470
+ attr_accessor :data
471
+
472
+ sig { returns(T::Boolean) }
473
+ attr_accessor :requested
474
+
475
+ # Plain-text passages relevant to highlightsParams.query, in page order, each
476
+ # prefixed with its section heading in square brackets. Empty when the page has no
477
+ # text.
478
+ sig do
479
+ params(
480
+ data: T.nilable(T::Array[String]),
481
+ requested: T::Boolean
482
+ ).returns(T.attached_class)
483
+ end
484
+ def self.new(data:, requested:)
485
+ end
486
+
487
+ sig do
488
+ override.returns(
489
+ { data: T.nilable(T::Array[String]), requested: T::Boolean }
490
+ )
491
+ end
492
+ def to_hash
493
+ end
494
+ end
495
+
496
+ class HTML < ContextDev::Internal::Type::BaseModel
497
+ OrHash =
498
+ T.type_alias do
499
+ T.any(
500
+ ContextDev::Models::WebScrapeResponse::HTML,
501
+ ContextDev::Internal::AnyHash
502
+ )
503
+ end
504
+
505
+ sig { returns(T.nilable(String)) }
506
+ attr_accessor :data
507
+
508
+ sig { returns(T::Boolean) }
509
+ attr_accessor :requested
510
+
511
+ # Rendered HTML after content filters.
512
+ sig do
513
+ params(data: T.nilable(String), requested: T::Boolean).returns(
514
+ T.attached_class
515
+ )
516
+ end
517
+ def self.new(data:, requested:)
518
+ end
519
+
520
+ sig do
521
+ override.returns({ data: T.nilable(String), requested: T::Boolean })
522
+ end
523
+ def to_hash
524
+ end
525
+ end
526
+
527
+ class Images < ContextDev::Internal::Type::BaseModel
528
+ OrHash =
529
+ T.type_alias do
530
+ T.any(
531
+ ContextDev::Models::WebScrapeResponse::Images,
532
+ ContextDev::Internal::AnyHash
533
+ )
534
+ end
535
+
536
+ sig do
537
+ returns(
538
+ T.nilable(
539
+ T::Array[ContextDev::Models::WebScrapeResponse::Images::Data]
540
+ )
541
+ )
542
+ end
543
+ attr_accessor :data
544
+
545
+ sig { returns(T::Boolean) }
546
+ attr_accessor :requested
547
+
548
+ # Images after content filters. Empty when none are found.
549
+ sig do
550
+ params(
551
+ data:
552
+ T.nilable(
553
+ T::Array[
554
+ ContextDev::Models::WebScrapeResponse::Images::Data::OrHash
555
+ ]
556
+ ),
557
+ requested: T::Boolean
558
+ ).returns(T.attached_class)
559
+ end
560
+ def self.new(data:, requested:)
561
+ end
562
+
563
+ sig do
564
+ override.returns(
565
+ {
566
+ data:
567
+ T.nilable(
568
+ T::Array[ContextDev::Models::WebScrapeResponse::Images::Data]
569
+ ),
570
+ requested: T::Boolean
571
+ }
572
+ )
573
+ end
574
+ def to_hash
575
+ end
576
+
577
+ class Data < ContextDev::Internal::Type::BaseModel
578
+ OrHash =
579
+ T.type_alias do
580
+ T.any(
581
+ ContextDev::Models::WebScrapeResponse::Images::Data,
582
+ ContextDev::Internal::AnyHash
583
+ )
584
+ end
585
+
586
+ # Alt text, if present.
587
+ sig { returns(T.nilable(String)) }
588
+ attr_accessor :alt
589
+
590
+ # Image URL, or a data URI for inline images.
591
+ sig { returns(String) }
592
+ attr_accessor :url
593
+
594
+ sig do
595
+ returns(
596
+ T.nilable(
597
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
598
+ )
599
+ )
600
+ end
601
+ attr_reader :classification
602
+
603
+ sig do
604
+ params(
605
+ classification:
606
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::OrSymbol
607
+ ).void
608
+ end
609
+ attr_writer :classification
610
+
611
+ # Hosted copy when file enrichment is requested and zdr is disabled. Valid for 24
612
+ # hours from the original capture.
613
+ sig { returns(T.nilable(String)) }
614
+ attr_reader :file_url
615
+
616
+ sig { params(file_url: String).void }
617
+ attr_writer :file_url
618
+
619
+ sig { returns(T.nilable(Integer)) }
620
+ attr_reader :height
621
+
622
+ sig { params(height: Integer).void }
623
+ attr_writer :height
624
+
625
+ sig { returns(T.nilable(Integer)) }
626
+ attr_reader :width
627
+
628
+ sig { params(width: Integer).void }
629
+ attr_writer :width
630
+
631
+ sig do
632
+ params(
633
+ alt: T.nilable(String),
634
+ url: String,
635
+ classification:
636
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::OrSymbol,
637
+ file_url: String,
638
+ height: Integer,
639
+ width: Integer
640
+ ).returns(T.attached_class)
641
+ end
642
+ def self.new(
643
+ # Alt text, if present.
644
+ alt:,
645
+ # Image URL, or a data URI for inline images.
646
+ url:,
647
+ classification: nil,
648
+ # Hosted copy when file enrichment is requested and zdr is disabled. Valid for 24
649
+ # hours from the original capture.
650
+ file_url: nil,
651
+ height: nil,
652
+ width: nil
653
+ )
654
+ end
655
+
656
+ sig do
657
+ override.returns(
658
+ {
659
+ alt: T.nilable(String),
660
+ url: String,
661
+ classification:
662
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol,
663
+ file_url: String,
664
+ height: Integer,
665
+ width: Integer
666
+ }
667
+ )
668
+ end
669
+ def to_hash
670
+ end
671
+
672
+ module Classification
673
+ extend ContextDev::Internal::Type::Enum
674
+
675
+ TaggedSymbol =
676
+ T.type_alias do
677
+ T.all(
678
+ Symbol,
679
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification
680
+ )
681
+ end
682
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
683
+
684
+ PHOTOGRAPHY =
685
+ T.let(
686
+ :photography,
687
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
688
+ )
689
+ ILLUSTRATION =
690
+ T.let(
691
+ :illustration,
692
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
693
+ )
694
+ LOGO =
695
+ T.let(
696
+ :logo,
697
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
698
+ )
699
+ WORDMARK =
700
+ T.let(
701
+ :wordmark,
702
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
703
+ )
704
+ ICON =
705
+ T.let(
706
+ :icon,
707
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
708
+ )
709
+ PATTERN =
710
+ T.let(
711
+ :pattern,
712
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
713
+ )
714
+ GRAPHIC =
715
+ T.let(
716
+ :graphic,
717
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
718
+ )
719
+ OTHER =
720
+ T.let(
721
+ :other,
722
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
723
+ )
724
+
725
+ sig do
726
+ override.returns(
727
+ T::Array[
728
+ ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
729
+ ]
730
+ )
731
+ end
732
+ def self.values
733
+ end
734
+ end
735
+ end
736
+ end
737
+
738
+ class Json < ContextDev::Internal::Type::BaseModel
739
+ OrHash =
740
+ T.type_alias do
741
+ T.any(
742
+ ContextDev::Models::WebScrapeResponse::Json,
743
+ ContextDev::Internal::AnyHash
744
+ )
745
+ end
746
+
747
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
748
+ attr_accessor :data
749
+
750
+ sig { returns(T::Boolean) }
751
+ attr_accessor :requested
752
+
753
+ # Page data extracted into jsonParams.schema, after shared content filters. Values
754
+ # are grounded in the page; optional fields the page does not state are omitted,
755
+ # or null when their type allows null. An empty object when the filters leave no
756
+ # text.
757
+ sig do
758
+ params(
759
+ data: T.nilable(T::Hash[Symbol, T.anything]),
760
+ requested: T::Boolean
761
+ ).returns(T.attached_class)
762
+ end
763
+ def self.new(data:, requested:)
764
+ end
765
+
766
+ sig do
767
+ override.returns(
768
+ {
769
+ data: T.nilable(T::Hash[Symbol, T.anything]),
770
+ requested: T::Boolean
771
+ }
772
+ )
773
+ end
774
+ def to_hash
775
+ end
776
+ end
777
+
778
+ class Markdown < ContextDev::Internal::Type::BaseModel
779
+ OrHash =
780
+ T.type_alias do
781
+ T.any(
782
+ ContextDev::Models::WebScrapeResponse::Markdown,
783
+ ContextDev::Internal::AnyHash
784
+ )
785
+ end
786
+
787
+ sig { returns(T.nilable(String)) }
788
+ attr_accessor :data
789
+
790
+ sig { returns(T::Boolean) }
791
+ attr_accessor :requested
792
+
793
+ # Markdown after content filters.
794
+ sig do
795
+ params(data: T.nilable(String), requested: T::Boolean).returns(
796
+ T.attached_class
797
+ )
798
+ end
799
+ def self.new(data:, requested:)
800
+ end
801
+
802
+ sig do
803
+ override.returns({ data: T.nilable(String), requested: T::Boolean })
804
+ end
805
+ def to_hash
806
+ end
807
+ end
808
+
809
+ class Metadata < ContextDev::Internal::Type::BaseModel
810
+ OrHash =
811
+ T.type_alias do
812
+ T.any(
813
+ ContextDev::Models::WebScrapeResponse::Metadata,
814
+ ContextDev::Internal::AnyHash
815
+ )
816
+ end
817
+
818
+ # Additional non-social meta tags not promoted to top-level metadata fields.
819
+ sig do
820
+ returns(
821
+ T.nilable(
822
+ T::Hash[
823
+ Symbol,
824
+ ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
825
+ ]
826
+ )
827
+ )
828
+ end
829
+ attr_reader :additional_meta
830
+
831
+ sig do
832
+ params(
833
+ additional_meta:
834
+ T::Hash[
835
+ Symbol,
836
+ ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
837
+ ]
838
+ ).void
839
+ end
840
+ attr_writer :additional_meta
841
+
842
+ # Resolved alternate links from link rel=alternate tags.
843
+ sig do
844
+ returns(
845
+ T.nilable(
846
+ T::Array[
847
+ ContextDev::Models::WebScrapeResponse::Metadata::Alternate
848
+ ]
849
+ )
850
+ )
851
+ end
852
+ attr_reader :alternates
853
+
854
+ sig do
855
+ params(
856
+ alternates:
857
+ T::Array[
858
+ ContextDev::Models::WebScrapeResponse::Metadata::Alternate::OrHash
859
+ ]
860
+ ).void
861
+ end
862
+ attr_writer :alternates
863
+
864
+ # Author metadata, when present.
865
+ sig { returns(T.nilable(String)) }
866
+ attr_reader :author
867
+
868
+ sig { params(author: String).void }
869
+ attr_writer :author
870
+
871
+ # Resolved canonical URL, when present.
872
+ sig { returns(T.nilable(String)) }
873
+ attr_reader :canonical_url
874
+
875
+ sig { params(canonical_url: String).void }
876
+ attr_writer :canonical_url
877
+
878
+ # Best description extracted from standard, Open Graph, or Twitter metadata.
879
+ sig { returns(T.nilable(String)) }
880
+ attr_reader :description
881
+
882
+ sig { params(description: String).void }
883
+ attr_writer :description
884
+
885
+ # Resolved favicon URL, when present.
886
+ sig { returns(T.nilable(String)) }
887
+ attr_reader :favicon
888
+
889
+ sig { params(favicon: String).void }
890
+ attr_writer :favicon
891
+
892
+ # Page headings (h1–h6) in document order, extracted from the unfiltered document.
893
+ # Capped at the first 500 headings. Omitted when the page has none.
894
+ sig do
895
+ returns(
896
+ T.nilable(
897
+ T::Array[ContextDev::Models::WebScrapeResponse::Metadata::Heading]
898
+ )
899
+ )
900
+ end
901
+ attr_reader :headings
902
+
903
+ sig do
904
+ params(
905
+ headings:
906
+ T::Array[
907
+ ContextDev::Models::WebScrapeResponse::Metadata::Heading::OrHash
908
+ ]
909
+ ).void
910
+ end
911
+ attr_writer :headings
912
+
913
+ # Primary resolved preview image from Open Graph, Twitter, or image metadata.
914
+ sig { returns(T.nilable(String)) }
915
+ attr_reader :image
916
+
917
+ sig { params(image: String).void }
918
+ attr_writer :image
919
+
920
+ # JSON-LD structured data blocks parsed from the page.
921
+ sig { returns(T.nilable(T::Array[T::Hash[Symbol, T.anything]])) }
922
+ attr_reader :json_ld
923
+
924
+ sig { params(json_ld: T::Array[T::Hash[Symbol, T.anything]]).void }
925
+ attr_writer :json_ld
926
+
927
+ # Keywords extracted from the page's keywords meta tag.
928
+ sig { returns(T.nilable(T::Array[String])) }
929
+ attr_reader :keywords
930
+
931
+ sig { params(keywords: T::Array[String]).void }
932
+ attr_writer :keywords
933
+
934
+ # Language extracted from html lang or language meta tags.
935
+ sig { returns(T.nilable(String)) }
936
+ attr_reader :language
937
+
938
+ sig { params(language: String).void }
939
+ attr_writer :language
940
+
941
+ # Modified timestamp/date from page metadata, when present.
942
+ sig { returns(T.nilable(String)) }
943
+ attr_reader :modified_time
944
+
945
+ sig { params(modified_time: String).void }
946
+ attr_writer :modified_time
947
+
948
+ # Open Graph metadata with the og: prefix removed and keys camel-cased.
949
+ sig do
950
+ returns(
951
+ T.nilable(
952
+ T::Hash[
953
+ Symbol,
954
+ ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
955
+ ]
956
+ )
957
+ )
958
+ end
959
+ attr_reader :open_graph
960
+
961
+ sig do
962
+ params(
963
+ open_graph:
964
+ T::Hash[
965
+ Symbol,
966
+ ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
967
+ ]
968
+ ).void
969
+ end
970
+ attr_writer :open_graph
971
+
972
+ # Published timestamp/date from page metadata, when present.
973
+ sig { returns(T.nilable(String)) }
974
+ attr_reader :published_time
975
+
976
+ sig { params(published_time: String).void }
977
+ attr_writer :published_time
978
+
979
+ # Robots meta directive, when present.
980
+ sig { returns(T.nilable(String)) }
981
+ attr_reader :robots
982
+
983
+ sig { params(robots: String).void }
984
+ attr_writer :robots
985
+
986
+ # Site or application name from page metadata.
987
+ sig { returns(T.nilable(String)) }
988
+ attr_reader :site_name
989
+
990
+ sig { params(site_name: String).void }
991
+ attr_writer :site_name
992
+
993
+ # Best title extracted from the page.
994
+ sig { returns(T.nilable(String)) }
995
+ attr_reader :title
996
+
997
+ sig { params(title: String).void }
998
+ attr_writer :title
999
+
1000
+ # Twitter card metadata with the twitter: prefix removed and keys camel-cased.
1001
+ sig do
1002
+ returns(
1003
+ T.nilable(
1004
+ T::Hash[
1005
+ Symbol,
1006
+ ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
1007
+ ]
1008
+ )
1009
+ )
1010
+ end
1011
+ attr_reader :twitter
1012
+
1013
+ sig do
1014
+ params(
1015
+ twitter:
1016
+ T::Hash[
1017
+ Symbol,
1018
+ ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
1019
+ ]
1020
+ ).void
1021
+ end
1022
+ attr_writer :twitter
1023
+
1024
+ # Page details, when available.
1025
+ sig do
1026
+ params(
1027
+ additional_meta:
1028
+ T::Hash[
1029
+ Symbol,
1030
+ ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
1031
+ ],
1032
+ alternates:
1033
+ T::Array[
1034
+ ContextDev::Models::WebScrapeResponse::Metadata::Alternate::OrHash
1035
+ ],
1036
+ author: String,
1037
+ canonical_url: String,
1038
+ description: String,
1039
+ favicon: String,
1040
+ headings:
1041
+ T::Array[
1042
+ ContextDev::Models::WebScrapeResponse::Metadata::Heading::OrHash
1043
+ ],
1044
+ image: String,
1045
+ json_ld: T::Array[T::Hash[Symbol, T.anything]],
1046
+ keywords: T::Array[String],
1047
+ language: String,
1048
+ modified_time: String,
1049
+ open_graph:
1050
+ T::Hash[
1051
+ Symbol,
1052
+ ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
1053
+ ],
1054
+ published_time: String,
1055
+ robots: String,
1056
+ site_name: String,
1057
+ title: String,
1058
+ twitter:
1059
+ T::Hash[
1060
+ Symbol,
1061
+ ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
1062
+ ]
1063
+ ).returns(T.attached_class)
1064
+ end
1065
+ def self.new(
1066
+ # Additional non-social meta tags not promoted to top-level metadata fields.
1067
+ additional_meta: nil,
1068
+ # Resolved alternate links from link rel=alternate tags.
1069
+ alternates: nil,
1070
+ # Author metadata, when present.
1071
+ author: nil,
1072
+ # Resolved canonical URL, when present.
1073
+ canonical_url: nil,
1074
+ # Best description extracted from standard, Open Graph, or Twitter metadata.
1075
+ description: nil,
1076
+ # Resolved favicon URL, when present.
1077
+ favicon: nil,
1078
+ # Page headings (h1–h6) in document order, extracted from the unfiltered document.
1079
+ # Capped at the first 500 headings. Omitted when the page has none.
1080
+ headings: nil,
1081
+ # Primary resolved preview image from Open Graph, Twitter, or image metadata.
1082
+ image: nil,
1083
+ # JSON-LD structured data blocks parsed from the page.
1084
+ json_ld: nil,
1085
+ # Keywords extracted from the page's keywords meta tag.
1086
+ keywords: nil,
1087
+ # Language extracted from html lang or language meta tags.
1088
+ language: nil,
1089
+ # Modified timestamp/date from page metadata, when present.
1090
+ modified_time: nil,
1091
+ # Open Graph metadata with the og: prefix removed and keys camel-cased.
1092
+ open_graph: nil,
1093
+ # Published timestamp/date from page metadata, when present.
1094
+ published_time: nil,
1095
+ # Robots meta directive, when present.
1096
+ robots: nil,
1097
+ # Site or application name from page metadata.
1098
+ site_name: nil,
1099
+ # Best title extracted from the page.
1100
+ title: nil,
1101
+ # Twitter card metadata with the twitter: prefix removed and keys camel-cased.
1102
+ twitter: nil
1103
+ )
1104
+ end
1105
+
1106
+ sig do
1107
+ override.returns(
1108
+ {
1109
+ additional_meta:
1110
+ T::Hash[
1111
+ Symbol,
1112
+ ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
1113
+ ],
1114
+ alternates:
1115
+ T::Array[
1116
+ ContextDev::Models::WebScrapeResponse::Metadata::Alternate
1117
+ ],
1118
+ author: String,
1119
+ canonical_url: String,
1120
+ description: String,
1121
+ favicon: String,
1122
+ headings:
1123
+ T::Array[
1124
+ ContextDev::Models::WebScrapeResponse::Metadata::Heading
1125
+ ],
1126
+ image: String,
1127
+ json_ld: T::Array[T::Hash[Symbol, T.anything]],
1128
+ keywords: T::Array[String],
1129
+ language: String,
1130
+ modified_time: String,
1131
+ open_graph:
1132
+ T::Hash[
1133
+ Symbol,
1134
+ ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
1135
+ ],
1136
+ published_time: String,
1137
+ robots: String,
1138
+ site_name: String,
1139
+ title: String,
1140
+ twitter:
1141
+ T::Hash[
1142
+ Symbol,
1143
+ ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
1144
+ ]
1145
+ }
1146
+ )
1147
+ end
1148
+ def to_hash
1149
+ end
1150
+
1151
+ module AdditionalMeta
1152
+ extend ContextDev::Internal::Type::Union
1153
+
1154
+ Variants = T.type_alias { T.any(String, T::Array[String]) }
1155
+
1156
+ sig do
1157
+ override.returns(
1158
+ T::Array[
1159
+ ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
1160
+ ]
1161
+ )
1162
+ end
1163
+ def self.variants
1164
+ end
1165
+
1166
+ StringArray =
1167
+ T.let(
1168
+ ContextDev::Internal::Type::ArrayOf[String],
1169
+ ContextDev::Internal::Type::Converter
1170
+ )
1171
+ end
1172
+
1173
+ class Alternate < ContextDev::Internal::Type::BaseModel
1174
+ OrHash =
1175
+ T.type_alias do
1176
+ T.any(
1177
+ ContextDev::Models::WebScrapeResponse::Metadata::Alternate,
1178
+ ContextDev::Internal::AnyHash
1179
+ )
1180
+ end
1181
+
1182
+ # Resolved alternate URL.
1183
+ sig { returns(String) }
1184
+ attr_accessor :href
1185
+
1186
+ # Language or locale for the alternate URL, when present.
1187
+ sig { returns(T.nilable(String)) }
1188
+ attr_reader :hreflang
1189
+
1190
+ sig { params(hreflang: String).void }
1191
+ attr_writer :hreflang
1192
+
1193
+ # Alternate resource title, when present.
1194
+ sig { returns(T.nilable(String)) }
1195
+ attr_reader :title
1196
+
1197
+ sig { params(title: String).void }
1198
+ attr_writer :title
1199
+
1200
+ # Alternate resource MIME type, when present.
1201
+ sig { returns(T.nilable(String)) }
1202
+ attr_reader :type
1203
+
1204
+ sig { params(type: String).void }
1205
+ attr_writer :type
1206
+
1207
+ sig do
1208
+ params(
1209
+ href: String,
1210
+ hreflang: String,
1211
+ title: String,
1212
+ type: String
1213
+ ).returns(T.attached_class)
1214
+ end
1215
+ def self.new(
1216
+ # Resolved alternate URL.
1217
+ href:,
1218
+ # Language or locale for the alternate URL, when present.
1219
+ hreflang: nil,
1220
+ # Alternate resource title, when present.
1221
+ title: nil,
1222
+ # Alternate resource MIME type, when present.
1223
+ type: nil
1224
+ )
1225
+ end
1226
+
1227
+ sig do
1228
+ override.returns(
1229
+ { href: String, hreflang: String, title: String, type: String }
1230
+ )
1231
+ end
1232
+ def to_hash
1233
+ end
1234
+ end
1235
+
1236
+ class Heading < ContextDev::Internal::Type::BaseModel
1237
+ OrHash =
1238
+ T.type_alias do
1239
+ T.any(
1240
+ ContextDev::Models::WebScrapeResponse::Metadata::Heading,
1241
+ ContextDev::Internal::AnyHash
1242
+ )
1243
+ end
1244
+
1245
+ # Heading level, 1–6 (from h1–h6).
1246
+ sig { returns(Integer) }
1247
+ attr_accessor :level
1248
+
1249
+ # Heading text with whitespace collapsed, truncated to 1000 characters.
1250
+ sig { returns(String) }
1251
+ attr_accessor :text
1252
+
1253
+ sig { params(level: Integer, text: String).returns(T.attached_class) }
1254
+ def self.new(
1255
+ # Heading level, 1–6 (from h1–h6).
1256
+ level:,
1257
+ # Heading text with whitespace collapsed, truncated to 1000 characters.
1258
+ text:
1259
+ )
1260
+ end
1261
+
1262
+ sig { override.returns({ level: Integer, text: String }) }
1263
+ def to_hash
1264
+ end
1265
+ end
1266
+
1267
+ module OpenGraph
1268
+ extend ContextDev::Internal::Type::Union
1269
+
1270
+ Variants = T.type_alias { T.any(String, T::Array[String]) }
1271
+
1272
+ sig do
1273
+ override.returns(
1274
+ T::Array[
1275
+ ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
1276
+ ]
1277
+ )
1278
+ end
1279
+ def self.variants
1280
+ end
1281
+
1282
+ StringArray =
1283
+ T.let(
1284
+ ContextDev::Internal::Type::ArrayOf[String],
1285
+ ContextDev::Internal::Type::Converter
1286
+ )
1287
+ end
1288
+
1289
+ module Twitter
1290
+ extend ContextDev::Internal::Type::Union
1291
+
1292
+ Variants = T.type_alias { T.any(String, T::Array[String]) }
1293
+
1294
+ sig do
1295
+ override.returns(
1296
+ T::Array[
1297
+ ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
1298
+ ]
1299
+ )
1300
+ end
1301
+ def self.variants
1302
+ end
1303
+
1304
+ StringArray =
1305
+ T.let(
1306
+ ContextDev::Internal::Type::ArrayOf[String],
1307
+ ContextDev::Internal::Type::Converter
1308
+ )
1309
+ end
1310
+ end
1311
+
1312
+ class Parsed < ContextDev::Internal::Type::BaseModel
1313
+ OrHash =
1314
+ T.type_alias do
1315
+ T.any(
1316
+ ContextDev::Models::WebScrapeResponse::Parsed,
1317
+ ContextDev::Internal::AnyHash
1318
+ )
1319
+ end
1320
+
1321
+ sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
1322
+ attr_accessor :data
1323
+
1324
+ sig { returns(T::Boolean) }
1325
+ attr_accessor :requested
1326
+
1327
+ # Fields produced by parseParams.rules, after shared content filters.
1328
+ sig do
1329
+ params(
1330
+ data: T.nilable(T::Hash[Symbol, T.anything]),
1331
+ requested: T::Boolean
1332
+ ).returns(T.attached_class)
1333
+ end
1334
+ def self.new(data:, requested:)
1335
+ end
1336
+
1337
+ sig do
1338
+ override.returns(
1339
+ {
1340
+ data: T.nilable(T::Hash[Symbol, T.anything]),
1341
+ requested: T::Boolean
1342
+ }
1343
+ )
1344
+ end
1345
+ def to_hash
1346
+ end
1347
+ end
1348
+
1349
+ class Product < ContextDev::Internal::Type::BaseModel
1350
+ OrHash =
1351
+ T.type_alias do
1352
+ T.any(
1353
+ ContextDev::Models::WebScrapeResponse::Product,
1354
+ ContextDev::Internal::AnyHash
1355
+ )
1356
+ end
1357
+
1358
+ sig do
1359
+ returns(
1360
+ T.nilable(ContextDev::Models::WebScrapeResponse::Product::Data)
1361
+ )
1362
+ end
1363
+ attr_reader :data
1364
+
1365
+ sig do
1366
+ params(
1367
+ data:
1368
+ T.nilable(
1369
+ ContextDev::Models::WebScrapeResponse::Product::Data::OrHash
1370
+ )
1371
+ ).void
1372
+ end
1373
+ attr_writer :data
1374
+
1375
+ sig { returns(T::Boolean) }
1376
+ attr_accessor :requested
1377
+
1378
+ # Product detail page classification and the extracted product.
1379
+ sig do
1380
+ params(
1381
+ data:
1382
+ T.nilable(
1383
+ ContextDev::Models::WebScrapeResponse::Product::Data::OrHash
1384
+ ),
1385
+ requested: T::Boolean
1386
+ ).returns(T.attached_class)
1387
+ end
1388
+ def self.new(data:, requested:)
1389
+ end
1390
+
1391
+ sig do
1392
+ override.returns(
1393
+ {
1394
+ data:
1395
+ T.nilable(ContextDev::Models::WebScrapeResponse::Product::Data),
1396
+ requested: T::Boolean
1397
+ }
1398
+ )
1399
+ end
1400
+ def to_hash
1401
+ end
1402
+
1403
+ class Data < ContextDev::Internal::Type::BaseModel
1404
+ OrHash =
1405
+ T.type_alias do
1406
+ T.any(
1407
+ ContextDev::Models::WebScrapeResponse::Product::Data,
1408
+ ContextDev::Internal::AnyHash
1409
+ )
1410
+ end
1411
+
1412
+ # Whether the page is a product detail page.
1413
+ sig { returns(T::Boolean) }
1414
+ attr_accessor :is_product_page
1415
+
1416
+ # The extracted product, or null when the page is not a product detail page.
1417
+ sig do
1418
+ returns(
1419
+ T.nilable(
1420
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product
1421
+ )
1422
+ )
1423
+ end
1424
+ attr_reader :product
1425
+
1426
+ sig do
1427
+ params(
1428
+ product:
1429
+ T.nilable(
1430
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::OrHash
1431
+ )
1432
+ ).void
1433
+ end
1434
+ attr_writer :product
1435
+
1436
+ sig do
1437
+ params(
1438
+ is_product_page: T::Boolean,
1439
+ product:
1440
+ T.nilable(
1441
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::OrHash
1442
+ )
1443
+ ).returns(T.attached_class)
1444
+ end
1445
+ def self.new(
1446
+ # Whether the page is a product detail page.
1447
+ is_product_page:,
1448
+ # The extracted product, or null when the page is not a product detail page.
1449
+ product:
1450
+ )
1451
+ end
1452
+
1453
+ sig do
1454
+ override.returns(
1455
+ {
1456
+ is_product_page: T::Boolean,
1457
+ product:
1458
+ T.nilable(
1459
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product
1460
+ )
1461
+ }
1462
+ )
1463
+ end
1464
+ def to_hash
1465
+ end
1466
+
1467
+ class Product < ContextDev::Internal::Type::BaseModel
1468
+ OrHash =
1469
+ T.type_alias do
1470
+ T.any(
1471
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product,
1472
+ ContextDev::Internal::AnyHash
1473
+ )
1474
+ end
1475
+
1476
+ # Stock or ordering availability.
1477
+ sig do
1478
+ returns(
1479
+ T.nilable(
1480
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1481
+ )
1482
+ )
1483
+ end
1484
+ attr_accessor :availability
1485
+
1486
+ # Brand or vendor.
1487
+ sig { returns(T.nilable(String)) }
1488
+ attr_accessor :brand
1489
+
1490
+ # Product category.
1491
+ sig { returns(T.nilable(String)) }
1492
+ attr_accessor :category
1493
+
1494
+ # ISO 4217 currency code.
1495
+ sig { returns(T.nilable(String)) }
1496
+ attr_accessor :currency
1497
+
1498
+ # Product description.
1499
+ sig { returns(T.nilable(String)) }
1500
+ attr_accessor :description
1501
+
1502
+ # Product dimensions as shown on the page.
1503
+ sig { returns(T::Array[String]) }
1504
+ attr_accessor :dimensions
1505
+
1506
+ # Key features and specifications.
1507
+ sig { returns(T::Array[String]) }
1508
+ attr_accessor :features
1509
+
1510
+ # Product image URLs, main image first.
1511
+ sig { returns(T::Array[String]) }
1512
+ attr_accessor :images
1513
+
1514
+ # Main product image URL.
1515
+ sig { returns(T.nilable(String)) }
1516
+ attr_accessor :image_url
1517
+
1518
+ # Product name.
1519
+ sig { returns(String) }
1520
+ attr_accessor :name
1521
+
1522
+ # Current price.
1523
+ sig { returns(T.nilable(Float)) }
1524
+ attr_accessor :price
1525
+
1526
+ # List price before any discount.
1527
+ sig { returns(T.nilable(Float)) }
1528
+ attr_accessor :regular_price
1529
+
1530
+ # Product identifier such as a SKU or model number.
1531
+ sig { returns(T.nilable(String)) }
1532
+ attr_accessor :sku
1533
+
1534
+ # Product tags.
1535
+ sig { returns(T::Array[String]) }
1536
+ attr_accessor :tags
1537
+
1538
+ # Intended audience.
1539
+ sig { returns(T::Array[String]) }
1540
+ attr_accessor :target_audience
1541
+
1542
+ # Product variations, such as different colors or sizes, with their attributes and
1543
+ # images. Empty if none are found. May not include every variation offered by the
1544
+ # store.
1545
+ sig do
1546
+ returns(
1547
+ T::Array[
1548
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant
1549
+ ]
1550
+ )
1551
+ end
1552
+ attr_accessor :variants
1553
+
1554
+ # The extracted product, or null when the page is not a product detail page.
1555
+ sig do
1556
+ params(
1557
+ availability:
1558
+ T.nilable(
1559
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::OrSymbol
1560
+ ),
1561
+ brand: T.nilable(String),
1562
+ category: T.nilable(String),
1563
+ currency: T.nilable(String),
1564
+ description: T.nilable(String),
1565
+ dimensions: T::Array[String],
1566
+ features: T::Array[String],
1567
+ images: T::Array[String],
1568
+ image_url: T.nilable(String),
1569
+ name: String,
1570
+ price: T.nilable(Float),
1571
+ regular_price: T.nilable(Float),
1572
+ sku: T.nilable(String),
1573
+ tags: T::Array[String],
1574
+ target_audience: T::Array[String],
1575
+ variants:
1576
+ T::Array[
1577
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant::OrHash
1578
+ ]
1579
+ ).returns(T.attached_class)
1580
+ end
1581
+ def self.new(
1582
+ # Stock or ordering availability.
1583
+ availability:,
1584
+ # Brand or vendor.
1585
+ brand:,
1586
+ # Product category.
1587
+ category:,
1588
+ # ISO 4217 currency code.
1589
+ currency:,
1590
+ # Product description.
1591
+ description:,
1592
+ # Product dimensions as shown on the page.
1593
+ dimensions:,
1594
+ # Key features and specifications.
1595
+ features:,
1596
+ # Product image URLs, main image first.
1597
+ images:,
1598
+ # Main product image URL.
1599
+ image_url:,
1600
+ # Product name.
1601
+ name:,
1602
+ # Current price.
1603
+ price:,
1604
+ # List price before any discount.
1605
+ regular_price:,
1606
+ # Product identifier such as a SKU or model number.
1607
+ sku:,
1608
+ # Product tags.
1609
+ tags:,
1610
+ # Intended audience.
1611
+ target_audience:,
1612
+ # Product variations, such as different colors or sizes, with their attributes and
1613
+ # images. Empty if none are found. May not include every variation offered by the
1614
+ # store.
1615
+ variants:
1616
+ )
1617
+ end
1618
+
1619
+ sig do
1620
+ override.returns(
1621
+ {
1622
+ availability:
1623
+ T.nilable(
1624
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1625
+ ),
1626
+ brand: T.nilable(String),
1627
+ category: T.nilable(String),
1628
+ currency: T.nilable(String),
1629
+ description: T.nilable(String),
1630
+ dimensions: T::Array[String],
1631
+ features: T::Array[String],
1632
+ images: T::Array[String],
1633
+ image_url: T.nilable(String),
1634
+ name: String,
1635
+ price: T.nilable(Float),
1636
+ regular_price: T.nilable(Float),
1637
+ sku: T.nilable(String),
1638
+ tags: T::Array[String],
1639
+ target_audience: T::Array[String],
1640
+ variants:
1641
+ T::Array[
1642
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant
1643
+ ]
1644
+ }
1645
+ )
1646
+ end
1647
+ def to_hash
1648
+ end
1649
+
1650
+ # Stock or ordering availability.
1651
+ module Availability
1652
+ extend ContextDev::Internal::Type::Enum
1653
+
1654
+ TaggedSymbol =
1655
+ T.type_alias do
1656
+ T.all(
1657
+ Symbol,
1658
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability
1659
+ )
1660
+ end
1661
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
1662
+
1663
+ IN_STOCK =
1664
+ T.let(
1665
+ :in_stock,
1666
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1667
+ )
1668
+ OUT_OF_STOCK =
1669
+ T.let(
1670
+ :out_of_stock,
1671
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1672
+ )
1673
+ LIMITED_AVAILABILITY =
1674
+ T.let(
1675
+ :limited_availability,
1676
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1677
+ )
1678
+ PREORDER =
1679
+ T.let(
1680
+ :preorder,
1681
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1682
+ )
1683
+ BACKORDER =
1684
+ T.let(
1685
+ :backorder,
1686
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1687
+ )
1688
+ MADE_TO_ORDER =
1689
+ T.let(
1690
+ :made_to_order,
1691
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1692
+ )
1693
+ DISCONTINUED =
1694
+ T.let(
1695
+ :discontinued,
1696
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1697
+ )
1698
+
1699
+ sig do
1700
+ override.returns(
1701
+ T::Array[
1702
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
1703
+ ]
1704
+ )
1705
+ end
1706
+ def self.values
1707
+ end
1708
+ end
1709
+
1710
+ class Variant < ContextDev::Internal::Type::BaseModel
1711
+ OrHash =
1712
+ T.type_alias do
1713
+ T.any(
1714
+ ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant,
1715
+ ContextDev::Internal::AnyHash
1716
+ )
1717
+ end
1718
+
1719
+ # Explicit variant attributes such as color, size, material, pattern and
1720
+ # properties declared by page.
1721
+ sig { returns(T::Hash[Symbol, String]) }
1722
+ attr_accessor :attributes
1723
+
1724
+ # Original source image URLs explicitly attached to this variant.
1725
+ sig { returns(T::Array[String]) }
1726
+ attr_accessor :images
1727
+
1728
+ sig { returns(T.nilable(String)) }
1729
+ attr_accessor :sku
1730
+
1731
+ # Variant or offer URL when provided by the source. May be shared by variants.
1732
+ sig { returns(T.nilable(String)) }
1733
+ attr_accessor :url
1734
+
1735
+ sig do
1736
+ params(
1737
+ attributes: T::Hash[Symbol, String],
1738
+ images: T::Array[String],
1739
+ sku: T.nilable(String),
1740
+ url: T.nilable(String)
1741
+ ).returns(T.attached_class)
1742
+ end
1743
+ def self.new(
1744
+ # Explicit variant attributes such as color, size, material, pattern and
1745
+ # properties declared by page.
1746
+ attributes:,
1747
+ # Original source image URLs explicitly attached to this variant.
1748
+ images:,
1749
+ sku:,
1750
+ # Variant or offer URL when provided by the source. May be shared by variants.
1751
+ url:
1752
+ )
1753
+ end
1754
+
1755
+ sig do
1756
+ override.returns(
1757
+ {
1758
+ attributes: T::Hash[Symbol, String],
1759
+ images: T::Array[String],
1760
+ sku: T.nilable(String),
1761
+ url: T.nilable(String)
1762
+ }
1763
+ )
1764
+ end
1765
+ def to_hash
1766
+ end
1767
+ end
1768
+ end
1769
+ end
1770
+ end
1771
+
1772
+ class Screenshot < ContextDev::Internal::Type::BaseModel
1773
+ OrHash =
1774
+ T.type_alias do
1775
+ T.any(
1776
+ ContextDev::Models::WebScrapeResponse::Screenshot,
1777
+ ContextDev::Internal::AnyHash
1778
+ )
1779
+ end
1780
+
1781
+ sig { returns(T.nilable(String)) }
1782
+ attr_accessor :data
1783
+
1784
+ sig { returns(T::Boolean) }
1785
+ attr_accessor :requested
1786
+
1787
+ # An image data URL. Use directly as an image src.
1788
+ sig do
1789
+ params(data: T.nilable(String), requested: T::Boolean).returns(
1790
+ T.attached_class
1791
+ )
1792
+ end
1793
+ def self.new(data:, requested:)
1794
+ end
1795
+
1796
+ sig do
1797
+ override.returns({ data: T.nilable(String), requested: T::Boolean })
1798
+ end
1799
+ def to_hash
1800
+ end
1801
+ end
1802
+
1803
+ # Present when return-partial captures a page that is still loading, returns
1804
+ # images before image processing finishes, or cuts product AI extraction short.
1805
+ # Also present if the optional product AI fallback fails. Partial responses are
1806
+ # not cached.
1807
+ module IsPartial
1808
+ extend ContextDev::Internal::Type::Enum
1809
+
1810
+ TaggedBoolean =
1811
+ T.type_alias do
1812
+ T.all(T::Boolean, ContextDev::Models::WebScrapeResponse::IsPartial)
1813
+ end
1814
+ OrBoolean = T.type_alias { T::Boolean }
1815
+
1816
+ TRUE =
1817
+ T.let(
1818
+ true,
1819
+ ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
1820
+ )
1821
+
1822
+ sig do
1823
+ override.returns(
1824
+ T::Array[
1825
+ ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
1826
+ ]
1827
+ )
1828
+ end
1829
+ def self.values
1830
+ end
1831
+ end
1832
+
1833
+ class KeyMetadata < ContextDev::Internal::Type::BaseModel
1834
+ OrHash =
1835
+ T.type_alias do
1836
+ T.any(
1837
+ ContextDev::Models::WebScrapeResponse::KeyMetadata,
1838
+ ContextDev::Internal::AnyHash
1839
+ )
1840
+ end
1841
+
1842
+ # Credits used by this request.
1843
+ sig { returns(Integer) }
1844
+ attr_accessor :credits_consumed
1845
+
1846
+ # Credits remaining for your organization.
1847
+ sig { returns(Integer) }
1848
+ attr_accessor :credits_remaining
1849
+
1850
+ # Credit usage, included whenever a valid API key is provided.
1851
+ sig do
1852
+ params(credits_consumed: Integer, credits_remaining: Integer).returns(
1853
+ T.attached_class
1854
+ )
1855
+ end
1856
+ def self.new(
1857
+ # Credits used by this request.
1858
+ credits_consumed:,
1859
+ # Credits remaining for your organization.
1860
+ credits_remaining:
1861
+ )
1862
+ end
1863
+
1864
+ sig do
1865
+ override.returns(
1866
+ { credits_consumed: Integer, credits_remaining: Integer }
1867
+ )
1868
+ end
1869
+ def to_hash
1870
+ end
1871
+ end
1872
+ end
1873
+ end
1874
+ end