mcp-scraper 0.95.1 → 0.96.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 (124) hide show
  1. package/CHANGELOG.md +98 -39
  2. package/README.md +25 -7
  3. package/THIRD_PARTY_NOTICES.html +203 -0
  4. package/dist/actions-YCMJY3PF.js +1 -0
  5. package/dist/artifacts-4ZDNP2JW.js +1 -0
  6. package/dist/artifacts-N62OPIT5.js +1 -0
  7. package/dist/artifacts-PSADD5OC.js +1 -0
  8. package/dist/artifacts-RUR3OHAK.js +1 -0
  9. package/dist/bin/api-server.js +1 -1
  10. package/dist/bin/mcp-scraper-cli.js +22 -22
  11. package/dist/bin/mcp-scraper-core.js +1 -1
  12. package/dist/bin/mcp-scraper-install.js +1 -1
  13. package/dist/bin/mcp-stdio-server.js +1 -1
  14. package/dist/bin/paa-harvest.js +1 -1
  15. package/dist/blob-store-GIH26EDO.js +1 -0
  16. package/dist/bundle-TTJP6DHU.js +1 -0
  17. package/dist/chunk-24YDQ3EO.js +5 -0
  18. package/dist/chunk-2PRH4Z3N.js +181 -0
  19. package/dist/chunk-3F7AFM53.js +1 -0
  20. package/dist/chunk-4HZXATHB.js +27 -0
  21. package/dist/chunk-55ZANTHL.js +3 -0
  22. package/dist/chunk-5BKSKLHX.js +1 -0
  23. package/dist/chunk-63VWBMYR.js +3 -0
  24. package/dist/chunk-6N5EC7ZO.js +1 -0
  25. package/dist/chunk-6SNOUSSZ.js +182 -0
  26. package/dist/chunk-7POHNTVW.js +1 -0
  27. package/dist/chunk-7SR7MEU5.js +62 -0
  28. package/dist/chunk-7UHDOIUE.js +1 -0
  29. package/dist/chunk-ARSQZCTJ.js +945 -0
  30. package/dist/chunk-B3JRL45T.js +1 -0
  31. package/dist/chunk-B4ZKPLSP.js +1 -0
  32. package/dist/chunk-C7MGJUTU.js +1 -0
  33. package/dist/{chunk-W2BVJ7S2.js → chunk-CNSVZTTT.js} +4 -4
  34. package/dist/chunk-DGAW7FD7.js +12 -0
  35. package/dist/chunk-FRXKMOXI.js +41 -0
  36. package/dist/chunk-GVYGAZV7.js +1 -0
  37. package/dist/chunk-HCK6PLM3.js +3 -0
  38. package/dist/{chunk-I3HNHCIJ.js → chunk-HJIOH7HF.js} +199 -84
  39. package/dist/chunk-HNNYXMSI.js +1 -0
  40. package/dist/chunk-HUNSEGUN.js +57 -0
  41. package/dist/chunk-IFPION5D.js +121 -0
  42. package/dist/{chunk-DYDAQQMC.js → chunk-JAV5V3JT.js} +41 -8
  43. package/dist/chunk-JMZIDHYQ.js +2 -0
  44. package/dist/{chunk-FN7U6KRI.js → chunk-JW4GDY7S.js} +1 -1
  45. package/dist/chunk-KXJCGV3H.js +1 -0
  46. package/dist/chunk-LFRAA3MY.js +4 -0
  47. package/dist/{chunk-Y6STAKF3.js → chunk-M5QHXNFZ.js} +3 -3
  48. package/dist/chunk-MVMWPKRC.js +2 -0
  49. package/dist/chunk-NALXKTUU.js +1 -0
  50. package/dist/chunk-NNOX3FYG.js +198 -0
  51. package/dist/chunk-OB6E6UTD.js +1 -0
  52. package/dist/chunk-OILOHQNL.js +2 -0
  53. package/dist/chunk-OLYPLX5C.js +1 -0
  54. package/dist/chunk-QER2ELZP.js +1 -0
  55. package/dist/chunk-QWE7VKIX.js +1 -0
  56. package/dist/chunk-R5LJL6IR.js +225 -0
  57. package/dist/chunk-RDHGQ2WZ.js +1 -0
  58. package/dist/chunk-SDQW7IJN.js +1 -0
  59. package/dist/chunk-SEZETSB3.js +1 -0
  60. package/dist/chunk-SNJR5N36.js +1 -0
  61. package/dist/chunk-TPN25AFZ.js +159 -0
  62. package/dist/{chunk-AK6HVF5F.js → chunk-U4WIJZCX.js} +1 -1
  63. package/dist/chunk-UIOSADPB.js +1718 -0
  64. package/dist/{chunk-DYKSPHHR.js → chunk-UNEJYZ4T.js} +1 -1
  65. package/dist/chunk-VAC3SQ5T.js +16 -0
  66. package/dist/chunk-VVSHZV5S.js +73 -0
  67. package/dist/chunk-WNUXMPVX.js +1 -0
  68. package/dist/chunk-WP3QS4CJ.js +1 -0
  69. package/dist/chunk-ZPQNY5TI.js +1 -0
  70. package/dist/contracts-GUXGFCVV.js +1 -0
  71. package/dist/core-schema-423BSTE6.js +936 -0
  72. package/dist/dispatch-3HY4735M.js +1 -0
  73. package/dist/index.cjs +104 -214
  74. package/dist/index.d.cts +192 -180
  75. package/dist/index.d.ts +192 -180
  76. package/dist/index.js +1 -1
  77. package/dist/media-artifacts-67CJWI7O.js +1 -0
  78. package/dist/metering-ZH2P62IC.js +1 -0
  79. package/dist/migrations-3AKEC5QE.js +1 -0
  80. package/dist/queue-HUP2GNXF.js +1 -0
  81. package/dist/reconciliation-ANXNJWME.js +1 -0
  82. package/dist/report-artifact-offload-6OOY2PTM.js +1 -0
  83. package/dist/repository-4EC5EXVN.js +1 -0
  84. package/dist/{location-data-repository-NWWKDYG6.js → repository-CYXVMYAI.js} +1 -1
  85. package/dist/server-VQU6S24A.js +5825 -0
  86. package/dist/settlement-6CCE2PDH.js +1 -0
  87. package/dist/worker-5G5BK23B.js +1 -0
  88. package/package.json +18 -138
  89. package/dist/analytics-repository-A7VMA24D.js +0 -1
  90. package/dist/chunk-56C243PX.js +0 -2595
  91. package/dist/chunk-6ND5AFV5.js +0 -27
  92. package/dist/chunk-6NE4OIXR.js +0 -6
  93. package/dist/chunk-DOJMTFLB.js +0 -1
  94. package/dist/chunk-EDQ57S4P.js +0 -1
  95. package/dist/chunk-FCJXL4PU.js +0 -182
  96. package/dist/chunk-GPSPSJBJ.js +0 -1
  97. package/dist/chunk-HE45FFBU.js +0 -1
  98. package/dist/chunk-HUV2WTRW.js +0 -1
  99. package/dist/chunk-L552AQQY.js +0 -84
  100. package/dist/chunk-MVDMZ3N2.js +0 -1282
  101. package/dist/chunk-NA76FFGD.js +0 -73
  102. package/dist/chunk-NZSDHDX3.js +0 -1
  103. package/dist/chunk-OS4XFDIG.js +0 -21
  104. package/dist/chunk-QQ7OD7BJ.js +0 -100
  105. package/dist/chunk-RPA5ADXW.js +0 -16
  106. package/dist/chunk-TMB56NCA.js +0 -1
  107. package/dist/chunk-WO3N5FH2.js +0 -5
  108. package/dist/chunk-XPEJB4BZ.js +0 -1
  109. package/dist/chunk-YK4OAZRQ.js +0 -4
  110. package/dist/chunk-YWUNN24S.js +0 -1
  111. package/dist/chunk-ZJTUAWZA.js +0 -19
  112. package/dist/chunk-ZPK5LYEN.js +0 -1565
  113. package/dist/chunk-ZUGTYD2I.js +0 -63
  114. package/dist/db-B6RNXKEI.js +0 -1
  115. package/dist/extract-bundle-X7SRN63Y.js +0 -26
  116. package/dist/gmail-service-FZVJBSUT.js +0 -1
  117. package/dist/lead-list-enrichment-repository-SXYSS7ZX.js +0 -1
  118. package/dist/operation-metering-OBKSWJVJ.js +0 -1
  119. package/dist/server-JV6L7F2X.js +0 -5014
  120. package/dist/site-extract-repository-UVE7TWJO.js +0 -1
  121. package/dist/stripe-event-worker-2LSUVQOM.js +0 -1
  122. package/dist/worker-XPIO5TAV.js +0 -1
  123. /package/dist/{chunk-YGBTTW5D.js → chunk-2IATUJO6.js} +0 -0
  124. /package/dist/{chunk-6DTXIZY2.js → chunk-4ZVO6GX4.js} +0 -0
package/dist/index.d.cts CHANGED
@@ -3,6 +3,103 @@ import { z } from 'zod';
3
3
  declare const SERP_FEATURE_COMPLETENESS_STATES: readonly ["observed_present", "observed_absent", "incomplete", "not_requested", "unknown", "unsupported"];
4
4
  type SerpFeatureCompletenessState = typeof SERP_FEATURE_COMPLETENESS_STATES[number];
5
5
 
6
+ type SerpLinkType = 'plain' | 'google_url_redirect' | 'google_goto_redirect';
7
+ type SerpLinkResolutionStatus = 'not_needed' | 'resolved' | 'unresolved' | 'rejected';
8
+ interface SerpOutboundLink {
9
+ url: string;
10
+ rawUrl: string;
11
+ resolvedUrl: string | null;
12
+ linkType: SerpLinkType;
13
+ resolutionStatus: SerpLinkResolutionStatus;
14
+ }
15
+ interface VideoResult {
16
+ type: 'video' | 'short_video';
17
+ title: string;
18
+ channel: string;
19
+ platform: string;
20
+ duration: string;
21
+ url: string;
22
+ }
23
+ interface ForumResult {
24
+ title: string;
25
+ source: string;
26
+ url: string;
27
+ }
28
+ interface WhatPeopleSayingCard {
29
+ type: 'reddit' | 'facebook' | 'instagram' | 'tiktok' | 'youtube' | 'news' | 'unknown';
30
+ title: string;
31
+ url: string;
32
+ source: string;
33
+ platform: string;
34
+ popularComment: string | null;
35
+ engagement: string;
36
+ date: string;
37
+ duration: string | null;
38
+ authorNote: string | null;
39
+ }
40
+ interface AICitation {
41
+ text: string;
42
+ href: string;
43
+ rawUrl: string;
44
+ resolvedUrl: string | null;
45
+ linkType: SerpLinkType;
46
+ resolutionStatus: SerpLinkResolutionStatus;
47
+ }
48
+ interface AIOverviewResult {
49
+ detected: boolean;
50
+ text: string | null;
51
+ citations: AICitation[];
52
+ expanded?: boolean;
53
+ fullyExpanded?: boolean;
54
+ sections?: string[];
55
+ shareUrl?: string | null;
56
+ }
57
+ interface AIModeResult {
58
+ detected: boolean;
59
+ text: string | null;
60
+ citations: AICitation[];
61
+ }
62
+ type GoogleSurface = 'web' | 'aim' | 'unknown';
63
+ interface OrganicResult {
64
+ position: number;
65
+ title: string;
66
+ url: string;
67
+ rawUrl: string;
68
+ resolvedUrl: string | null;
69
+ linkType: SerpLinkType;
70
+ resolutionStatus: SerpLinkResolutionStatus;
71
+ domain: string;
72
+ cite: string | null;
73
+ snippet: string | null;
74
+ isRedditStyle: boolean;
75
+ inlineRating: {
76
+ value: string;
77
+ count: string;
78
+ } | null;
79
+ }
80
+ interface LocalPackBusiness {
81
+ position: number;
82
+ name: string;
83
+ cid: string | null;
84
+ rating: string | null;
85
+ reviewCount: string | null;
86
+ metadata: string[];
87
+ websiteUrl: string | null;
88
+ directionsUrl: string | null;
89
+ }
90
+ interface EntityRecord {
91
+ name: string;
92
+ kgId: string | null;
93
+ cid: string | null;
94
+ gcid: string | null;
95
+ }
96
+ interface EntityIds {
97
+ entities: EntityRecord[];
98
+ kgIds: string[];
99
+ cids: string[];
100
+ gcids: string[];
101
+ }
102
+
6
103
  interface SerpPreviewQuestion {
7
104
  question: string;
8
105
  answer: string | null;
@@ -49,9 +146,9 @@ declare const HarvestOptionsSchema: z.ZodObject<{
49
146
  mobile: "mobile";
50
147
  }>>;
51
148
  proxyMode: z.ZodDefault<z.ZodEnum<{
52
- none: "none";
53
149
  location: "location";
54
150
  configured: "configured";
151
+ none: "none";
55
152
  }>>;
56
153
  proxyZip: z.ZodOptional<z.ZodString>;
57
154
  keepDefaultProxy: z.ZodOptional<z.ZodBoolean>;
@@ -63,13 +160,13 @@ declare const HarvestOptionsSchema: z.ZodObject<{
63
160
  headless: z.ZodDefault<z.ZodBoolean>;
64
161
  profileDir: z.ZodOptional<z.ZodString>;
65
162
  proxy: z.ZodOptional<z.ZodString>;
66
- kernelApiKey: z.ZodOptional<z.ZodString>;
67
- kernelProxyId: z.ZodOptional<z.ZodString>;
68
- kernelProfileName: z.ZodOptional<z.ZodString>;
69
- kernelProfileSaveChanges: z.ZodOptional<z.ZodBoolean>;
70
- kernelStealth: z.ZodOptional<z.ZodBoolean>;
163
+ \u006b\u0065\u0072\u006e\u0065\u006cApiKey: z.ZodOptional<z.ZodString>;
164
+ \u006b\u0065\u0072\u006e\u0065\u006cProxyId: z.ZodOptional<z.ZodString>;
165
+ \u006b\u0065\u0072\u006e\u0065\u006cProfileName: z.ZodOptional<z.ZodString>;
166
+ \u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges: z.ZodOptional<z.ZodBoolean>;
167
+ \u006b\u0065\u0072\u006e\u0065\u006cStealth: z.ZodOptional<z.ZodBoolean>;
71
168
  serpIdentity: z.ZodOptional<z.ZodString>;
72
- kernelProxyResolution: z.ZodOptional<z.ZodUnknown>;
169
+ \u006b\u0065\u0072\u006e\u0065\u006cProxyResolution: z.ZodOptional<z.ZodUnknown>;
73
170
  outputDir: z.ZodDefault<z.ZodString>;
74
171
  format: z.ZodDefault<z.ZodEnum<{
75
172
  json: "json";
@@ -182,6 +279,8 @@ interface PaaProgressSnapshot {
182
279
  interface PaaSource extends SerpOutboundLink {
183
280
  title: string | null;
184
281
  site: string | null;
282
+ /** Description displayed in the Google source card, when observed. */
283
+ description?: string | null;
185
284
  }
186
285
  interface PAANode {
187
286
  questionId: string;
@@ -189,6 +288,8 @@ interface PAANode {
189
288
  googleEvidenceId: string | null;
190
289
  question: string;
191
290
  answer: string | null;
291
+ /** A remaining inner answer control could not be expanded within the capture budget. */
292
+ answerExpansionIncomplete?: boolean;
192
293
  sourceTitle: string | null;
193
294
  sourceSite: string | null;
194
295
  sourceCite: string | null;
@@ -204,6 +305,7 @@ interface FlatRow {
204
305
  google_evidence_id: string;
205
306
  question: string;
206
307
  answer: string;
308
+ answerExpansionIncomplete?: boolean;
207
309
  source_title: string;
208
310
  source_site: string;
209
311
  source_cite: string;
@@ -217,7 +319,8 @@ type HarvestOptions = z.infer<typeof HarvestOptionsSchema>;
217
319
  type CanonicalLocationName = string;
218
320
  type SerpDevice = 'desktop' | 'mobile';
219
321
  type ProxyMode = 'location' | 'configured' | 'none';
220
- interface KernelLocationProxyTarget {
322
+
323
+ interface \u004b\u0065\u0072\u006e\u0065\u006cLocationProxyTarget {
221
324
  canonicalLocation: CanonicalLocationName;
222
325
  level: 'zip' | 'city' | 'state';
223
326
  country: 'US';
@@ -233,17 +336,93 @@ interface KernelLocationProxyTarget {
233
336
  zip?: string;
234
337
  };
235
338
  }
236
- type KernelProxyResolutionSource = 'disabled' | 'location_reused' | 'location_created' | 'mobile_created' | 'isp_created' | 'backup_custom' | 'configured_fallback' | 'unavailable';
237
- interface KernelProxyResolutionDebug {
238
- source: KernelProxyResolutionSource;
339
+ type \u004b\u0065\u0072\u006e\u0065\u006cProxyResolutionSource = 'disabled' | 'location_reused' | 'location_created' | 'mobile_created' | 'isp_created' | 'backup_custom' | 'configured_fallback' | 'unavailable';
340
+ interface \u004b\u0065\u0072\u006e\u0065\u006cProxyResolutionDebug {
341
+ source: \u004b\u0065\u0072\u006e\u0065\u006cProxyResolutionSource;
239
342
  proxyType: string;
240
343
  proxyMode: ProxyMode;
241
344
  proxyIdPresent: boolean;
242
345
  proxyIdSuffix: string | null;
243
- target: KernelLocationProxyTarget | null;
346
+ target: \u004b\u0065\u0072\u006e\u0065\u006cLocationProxyTarget | null;
244
347
  error: string | null;
245
348
  disposable?: boolean;
246
349
  }
350
+
351
+ interface BrowserNetworkLocationDebug {
352
+ source: 'ipapi.co' | 'ipwho.is' | 'api64.ipify.org';
353
+ ip: string | null;
354
+ city: string | null;
355
+ region: string | null;
356
+ country: string | null;
357
+ org: string | null;
358
+ timezone: string | null;
359
+ error: string | null;
360
+ }
361
+ interface \u004b\u0065\u0072\u006e\u0065\u006cSessionDebug {
362
+ sessionId: string | null;
363
+ proxyMode: ProxyMode;
364
+ requestedProxyIdPresent: boolean;
365
+ requestedProxyIdSuffix: string | null;
366
+ createdProxyIdPresent: boolean | null;
367
+ createdProxyIdSuffix: string | null;
368
+ retrievedProxyIdPresent: boolean | null;
369
+ retrievedProxyIdSuffix: string | null;
370
+ retrievedProxyIdMatchesRequested: boolean | null;
371
+ defaultProxyDisabled: boolean | null;
372
+ defaultProxyDisableError: string | null;
373
+ proxyResolution: \u004b\u0065\u0072\u006e\u0065\u006cProxyResolutionDebug | null;
374
+ timeoutSeconds: number | null;
375
+ stealth: boolean | null;
376
+ profilePresent: boolean | null;
377
+ poolPresent: boolean | null;
378
+ retrieveError: string | null;
379
+ }
380
+ interface BrowserContextDebug {
381
+ viewport: {
382
+ width: number;
383
+ height: number;
384
+ } | null;
385
+ locale: string | null;
386
+ device: SerpDevice;
387
+ requestedDevice?: SerpDevice;
388
+ userAgent: string | null;
389
+ deviceScaleFactor: number | null;
390
+ isMobile: boolean;
391
+ hasTouch: boolean;
392
+ }
393
+ interface SerpNavigationDebug {
394
+ requestedUrl: string;
395
+ finalUrl: string | null;
396
+ title: string | null;
397
+ bodySnippet: string | null;
398
+ hasPaa: boolean | null;
399
+ captchaDetected: boolean | null;
400
+ googleSorryUrl: boolean | null;
401
+ redirected: boolean | null;
402
+ }
403
+ interface BrowserDebugSnapshot {
404
+ \u006b\u0065\u0072\u006e\u0065\u006c: \u004b\u0065\u0072\u006e\u0065\u006cSessionDebug | null;
405
+ context: BrowserContextDebug | null;
406
+ networkLocation: BrowserNetworkLocationDebug | null;
407
+ serpNavigation: SerpNavigationDebug | null;
408
+ }
409
+
410
+ interface SerpLocationCandidate {
411
+ city: string;
412
+ regionCode: string;
413
+ count: number;
414
+ examples: string[];
415
+ }
416
+ interface SerpLocationEvidence {
417
+ status: 'not_requested' | 'matched' | 'mismatch' | 'unknown';
418
+ expected: {
419
+ city: string;
420
+ regionCode: string | null;
421
+ canonicalLocation: string;
422
+ } | null;
423
+ candidates: SerpLocationCandidate[];
424
+ }
425
+
247
426
  interface HarvestStats {
248
427
  seed: string;
249
428
  totalQuestions: number;
@@ -270,6 +449,7 @@ interface HarvestDiagnosticWarning {
270
449
  interface HarvestCompleteness {
271
450
  paaWithoutAnswer: number;
272
451
  paaWithoutSource: number;
452
+ paaIncompleteAnswers?: number;
273
453
  paaAnswersRecovered: number;
274
454
  aioShareCaptured: boolean | null;
275
455
  paaRequested?: number;
@@ -329,78 +509,6 @@ interface HarvestLinkDiagnostics {
329
509
  paaSourcesPreserved: number;
330
510
  aiOverviewLabelValidated: boolean;
331
511
  }
332
- interface BrowserNetworkLocationDebug {
333
- source: 'ipapi.co' | 'ipwho.is' | 'api64.ipify.org';
334
- ip: string | null;
335
- city: string | null;
336
- region: string | null;
337
- country: string | null;
338
- org: string | null;
339
- timezone: string | null;
340
- error: string | null;
341
- }
342
- interface KernelSessionDebug {
343
- sessionId: string | null;
344
- proxyMode: ProxyMode;
345
- requestedProxyIdPresent: boolean;
346
- requestedProxyIdSuffix: string | null;
347
- createdProxyIdPresent: boolean | null;
348
- createdProxyIdSuffix: string | null;
349
- retrievedProxyIdPresent: boolean | null;
350
- retrievedProxyIdSuffix: string | null;
351
- retrievedProxyIdMatchesRequested: boolean | null;
352
- defaultProxyDisabled: boolean | null;
353
- defaultProxyDisableError: string | null;
354
- proxyResolution: KernelProxyResolutionDebug | null;
355
- timeoutSeconds: number | null;
356
- stealth: boolean | null;
357
- profilePresent: boolean | null;
358
- poolPresent: boolean | null;
359
- retrieveError: string | null;
360
- }
361
- interface BrowserContextDebug {
362
- viewport: {
363
- width: number;
364
- height: number;
365
- };
366
- locale: string;
367
- device: SerpDevice;
368
- userAgent: string | null;
369
- deviceScaleFactor: number | null;
370
- isMobile: boolean;
371
- hasTouch: boolean;
372
- }
373
- interface SerpNavigationDebug {
374
- requestedUrl: string;
375
- finalUrl: string | null;
376
- title: string | null;
377
- bodySnippet: string | null;
378
- hasPaa: boolean | null;
379
- captchaDetected: boolean | null;
380
- googleSorryUrl: boolean | null;
381
- redirected: boolean | null;
382
- }
383
- interface BrowserDebugSnapshot {
384
- kernel: KernelSessionDebug | null;
385
- context: BrowserContextDebug | null;
386
- networkLocation: BrowserNetworkLocationDebug | null;
387
- serpNavigation: SerpNavigationDebug | null;
388
- }
389
- interface SerpLocationCandidate {
390
- city: string;
391
- regionCode: string;
392
- count: number;
393
- examples: string[];
394
- }
395
- interface SerpLocationEvidence {
396
- status: 'not_requested' | 'matched' | 'mismatch' | 'unknown';
397
- expected: {
398
- city: string;
399
- regionCode: string | null;
400
- canonicalLocation: string;
401
- } | null;
402
- candidates: SerpLocationCandidate[];
403
- }
404
512
  interface HarvestDebugSnapshot {
405
513
  enabled: true;
406
514
  request: {
@@ -423,102 +531,6 @@ interface HarvestDebugSnapshot {
423
531
  browser: BrowserDebugSnapshot;
424
532
  locationEvidence?: SerpLocationEvidence;
425
533
  }
426
- type SerpLinkType = 'plain' | 'google_url_redirect' | 'google_goto_redirect';
427
- type SerpLinkResolutionStatus = 'not_needed' | 'resolved' | 'unresolved' | 'rejected';
428
- interface SerpOutboundLink {
429
- url: string;
430
- rawUrl: string;
431
- resolvedUrl: string | null;
432
- linkType: SerpLinkType;
433
- resolutionStatus: SerpLinkResolutionStatus;
434
- }
435
- interface VideoResult {
436
- type: 'video' | 'short_video';
437
- title: string;
438
- channel: string;
439
- platform: string;
440
- duration: string;
441
- url: string;
442
- }
443
- interface ForumResult {
444
- title: string;
445
- source: string;
446
- url: string;
447
- }
448
- interface WhatPeopleSayingCard {
449
- type: 'reddit' | 'facebook' | 'instagram' | 'tiktok' | 'youtube' | 'news' | 'unknown';
450
- title: string;
451
- url: string;
452
- source: string;
453
- platform: string;
454
- popularComment: string | null;
455
- engagement: string;
456
- date: string;
457
- duration: string | null;
458
- authorNote: string | null;
459
- }
460
- interface AICitation {
461
- text: string;
462
- href: string;
463
- rawUrl: string;
464
- resolvedUrl: string | null;
465
- linkType: SerpLinkType;
466
- resolutionStatus: SerpLinkResolutionStatus;
467
- }
468
- interface AIOverviewResult {
469
- detected: boolean;
470
- text: string | null;
471
- citations: AICitation[];
472
- expanded?: boolean;
473
- fullyExpanded?: boolean;
474
- sections?: string[];
475
- shareUrl?: string | null;
476
- }
477
- interface AIModeResult {
478
- detected: boolean;
479
- text: string | null;
480
- citations: AICitation[];
481
- }
482
- type GoogleSurface = 'web' | 'aim' | 'unknown';
483
- interface OrganicResult {
484
- position: number;
485
- title: string;
486
- url: string;
487
- rawUrl: string;
488
- resolvedUrl: string | null;
489
- linkType: SerpLinkType;
490
- resolutionStatus: SerpLinkResolutionStatus;
491
- domain: string;
492
- cite: string | null;
493
- snippet: string | null;
494
- isRedditStyle: boolean;
495
- inlineRating: {
496
- value: string;
497
- count: string;
498
- } | null;
499
- }
500
- interface LocalPackBusiness {
501
- position: number;
502
- name: string;
503
- cid: string | null;
504
- rating: string | null;
505
- reviewCount: string | null;
506
- metadata: string[];
507
- websiteUrl: string | null;
508
- directionsUrl: string | null;
509
- }
510
- interface EntityRecord {
511
- name: string;
512
- kgId: string | null;
513
- cid: string | null;
514
- gcid: string | null;
515
- }
516
- interface EntityIds {
517
- entities: EntityRecord[];
518
- kgIds: string[];
519
- cids: string[];
520
- gcids: string[];
521
- }
522
534
  interface HarvestResult {
523
535
  seed: string;
524
536
  location: string | null;