scavio 0.14.0 → 0.15.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.
package/dist/index.cjs CHANGED
@@ -20,17 +20,48 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ AirbnbNamespace: () => AirbnbNamespace,
24
+ AmazonNamespace: () => AmazonNamespace,
25
+ AppStoreNamespace: () => AppStoreNamespace,
23
26
  BadRequestError: () => BadRequestError,
27
+ BookingNamespace: () => BookingNamespace,
28
+ CapterraNamespace: () => CapterraNamespace,
29
+ CompaniesHouseNamespace: () => CompaniesHouseNamespace,
30
+ EbayNamespace: () => EbayNamespace,
31
+ G2Namespace: () => G2Namespace,
32
+ GlassdoorNamespace: () => GlassdoorNamespace,
33
+ GoogleAdsNamespace: () => GoogleAdsNamespace,
34
+ GoogleNamespace: () => GoogleNamespace,
35
+ GooglePlayNamespace: () => GooglePlayNamespace,
36
+ HomeDepotNamespace: () => HomeDepotNamespace,
37
+ IndeedNamespace: () => IndeedNamespace,
38
+ InstagramNamespace: () => InstagramNamespace,
24
39
  InsufficientCreditsError: () => InsufficientCreditsError,
25
40
  InvalidAPIKeyError: () => InvalidAPIKeyError,
41
+ KuaishouNamespace: () => KuaishouNamespace,
42
+ LinkedInNamespace: () => LinkedInNamespace,
43
+ MetaAdsNamespace: () => MetaAdsNamespace,
26
44
  MissingAPIKeyError: () => MissingAPIKeyError,
27
45
  NotFoundError: () => NotFoundError,
28
46
  RateLimitError: () => RateLimitError,
47
+ RedditNamespace: () => RedditNamespace,
48
+ RedfinNamespace: () => RedfinNamespace,
49
+ SECNamespace: () => SECNamespace,
29
50
  Scavio: () => Scavio,
30
51
  ScavioAPIError: () => ScavioAPIError,
31
52
  ScavioConnectionError: () => ScavioConnectionError,
32
53
  ScavioError: () => ScavioError,
33
- ScavioTimeoutError: () => ScavioTimeoutError
54
+ ScavioTimeoutError: () => ScavioTimeoutError,
55
+ TargetNamespace: () => TargetNamespace,
56
+ ThreadsNamespace: () => ThreadsNamespace,
57
+ TikTokNamespace: () => TikTokNamespace,
58
+ TikTokShopNamespace: () => TikTokShopNamespace,
59
+ TripadvisorNamespace: () => TripadvisorNamespace,
60
+ WalmartNamespace: () => WalmartNamespace,
61
+ XNamespace: () => XNamespace,
62
+ YelpNamespace: () => YelpNamespace,
63
+ YouTubeNamespace: () => YouTubeNamespace,
64
+ ZillowNamespace: () => ZillowNamespace
34
65
  });
35
66
  module.exports = __toCommonJS(index_exports);
36
67
 
@@ -80,12 +111,13 @@ var InsufficientCreditsError = class extends ScavioError {
80
111
  }
81
112
  };
82
113
  var BadRequestError = class extends ScavioError {
83
- statusCode = 400;
114
+ statusCode;
84
115
  responseBody;
85
- constructor(message = "Bad request", responseBody) {
116
+ constructor(message = "Bad request", responseBody, statusCode = 400) {
86
117
  super(message);
87
118
  this.name = "BadRequestError";
88
119
  this.responseBody = responseBody;
120
+ this.statusCode = statusCode;
89
121
  }
90
122
  };
91
123
  var NotFoundError = class extends ScavioError {
@@ -187,7 +219,9 @@ function handleError(statusCode, body) {
187
219
  }
188
220
  const msg = String(error);
189
221
  const responseBody = Object.keys(body).length > 0 ? body : void 0;
190
- if (statusCode === 400) throw new BadRequestError(msg, responseBody);
222
+ if (statusCode === 400 || statusCode === 422) {
223
+ throw new BadRequestError(msg, responseBody, statusCode);
224
+ }
191
225
  if (statusCode === 401) throw new InvalidAPIKeyError(msg, responseBody);
192
226
  if (statusCode === 402) throw new InsufficientCreditsError(msg, responseBody);
193
227
  if (statusCode === 404) throw new NotFoundError(msg, responseBody);
@@ -640,12 +674,71 @@ var WalmartNamespace = class {
640
674
  this.client = client;
641
675
  }
642
676
  client;
677
+ /**
678
+ * Structured Walmart search results: `products[]`, `products_count` and the
679
+ * resolved `location`. Page through with `page` (1-indexed).
680
+ *
681
+ * Costs 1 credit for `domain` "com" or "ca", 2 credits for "com.mx".
682
+ */
643
683
  async search(options) {
644
684
  return this.client._post("/api/v1/walmart/search", options);
645
685
  }
686
+ /**
687
+ * Full product detail: price, rating, images, specifications, availability
688
+ * and seller.
689
+ *
690
+ * Costs 1 credit. Walmart.ca product pages are not fetchable, so this is
691
+ * walmart.com only.
692
+ */
646
693
  async product(options) {
647
694
  return this.client._post("/api/v1/walmart/product", options);
648
695
  }
696
+ /**
697
+ * Customer reviews with ratings, text, author, date and the rating
698
+ * breakdown. 10 reviews per page; advance with `page`.
699
+ *
700
+ * Costs 1 credit.
701
+ */
702
+ async reviews(options) {
703
+ return this.client._post("/api/v1/walmart/reviews", options);
704
+ }
705
+ /**
706
+ * Products within a category, in the same product shape as `search()`.
707
+ * Page through with `page`; `limit` only trims the response.
708
+ *
709
+ * Costs 1 credit for `domain` "com" or "ca", 2 credits for "com.mx".
710
+ */
711
+ async category(options) {
712
+ return this.client._post("/api/v1/walmart/category", options);
713
+ }
714
+ /**
715
+ * Seller offer for a product: price, seller, condition and buy-box flag.
716
+ * Returns the BUY-BOX SELLER ONLY, not the full offer list.
717
+ *
718
+ * Costs 1 credit.
719
+ */
720
+ async offers(options) {
721
+ return this.client._post("/api/v1/walmart/offers", options);
722
+ }
723
+ /**
724
+ * Marketplace seller storefront: name, rating, review count, Pro Seller
725
+ * badge and business details.
726
+ *
727
+ * Costs 1 credit. `seller_id` must be the numeric catalog seller id.
728
+ */
729
+ async seller(options) {
730
+ return this.client._post("/api/v1/walmart/seller", options);
731
+ }
732
+ /**
733
+ * A seller's catalog. Roughly the first 40 items are server-rendered and
734
+ * that is all this returns - there is no pagination. `total_count` reports
735
+ * the seller's real catalog size, which is usually far larger.
736
+ *
737
+ * Costs 1 credit. `seller_id` must be the numeric catalog seller id.
738
+ */
739
+ async sellerProducts(options) {
740
+ return this.client._post("/api/v1/walmart/seller-products", options);
741
+ }
649
742
  };
650
743
 
651
744
  // src/namespaces/youtube.ts
@@ -852,74 +945,1497 @@ var LinkedInNamespace = class {
852
945
  }
853
946
  };
854
947
 
855
- // src/client.ts
856
- var Scavio = class {
857
- google;
858
- amazon;
859
- walmart;
860
- youtube;
861
- reddit;
862
- tiktok;
863
- tiktokShop;
864
- instagram;
865
- x;
866
- linkedin;
867
- apiKey;
868
- baseUrl;
869
- timeout;
870
- maxRetries;
871
- rateLimiter;
872
- constructor(config) {
873
- this.apiKey = config?.apiKey ?? process.env.SCAVIO_API_KEY ?? "";
874
- if (!this.apiKey) {
875
- throw new MissingAPIKeyError();
876
- }
877
- this.baseUrl = (config?.baseUrl ?? BASE_URL).replace(/\/+$/, "");
878
- this.timeout = config?.timeout ?? DEFAULT_TIMEOUT;
879
- this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;
880
- const rps = config?.maxRequestsPerSecond ?? 1;
881
- if (rps < 1 || rps > 10) {
882
- throw new ScavioError("maxRequestsPerSecond must be between 1 and 10");
883
- }
884
- this.rateLimiter = new RateLimiter(rps);
885
- this.google = new GoogleNamespace(this);
886
- this.amazon = new AmazonNamespace(this);
887
- this.walmart = new WalmartNamespace(this);
888
- this.youtube = new YouTubeNamespace(this);
889
- this.reddit = new RedditNamespace(this);
890
- this.tiktok = new TikTokNamespace(this);
891
- this.tiktokShop = new TikTokShopNamespace(this);
892
- this.instagram = new InstagramNamespace(this);
893
- this.x = new XNamespace(this);
894
- this.linkedin = new LinkedInNamespace(this);
948
+ // src/namespaces/threads.ts
949
+ var ThreadsNamespace = class {
950
+ constructor(client) {
951
+ this.client = client;
895
952
  }
896
- /** @internal */
897
- async _post(path, body) {
898
- return request({
899
- method: "POST",
900
- path,
901
- apiKey: this.apiKey,
902
- baseUrl: this.baseUrl,
903
- timeout: this.timeout,
904
- maxRetries: this.maxRetries,
905
- rateLimiter: this.rateLimiter,
906
- body
907
- });
953
+ client;
954
+ /**
955
+ * Profile details for a Threads user. Pass `user_id` or `username`;
956
+ * sending neither returns 422 and no match returns 404.
957
+ *
958
+ * Costs 2 credits by `user_id`, 4 credits by `username`.
959
+ */
960
+ async profile(options) {
961
+ return this.client._post("/api/v1/threads/profile", options);
908
962
  }
909
- /** @internal */
910
- async _get(path) {
911
- return request({
912
- method: "GET",
913
- path,
914
- apiKey: this.apiKey,
915
- baseUrl: this.baseUrl,
916
- timeout: this.timeout,
917
- maxRetries: this.maxRetries,
918
- rateLimiter: this.rateLimiter
919
- });
963
+ /**
964
+ * A user's Threads posts. Advance with the previous response's
965
+ * `next_cursor`. Pass `user_id` or `username`.
966
+ *
967
+ * Costs 2 credits by `user_id`, 4 credits by `username` - and that surcharge
968
+ * applies to every page, so resolve the id once before paging.
969
+ */
970
+ async userPosts(options) {
971
+ return this.client._post("/api/v1/threads/user/posts", options);
972
+ }
973
+ /**
974
+ * A user's replies. Advance with the previous response's `next_cursor`.
975
+ * Pass `user_id` or `username`.
976
+ *
977
+ * Costs 2 credits by `user_id`, 4 credits by `username` - and that surcharge
978
+ * applies to every page, so resolve the id once before paging.
979
+ */
980
+ async userReplies(options) {
981
+ return this.client._post("/api/v1/threads/user/replies", options);
982
+ }
983
+ /**
984
+ * A single post, addressed by `post_id` or by its threads.net `url`.
985
+ * Sending neither returns 422.
986
+ *
987
+ * Costs 2 credits.
988
+ */
989
+ async post(options) {
990
+ return this.client._post("/api/v1/threads/post", options);
991
+ }
992
+ /**
993
+ * Replies to a post. Advance with the previous response's `next_cursor`.
994
+ *
995
+ * Costs 2 credits - this endpoint is never username-keyed, so there is no
996
+ * handle surcharge.
997
+ */
998
+ async postComments(options) {
999
+ return this.client._post("/api/v1/threads/post/comments", options);
1000
+ }
1001
+ /**
1002
+ * Threads profiles matching a name or handle. This is people search, and it
1003
+ * is the only search Threads exposes - there is no content/post search.
1004
+ * Use it to turn a handle into the `user_id` every other method prefers.
1005
+ *
1006
+ * Costs 2 credits. Single response, no pagination.
1007
+ */
1008
+ async searchUsers(options) {
1009
+ return this.client._post("/api/v1/threads/search/users", options);
1010
+ }
1011
+ };
1012
+
1013
+ // src/namespaces/kuaishou.ts
1014
+ var KuaishouNamespace = class {
1015
+ constructor(client) {
1016
+ this.client = client;
1017
+ }
1018
+ client;
1019
+ /**
1020
+ * Profile details for a Kuaishou user, addressed by numeric `user_id`.
1021
+ *
1022
+ * Costs 10 credits - the dearest single-object call on the platform. If you
1023
+ * only have a share link, resolve it with `userResolve()` (1 credit) first.
1024
+ */
1025
+ async profile(options) {
1026
+ return this.client._post("/api/v1/kuaishou/profile", options);
1027
+ }
1028
+ /**
1029
+ * A user's top posts. Advance with the previous response's `next_cursor`.
1030
+ *
1031
+ * Costs 1 credit per page.
1032
+ */
1033
+ async userPosts(options) {
1034
+ return this.client._post("/api/v1/kuaishou/user/posts", options);
1035
+ }
1036
+ /**
1037
+ * A user's current live-stream status.
1038
+ *
1039
+ * Costs 1 credit.
1040
+ */
1041
+ async userLive(options) {
1042
+ return this.client._post("/api/v1/kuaishou/user/live", options);
1043
+ }
1044
+ /**
1045
+ * Turns a Kuaishou share link into a `user_id` you can feed to the other
1046
+ * user endpoints. kuaishou.com and v.kuaishou.com links only - kwai.com is
1047
+ * not supported.
1048
+ *
1049
+ * Costs 1 credit.
1050
+ */
1051
+ async userResolve(options) {
1052
+ return this.client._post("/api/v1/kuaishou/user/resolve", options);
1053
+ }
1054
+ /**
1055
+ * A single video, addressed by `photo_id` or by its Kuaishou `url`.
1056
+ * Sending neither returns 422.
1057
+ *
1058
+ * Costs 2 credits.
1059
+ */
1060
+ async video(options) {
1061
+ return this.client._post("/api/v1/kuaishou/video", options);
1062
+ }
1063
+ /**
1064
+ * Comments on a video. Advance with the previous response's `next_cursor`.
1065
+ *
1066
+ * Costs 1 credit per page.
1067
+ */
1068
+ async videoComments(options) {
1069
+ return this.client._post("/api/v1/kuaishou/video/comments", options);
1070
+ }
1071
+ /**
1072
+ * Replies under a root comment. Advance with the previous response's
1073
+ * `next_cursor`; `count` (1-50) sizes the page.
1074
+ *
1075
+ * Costs 1 credit per page.
1076
+ */
1077
+ async commentReplies(options) {
1078
+ return this.client._post("/api/v1/kuaishou/video/sub-comments", options);
1079
+ }
1080
+ /**
1081
+ * Several videos in one call, up to 20 photo ids (a hard cap - a longer
1082
+ * `photo_ids` array is rejected).
1083
+ *
1084
+ * Costs 40 credits per call, flat, whether you send 1 id or 20 - so batch
1085
+ * to the cap. For a single video `video()` costs 2.
1086
+ */
1087
+ async videosBatch(options) {
1088
+ return this.client._post("/api/v1/kuaishou/videos/batch", options);
920
1089
  }
1090
+ /**
1091
+ * Mixed-result search across Kuaishou. Advance with the previous response's
1092
+ * `next_cursor`.
1093
+ *
1094
+ * Costs 10 credits per page.
1095
+ */
921
1096
  async search(options) {
922
- return this.google.search(options);
1097
+ return this.client._post("/api/v1/kuaishou/search", options);
1098
+ }
1099
+ /**
1100
+ * Video search results. Advance with the previous response's `next_cursor`.
1101
+ *
1102
+ * Costs 10 credits per page.
1103
+ */
1104
+ async searchVideos(options) {
1105
+ return this.client._post("/api/v1/kuaishou/search/videos", options);
1106
+ }
1107
+ /**
1108
+ * User search results. Advance with the previous response's `next_cursor`.
1109
+ *
1110
+ * Costs 10 credits per page.
1111
+ */
1112
+ async searchUsers(options) {
1113
+ return this.client._post("/api/v1/kuaishou/search/users", options);
1114
+ }
1115
+ /**
1116
+ * Live-stream search results. Advance with the previous response's
1117
+ * `next_cursor`.
1118
+ *
1119
+ * Costs 10 credits per page.
1120
+ */
1121
+ async searchLive(options) {
1122
+ return this.client._post("/api/v1/kuaishou/search/live", options);
1123
+ }
1124
+ /**
1125
+ * Posts under a hashtag. Advance with the previous response's `next_cursor`.
1126
+ *
1127
+ * Costs 1 credit per page - the cheap way to pull volume, versus 10 for
1128
+ * `search()`.
1129
+ */
1130
+ async tagFeed(options) {
1131
+ return this.client._post("/api/v1/kuaishou/tag/feed", options);
1132
+ }
1133
+ /**
1134
+ * Leaderboards: hot, live, shopping, brand or music. Defaults to "hot".
1135
+ *
1136
+ * Costs 1 credit.
1137
+ */
1138
+ async trending(options = {}) {
1139
+ return this.client._post("/api/v1/kuaishou/trending", options);
1140
+ }
1141
+ };
1142
+
1143
+ // src/namespaces/ebay.ts
1144
+ var EbayNamespace = class {
1145
+ constructor(client) {
1146
+ this.client = client;
1147
+ }
1148
+ client;
1149
+ /**
1150
+ * Structured eBay listing results: price, condition, bids, shipping, seller,
1151
+ * feedback, plus `count` and `total_results`.
1152
+ *
1153
+ * Either `query` or `seller` is required. Set `sold: true` to search
1154
+ * completed listings that actually sold - on that view `total_results` is
1155
+ * always null because eBay publishes no headline count for it.
1156
+ *
1157
+ * Paged with `page`; `per_page` accepts only 60, 120 or 240 and silently
1158
+ * falls back to 60 for any other value.
1159
+ *
1160
+ * Costs 1 credit.
1161
+ */
1162
+ async search(options) {
1163
+ return this.client._post("/api/v1/ebay/search", options);
1164
+ }
1165
+ /**
1166
+ * One eBay listing in full: price, condition, images, item specifics,
1167
+ * shipping, returns, auction state and seller.
1168
+ *
1169
+ * Costs 1 credit. Single response, no pagination.
1170
+ */
1171
+ async product(options) {
1172
+ return this.client._post("/api/v1/ebay/product", options);
1173
+ }
1174
+ /**
1175
+ * A seller's profile card: store name, feedback score and percentage, items
1176
+ * sold, followers, location and categories.
1177
+ *
1178
+ * PROFILE ONLY - it cannot list what the seller is selling. For inventory,
1179
+ * call search({ seller }) with no query and page through it.
1180
+ *
1181
+ * Costs 1 credit. Single response, no pagination.
1182
+ */
1183
+ async seller(options) {
1184
+ return this.client._post("/api/v1/ebay/seller", options);
1185
+ }
1186
+ };
1187
+
1188
+ // src/namespaces/target.ts
1189
+ var TargetNamespace = class {
1190
+ constructor(client) {
1191
+ this.client = client;
1192
+ }
1193
+ client;
1194
+ /**
1195
+ * Search Target.com: prices, ratings, badges and promotions.
1196
+ *
1197
+ * Paged with `page` + `count` (1-28, default 24). `seller_id` and
1198
+ * `seller_name` are null on first-party rows, which means "sold by Target".
1199
+ *
1200
+ * Costs 1 credit. Typically ~9s - it runs through a headless browser.
1201
+ */
1202
+ async search(options) {
1203
+ return this.client._post("/api/v1/target/search", options);
1204
+ }
1205
+ /**
1206
+ * Products in a Target category: the same shape as search() plus the
1207
+ * category breadcrumb.
1208
+ *
1209
+ * Paged with `page` + `count` (1-28, default 24).
1210
+ *
1211
+ * Costs 1 credit. The slowest endpoint here at ~37s - set a generous client
1212
+ * timeout before calling it.
1213
+ */
1214
+ async category(options) {
1215
+ return this.client._post("/api/v1/target/category", options);
1216
+ }
1217
+ /**
1218
+ * Target product details by TCIN: price, rating, images, specifications,
1219
+ * variants, return policy and fulfillment.
1220
+ *
1221
+ * `store_id` is a real request param here - the price and availability you
1222
+ * get back are the store you asked for.
1223
+ *
1224
+ * Costs 1 credit. Typically ~4s. Single response, no pagination.
1225
+ */
1226
+ async product(options) {
1227
+ return this.client._post("/api/v1/target/product", options);
1228
+ }
1229
+ /**
1230
+ * Target reviews with the rating breakdown, per-attribute averages and
1231
+ * guest photos.
1232
+ *
1233
+ * Returns 8 review BODIES MAXIMUM regardless of the product's review_count.
1234
+ * `limit` only trims that set; there is no page or offset param, so the
1235
+ * aggregate distribution is the full-population signal here, not the bodies.
1236
+ *
1237
+ * Costs 1 credit. Typically ~40s.
1238
+ */
1239
+ async reviews(options) {
1240
+ return this.client._post("/api/v1/target/reviews", options);
1241
+ }
1242
+ };
1243
+
1244
+ // src/namespaces/home-depot.ts
1245
+ var HomeDepotNamespace = class {
1246
+ constructor(client) {
1247
+ this.client = client;
1248
+ }
1249
+ client;
1250
+ /**
1251
+ * Search Home Depot: price and promotions, brand and model, ratings,
1252
+ * badges, and per-store pickup/delivery.
1253
+ *
1254
+ * Page size is FIXED at 12 products and cannot be raised - page through
1255
+ * with `page` to read further.
1256
+ *
1257
+ * Costs 2 credits.
1258
+ */
1259
+ async search(options) {
1260
+ return this.client._post("/api/v1/homedepot/search", options);
1261
+ }
1262
+ /**
1263
+ * Full item detail: pricing and promotions, images and videos, the spec
1264
+ * table, dimensions, bullets, documents and return policy.
1265
+ *
1266
+ * Carries only a 10-review PREVIEW - reviews() is the paginated surface.
1267
+ * An unknown item id comes back as 404.
1268
+ *
1269
+ * Costs 2 credits. Single response, no pagination.
1270
+ */
1271
+ async product(options) {
1272
+ return this.client._post("/api/v1/homedepot/product", options);
1273
+ }
1274
+ /**
1275
+ * One page of full review bodies with the rating distribution,
1276
+ * per-attribute ratings, photos and seller responses.
1277
+ *
1278
+ * 30 reviews per page. `total_pages` is the last page that exists; a page
1279
+ * beyond it is a 404, not an empty result.
1280
+ *
1281
+ * Costs 2 credits.
1282
+ */
1283
+ async reviews(options) {
1284
+ return this.client._post("/api/v1/homedepot/reviews", options);
1285
+ }
1286
+ };
1287
+
1288
+ // src/namespaces/zillow.ts
1289
+ var ZillowNamespace = class {
1290
+ constructor(client) {
1291
+ this.client = client;
1292
+ }
1293
+ client;
1294
+ /**
1295
+ * Listings in a region: price, beds, baths, living area, Zestimate,
1296
+ * coordinates, images and days on market.
1297
+ *
1298
+ * Paged with `page`. A bare ZIP works alone but not alongside a filter or a
1299
+ * sort - use the city name when filtering. On listing_status "for_rent",
1300
+ * min_price / max_price are MONTHLY RENT. A region Zillow cannot resolve is
1301
+ * a 404, not an empty list.
1302
+ *
1303
+ * Costs 1 credit.
1304
+ */
1305
+ async search(options) {
1306
+ return this.client._post("/api/v1/zillow/search", options);
1307
+ }
1308
+ /**
1309
+ * Full listing detail: price and price history, Zestimate, tax history,
1310
+ * description, RESO facts, rooms, schools, open houses, photos and
1311
+ * attribution. Rental buildings return floor plans, amenities and unit
1312
+ * counts instead.
1313
+ *
1314
+ * Costs 1 credit. Single response, no pagination.
1315
+ */
1316
+ async property(options) {
1317
+ return this.client._post("/api/v1/zillow/property", options);
1318
+ }
1319
+ /**
1320
+ * An AGENT's profile and reviews: rating, review count, bodies with
1321
+ * sub-ratings, specialties, languages, licenses, service areas and sales
1322
+ * counts.
1323
+ *
1324
+ * This addresses an agent by screen name, NOT a property. Zillow
1325
+ * server-renders the first five reviews only: `count` is what came back,
1326
+ * `total_review_count` is what the agent actually has, and there is no way
1327
+ * to page to the rest.
1328
+ *
1329
+ * Costs 1 credit.
1330
+ */
1331
+ async agentReviews(options) {
1332
+ return this.client._post("/api/v1/zillow/reviews", options);
1333
+ }
1334
+ };
1335
+
1336
+ // src/namespaces/redfin.ts
1337
+ var RedfinNamespace = class {
1338
+ constructor(client) {
1339
+ this.client = client;
1340
+ }
1341
+ client;
1342
+ /**
1343
+ * Redfin listings: price, price per sqft, beds, baths, living area, lot
1344
+ * size, year built, coordinates, listing remarks and full photo galleries.
1345
+ *
1346
+ * Pass `location` (a redfin.com region URL or a bare ZIP - city NAMES are
1347
+ * not accepted) or `region_id` AND `region_type` together. Paged with
1348
+ * `page` + `limit`, up to 350 listings per page.
1349
+ *
1350
+ * `days_on_market` comes back NULL on every row: Redfin's mainHouseInfo has
1351
+ * no `dom` key. Fractional numeric filters are rejected, not rounded.
1352
+ * `sold_within_days` requires `listing_status: "sold"`, and
1353
+ * `max_days_on_market` / `min_days_on_market` cannot be combined.
1354
+ *
1355
+ * Costs 1 credit.
1356
+ */
1357
+ async search(options) {
1358
+ return this.client._post("/api/v1/redfin/search", options);
1359
+ }
1360
+ /**
1361
+ * One Redfin listing in full: price, Redfin Estimate and rental estimate,
1362
+ * complete MLS fact sheet, price and tax history, listing agents, open
1363
+ * houses, schools, climate risk, walkability and location scores, sun
1364
+ * exposure, monthly weather, permits, zoning, comparable sales and photos.
1365
+ *
1366
+ * Reads the property PAGE, whose inlined request cache replaces the ~40
1367
+ * upstream calls that page made - which is why it is the same price as
1368
+ * search().
1369
+ *
1370
+ * Costs 1 credit. Single response, no pagination.
1371
+ */
1372
+ async property(options) {
1373
+ return this.client._post("/api/v1/redfin/property", options);
1374
+ }
1375
+ /**
1376
+ * Housing-market stats for a region: median list and sale price, price per
1377
+ * sqft, sale-to-list ratio, average offers and days on market, YoY
1378
+ * movement, Redfin's 0-100 compete score, live inventory by property type,
1379
+ * median price and active listings per bedroom count, plus Redfin agent
1380
+ * presence and aggregate rating.
1381
+ *
1382
+ * Pass `location` (city NAMES are not accepted) or `region_id` AND
1383
+ * `region_type` together.
1384
+ *
1385
+ * Costs 1 credit. Single response, no pagination.
1386
+ */
1387
+ async market(options) {
1388
+ return this.client._post("/api/v1/redfin/market", options);
1389
+ }
1390
+ };
1391
+
1392
+ // src/namespaces/booking.ts
1393
+ var BookingNamespace = class {
1394
+ constructor(client) {
1395
+ this.client = client;
1396
+ }
1397
+ client;
1398
+ /**
1399
+ * Search Booking.com properties for a destination and stay: live nightly
1400
+ * price, review score, star rating, location, room type and deal badges.
1401
+ *
1402
+ * Either `destination` or `dest_id` is required - without one the request
1403
+ * would land on Booking's homepage, so it is rejected instead of billed.
1404
+ * `dest_type` requires `dest_id`.
1405
+ *
1406
+ * Paged with `page`, 25 properties per page. `checkin` and `checkout` must
1407
+ * be sent together or Booking prices a range of its own choosing.
1408
+ *
1409
+ * Each row carries a `url` - chain it into hotel() rather than rebuilding a
1410
+ * slug, which risks a BILLED 404 on the wrong `country_code`.
1411
+ *
1412
+ * Costs 1 credit.
1413
+ */
1414
+ async search(options) {
1415
+ return this.client._post("/api/v1/booking/search", options);
1416
+ }
1417
+ /**
1418
+ * One Booking.com property in full: rooms and rate plans, facilities, house
1419
+ * rules, check-in windows, policies, images, location and review scores -
1420
+ * priced for the stay you ask for.
1421
+ *
1422
+ * Takes dates because Booking prices a STAY. Omit them and the response
1423
+ * carries prices for a two-night window Booking picked; the response echoes
1424
+ * whichever dates were used.
1425
+ *
1426
+ * Single response, no pagination.
1427
+ *
1428
+ * Costs 1 credit.
1429
+ */
1430
+ async hotel(options) {
1431
+ return this.client._post("/api/v1/booking/hotel", options);
1432
+ }
1433
+ /**
1434
+ * Booking.com guest reviews with the score breakdown by category and
1435
+ * Booking's own praise/complaint summary.
1436
+ *
1437
+ * NO PAGE PARAM - do not invent one. `total_count` is the property's whole
1438
+ * review history; `count` is what this response holds.
1439
+ *
1440
+ * Costs 1 credit.
1441
+ */
1442
+ async reviews(options) {
1443
+ return this.client._post("/api/v1/booking/reviews", options);
1444
+ }
1445
+ };
1446
+
1447
+ // src/namespaces/airbnb.ts
1448
+ var AirbnbNamespace = class {
1449
+ constructor(client) {
1450
+ this.client = client;
1451
+ }
1452
+ client;
1453
+ /**
1454
+ * Search Airbnb stays: stay-total and per-night price with the full
1455
+ * discount ledger, rating and review count, bedrooms/beds/baths,
1456
+ * coordinates, badges, images and `dates_are_defaulted`.
1457
+ *
1458
+ * This is the ONLY endpoint that carries a price - listing() has no nightly
1459
+ * rate field at all.
1460
+ *
1461
+ * Paged with `page` (18 listings per page) XOR `cursor`; `cursor` wins, so
1462
+ * sending both is rejected. `min_price` / `max_price` are WHOLE-STAY totals,
1463
+ * not per night.
1464
+ *
1465
+ * Pass `check_in` + `check_out` together whenever price matters: a dateless
1466
+ * search defaults to +30 days / 5 nights and A/Bs both the window and the
1467
+ * prices, which the response flags as `dates_are_defaulted`.
1468
+ *
1469
+ * Costs 1 credit.
1470
+ */
1471
+ async search(options) {
1472
+ return this.client._post("/api/v1/airbnb/search", options);
1473
+ }
1474
+ /**
1475
+ * One Airbnb listing in full: description, property and room type, capacity
1476
+ * and room counts, the complete grouped amenity list (including the
1477
+ * amenities the place does NOT have), host profile and stats, house rules
1478
+ * with parsed check-in/out times, cancellation policy, sleeping
1479
+ * arrangements, photo tour, every image, and the RATING BREAKDOWN - six
1480
+ * category ratings, the five-bucket star distribution and Airbnb's
1481
+ * AI-synthesised review tags.
1482
+ *
1483
+ * NO NIGHTLY PRICE. The room page carries no rate under any parameters,
1484
+ * with or without dates. Prices come from search() only.
1485
+ *
1486
+ * Single response, no pagination.
1487
+ *
1488
+ * Costs 1 credit.
1489
+ */
1490
+ async listing(options) {
1491
+ return this.client._post("/api/v1/airbnb/listing", options);
1492
+ }
1493
+ /**
1494
+ * Airbnb review BODIES with per-review rating, date, and reviewer name,
1495
+ * photo and location.
1496
+ *
1497
+ * Paged with `limit` (1-50, default 30) + `offset`. Send `limit`
1498
+ * explicitly - upstream returns a fixed 7 rows when none is given.
1499
+ *
1500
+ * `count` is the listing's TOTAL review count; `returned` is how many rows
1501
+ * this page holds. The rating breakdown is NOT here - it lives on
1502
+ * listing().
1503
+ *
1504
+ * Costs 1 credit.
1505
+ */
1506
+ async reviews(options) {
1507
+ return this.client._post("/api/v1/airbnb/reviews", options);
1508
+ }
1509
+ };
1510
+
1511
+ // src/namespaces/tripadvisor.ts
1512
+ var TripadvisorNamespace = class {
1513
+ constructor(client) {
1514
+ this.client = client;
1515
+ }
1516
+ client;
1517
+ /**
1518
+ * START HERE. Resolve a place or business NAME to the Tripadvisor
1519
+ * geo_id / location_id pairs every other endpoint needs.
1520
+ *
1521
+ * A GEO row answers `geo_id` for search(); a business row answers the
1522
+ * `geo_id` + `location_id` pair location() and reviews() take. Those ids
1523
+ * exist only inside Tripadvisor's own URLs, so this is the only entry point
1524
+ * from a name.
1525
+ *
1526
+ * `limit` (1-20, default 12) sizes the response; there is no pagination.
1527
+ *
1528
+ * Costs 2 credits.
1529
+ */
1530
+ async locations(options) {
1531
+ return this.client._post("/api/v1/tripadvisor/locations", options);
1532
+ }
1533
+ /**
1534
+ * Restaurants, hotels or attractions in a Tripadvisor geo, Tripadvisor-
1535
+ * ranked: rating, review count, price band, address, coordinates, phone,
1536
+ * hours and Travelers' Choice badge. Each row carries the location_id +
1537
+ * geo_id pair the detail endpoints take.
1538
+ *
1539
+ * `geo_id` or `url` is required - get `geo_id` from locations().
1540
+ *
1541
+ * Paged with `page`, 30 locations per page. A page beyond the last is a
1542
+ * 404, not an empty result.
1543
+ *
1544
+ * Costs 2 credits.
1545
+ */
1546
+ async search(options) {
1547
+ return this.client._post("/api/v1/tripadvisor/search", options);
1548
+ }
1549
+ /**
1550
+ * One Tripadvisor location in full: rating, review histogram and per-aspect
1551
+ * sub-ratings, city ranking, price band, cuisines, amenities, address,
1552
+ * coordinates, contact, photos, and the FIRST PAGE OF REVIEWS.
1553
+ *
1554
+ * `location_id` or `url` is required, and the transport additionally
1555
+ * requires a geo when a bare d-id is sent.
1556
+ *
1557
+ * Page 1 of the reviews is already here - call reviews() only to page PAST
1558
+ * it. An unknown location id is a 404 (upstream answers a billed city
1559
+ * listing that the transport restates).
1560
+ *
1561
+ * Costs 2 credits.
1562
+ */
1563
+ async location(options) {
1564
+ return this.client._post("/api/v1/tripadvisor/location", options);
1565
+ }
1566
+ /**
1567
+ * A page of Tripadvisor reviews: rating, trip date and type, reviewer home
1568
+ * town and contribution count, and any management response.
1569
+ *
1570
+ * `location_id` or `url` is required. Page size follows `category` - 15 per
1571
+ * page for restaurants, 10 for hotels and attractions - so keep it matched
1572
+ * to the location's own type on any page past the first.
1573
+ *
1574
+ * Consecutive pages can REPEAT one review at the boundary; de-duplicate on
1575
+ * review_id when concatenating.
1576
+ *
1577
+ * Costs 2 credits.
1578
+ */
1579
+ async reviews(options) {
1580
+ return this.client._post("/api/v1/tripadvisor/reviews", options);
1581
+ }
1582
+ };
1583
+
1584
+ // src/namespaces/yelp.ts
1585
+ var YelpNamespace = class {
1586
+ constructor(client) {
1587
+ this.client = client;
1588
+ }
1589
+ client;
1590
+ /**
1591
+ * Businesses in Yelp's ranked order: rating, review count, price band,
1592
+ * categories, address, contact rails, hours, photos and a review snippet.
1593
+ * Each row carries both business_id and alias, either of which addresses
1594
+ * business(). `count` is the 10-row page, `total_results` is Yelp's headline
1595
+ * count.
1596
+ *
1597
+ * `term` + `location` or `url` is required, and `location` is effectively
1598
+ * mandatory - Yelp geolocates a location-less search off the proxy exit.
1599
+ * Paged with `page`; the page size is fixed at 10.
1600
+ *
1601
+ * Costs 2 credits.
1602
+ */
1603
+ async search(options) {
1604
+ return this.client._post("/api/v1/yelp/search", options);
1605
+ }
1606
+ /**
1607
+ * One business in full: rating and per-star histogram, review count, price
1608
+ * band, categories, address and coordinates, phone, website and menu links,
1609
+ * hours and holidays, amenities, photos and videos, popular items, health
1610
+ * inspections, Q&A, licences and claim status - PLUS the first page of
1611
+ * reviews at no extra cost.
1612
+ *
1613
+ * Because those reviews ride along, calling reviews({ page: 1 }) after this
1614
+ * buys the same document twice. Yelp's recommendation software hides some
1615
+ * reviews entirely; those are never returned and are counted in
1616
+ * not_recommended_review_count here. popular_items rows can arrive as stub
1617
+ * shells with every field null but `identifier` - those are dropped and
1618
+ * popular_items_omitted flags it.
1619
+ *
1620
+ * `business_id` or `url` is required. Costs 2 credits. Single response, no
1621
+ * pagination.
1622
+ */
1623
+ async business(options) {
1624
+ return this.client._post("/api/v1/yelp/business", options);
1625
+ }
1626
+ /**
1627
+ * A page of reviews: rating, full text, language, author profile and
1628
+ * expertise counts, attached photos, reaction counts and owner response.
1629
+ *
1630
+ * START AT PAGE 2 - page 1 re-fetches the document business() already
1631
+ * returned and costs another 2 credits. 10 reviews per page, and a page past
1632
+ * the last review is a 404, not an empty result. `rating` changes
1633
+ * filtered_review_count, not review_count.
1634
+ *
1635
+ * `business_id` or `url` is required. Costs 2 credits.
1636
+ */
1637
+ async reviews(options) {
1638
+ return this.client._post("/api/v1/yelp/reviews", options);
1639
+ }
1640
+ };
1641
+
1642
+ // src/namespaces/indeed.ts
1643
+ var IndeedNamespace = class {
1644
+ constructor(client) {
1645
+ this.client = client;
1646
+ }
1647
+ client;
1648
+ /**
1649
+ * Search Indeed job postings: title, employer, rating, location, salary
1650
+ * range, job type, benefits, posting age and apply route.
1651
+ *
1652
+ * Either `query` or `location` is required; a location-only search is valid
1653
+ * and returns every posting in the metro.
1654
+ *
1655
+ * Paged with `page`, 10 postings per page. `radius` and `max_age_days` are
1656
+ * closed sets - Indeed silently ignores an off-list value and bills the
1657
+ * unfiltered search. `min_salary` filters on Indeed's own ESTIMATE for the
1658
+ * role, not a posted figure.
1659
+ *
1660
+ * Costs 2 credits.
1661
+ */
1662
+ async search(options) {
1663
+ return this.client._post("/api/v1/indeed/search", options);
1664
+ }
1665
+ /**
1666
+ * One Indeed posting in full: description text and HTML, structured salary,
1667
+ * employment types, benefits, geocoded address, employer rating, applicant
1668
+ * count and the original ATS link.
1669
+ *
1670
+ * Single response, no pagination. An unknown job key is a real 404 that
1671
+ * scrape.do BILLS - take `job_id` from a search row.
1672
+ *
1673
+ * Costs 2 credits.
1674
+ */
1675
+ async job(options) {
1676
+ return this.client._post("/api/v1/indeed/job", options);
1677
+ }
1678
+ /**
1679
+ * Indeed employer profile: description, industry, HQ, size, revenue, CEO
1680
+ * approval, overall and per-category ratings, reported salaries, open roles
1681
+ * and locations.
1682
+ *
1683
+ * Single response, no pagination. An unknown company slug is a real 404
1684
+ * that scrape.do BILLS.
1685
+ *
1686
+ * Costs 2 credits.
1687
+ */
1688
+ async company(options) {
1689
+ return this.client._post("/api/v1/indeed/company", options);
1690
+ }
1691
+ /**
1692
+ * Indeed employee reviews with per-category ratings, pros/cons, reviewer
1693
+ * job title and location, plus aggregated sentiment and topic / location /
1694
+ * job-title breakdowns.
1695
+ *
1696
+ * Paged with `page`, 20 reviews per page.
1697
+ *
1698
+ * Costs 2 credits.
1699
+ */
1700
+ async companyReviews(options) {
1701
+ return this.client._post("/api/v1/indeed/company/reviews", options);
1702
+ }
1703
+ };
1704
+
1705
+ // src/namespaces/glassdoor.ts
1706
+ var GlassdoorNamespace = class {
1707
+ constructor(client) {
1708
+ this.client = client;
1709
+ }
1710
+ client;
1711
+ /**
1712
+ * START HERE. Search Glassdoor for a company by NAME and resolve it to the
1713
+ * employer_id every other method needs, ranked by Glassdoor and
1714
+ * de-duplicated.
1715
+ *
1716
+ * company(), reviews() and salaries() all key off an employer_id that exists
1717
+ * only inside Glassdoor's /Overview/ URLs, so this lookup is the entry
1718
+ * point.
1719
+ *
1720
+ * Costs 1 credit. Single response, no pagination.
1721
+ */
1722
+ async companies(options) {
1723
+ return this.client._post("/api/v1/glassdoor/companies", options);
1724
+ }
1725
+ /**
1726
+ * Employer profile: description, mission, industry, sector, HQ, size band,
1727
+ * revenue band, stock symbol, year founded, overall and per-category
1728
+ * ratings, star distribution, CEO approval, awards, FAQ, the five
1729
+ * server-rendered reviews, AND reviews_url / salaries_url.
1730
+ *
1731
+ * THE CHAINING ENDPOINT: pass reviews_url / salaries_url back as `url` on
1732
+ * reviews() and salaries() to halve the upstream fetches. `employer_id` or
1733
+ * `url` is required - `company` is cosmetic and does not satisfy it.
1734
+ *
1735
+ * Costs 1 credit. Single response, no pagination. Typically ~3-47s.
1736
+ */
1737
+ async company(options) {
1738
+ return this.client._post("/api/v1/glassdoor/company", options);
1739
+ }
1740
+ /**
1741
+ * Full reviews with per-axis scores, pros, cons, advice, job title,
1742
+ * location, employment status and employer response - plus complete rating
1743
+ * statistics, star distribution, aggregate pro/con highlight terms and
1744
+ * per-job-title review counts.
1745
+ *
1746
+ * HARD CAP OF THREE REVIEW BODIES per response: that is Glassdoor's login
1747
+ * wall, not a limit option. There is deliberately NO `page` param. Move the
1748
+ * window with `category` and `employment_status` and read
1749
+ * filtered_review_count to see how many match; the aggregate statistics are
1750
+ * the full-population signal here, not the bodies.
1751
+ *
1752
+ * `employer_id` or `url` is required. Costs 1 credit. Typically ~75s.
1753
+ */
1754
+ async reviews(options) {
1755
+ return this.client._post("/api/v1/glassdoor/reviews", options);
1756
+ }
1757
+ /**
1758
+ * Salaries by job title: base-pay and total-pay percentiles P10-P90 with
1759
+ * medians called out, sample counts, currency, pay period and last-reported
1760
+ * date.
1761
+ *
1762
+ * These are Glassdoor's ESTIMATES for the title, not individual reported
1763
+ * salaries. Paged with `page` at 10 job titles per page; `page_count` on the
1764
+ * response is how many pages exist.
1765
+ *
1766
+ * `employer_id` or `url` is required. Costs 1 credit. Typically ~41s.
1767
+ */
1768
+ async salaries(options) {
1769
+ return this.client._post("/api/v1/glassdoor/salaries", options);
1770
+ }
1771
+ };
1772
+
1773
+ // src/namespaces/app-store.ts
1774
+ var AppStoreNamespace = class {
1775
+ constructor(client) {
1776
+ this.client = client;
1777
+ }
1778
+ client;
1779
+ /**
1780
+ * Up to 200 fully-shaped App Store apps - the same 43-field row as app() -
1781
+ * which makes this a bulk metadata fetch as well as a search, and a
1782
+ * publisher lookup when the term is a developer name.
1783
+ *
1784
+ * NO PAGINATION. `limit` (1-200, default 25) is the only lever on volume;
1785
+ * every offset spelling is silently ignored. Mac rows carry no iPad or Apple
1786
+ * TV screenshots, advisories, features, supported devices or Game Center
1787
+ * flag.
1788
+ *
1789
+ * Costs 1 credit.
1790
+ */
1791
+ async search(options) {
1792
+ return this.client._post("/api/v1/appstore/search", options);
1793
+ }
1794
+ /**
1795
+ * Full listing: title, description, developer and seller identity, price and
1796
+ * currency, all-time and current-version ratings, version and release notes,
1797
+ * genres, content rating and advisories, icons at three sizes, screenshots,
1798
+ * download size, minimum OS, languages, supported devices, Game Center and
1799
+ * VPP flags.
1800
+ *
1801
+ * Takes a numeric App Store id or a bundle id interchangeably. An id Apple
1802
+ * cannot resolve is a BILLED 404 - Apple charges for the empty result list.
1803
+ *
1804
+ * Costs 1 credit. Single response, no pagination.
1805
+ */
1806
+ async app(options) {
1807
+ return this.client._post("/api/v1/appstore/app", options);
1808
+ }
1809
+ /**
1810
+ * A page of reviews: star rating, title, full text, author, and the APP
1811
+ * VERSION the review was written against.
1812
+ *
1813
+ * NUMERIC APP IDS ONLY here. Paged 1-10 at 50 reviews each and hard-stopped
1814
+ * at page 10 - 500 reviews per storefront is Apple's anonymous ceiling, so
1815
+ * ask a different `country` to reach further. This endpoint CANNOT 404: an
1816
+ * unknown id and a real app with zero reviews return the same empty feed.
1817
+ * Under sort "most_recent" the vote fields are zeroes.
1818
+ *
1819
+ * Costs 1 credit.
1820
+ */
1821
+ async reviews(options) {
1822
+ return this.client._post("/api/v1/appstore/reviews", options);
1823
+ }
1824
+ };
1825
+
1826
+ // src/namespaces/google-play.ts
1827
+ var GooglePlayNamespace = class {
1828
+ constructor(client) {
1829
+ this.client = client;
1830
+ }
1831
+ client;
1832
+ /**
1833
+ * Ranked apps: package name, title, developer, rating, install count, price
1834
+ * and IAP range, content rating, icon and screenshots. A branded query
1835
+ * returns the hero card as result 1 projected to the same row shape, plus
1836
+ * Play's related-query rail.
1837
+ *
1838
+ * NO PAGINATION - one shelf of ~30 apps, with no page or cursor param.
1839
+ * `hl` moves the whole storefront, not just the language of the strings.
1840
+ *
1841
+ * Costs 2 credits.
1842
+ */
1843
+ async search(options) {
1844
+ return this.client._post("/api/v1/googleplay/search", options);
1845
+ }
1846
+ /**
1847
+ * Full store listing: installs including the REAL count Play publishes but
1848
+ * never renders, rating and star histogram, description, developer identity
1849
+ * and legal contact, price and IAPs, categories and gameplay tags,
1850
+ * screenshots and trailer, version and Android requirement, release and
1851
+ * update dates, changelog, full permission tree, Data safety table, the 20
1852
+ * server-rendered reviews, and the similar-apps and more-by-developer rails.
1853
+ *
1854
+ * Those 20 reviews ride along at no extra cost - use reviews() only to page
1855
+ * past them or to sort differently.
1856
+ *
1857
+ * Costs 2 credits. Single response, no pagination.
1858
+ */
1859
+ async app(options) {
1860
+ return this.client._post("/api/v1/googleplay/app", options);
1861
+ }
1862
+ /**
1863
+ * A page of reviews: star score, full text, author, thumbs-up count,
1864
+ * developer reply, and the APP VERSION the reviewer was running.
1865
+ *
1866
+ * Paged with `cursor` -> next_cursor. The cursor is opaque and SINGLE-USE
1867
+ * and encodes the sort as well as the position, so send it back with the
1868
+ * same `sort` it came from; a cursor past the last review is a 404, not an
1869
+ * empty page. `count` is capped at 200. An empty payload here is a BILLED
1870
+ * 404 - the premium price is paid to learn the package has no reviews or
1871
+ * does not exist.
1872
+ *
1873
+ * Costs 2 credits.
1874
+ */
1875
+ async reviews(options) {
1876
+ return this.client._post("/api/v1/googleplay/reviews", options);
1877
+ }
1878
+ };
1879
+
1880
+ // src/namespaces/g2.ts
1881
+ var G2Namespace = class {
1882
+ constructor(client) {
1883
+ this.client = client;
1884
+ }
1885
+ client;
1886
+ /**
1887
+ * Ranked B2B software products on G2: star rating, review count, vendor,
1888
+ * categories, seller description and logo. Every row carries `product_id`
1889
+ * and `slug` to feed product() and reviews().
1890
+ *
1891
+ * Paged with `page` and `limit` (1-100, default 20). `total_results` is
1892
+ * G2's Products-tab headline and is CAPPED AT 10000, so treat a 10000 as a
1893
+ * floor rather than a count; `total_by_type` breaks the same query across
1894
+ * products, sellers, categories and discussions.
1895
+ *
1896
+ * Pass `query` or `url`.
1897
+ *
1898
+ * Costs 5 credits.
1899
+ */
1900
+ async search(options) {
1901
+ return this.client._post("/api/v1/g2/search", options);
1902
+ }
1903
+ /**
1904
+ * A full G2 software profile: rating with per-star histogram, review count,
1905
+ * vendor, description and seller website, pricing editions with parsed
1906
+ * amounts, feature groups, categories and breadcrumbs, supported languages,
1907
+ * integrations, alternatives, head-to-head comparisons, media, community
1908
+ * discussions and G2's AI-derived pros and cons.
1909
+ *
1910
+ * CARRIES NO REVIEW TEXT. G2 loads review bodies in a separate frame, so
1911
+ * this endpoint returns none at all - call reviews() for text.
1912
+ *
1913
+ * Pass `product_id` (slug or numeric id as a string) or `url`.
1914
+ *
1915
+ * Costs 5 credits. Single response, no pagination.
1916
+ */
1917
+ async product(options) {
1918
+ return this.client._post("/api/v1/g2/product", options);
1919
+ }
1920
+ /**
1921
+ * A page of G2 reviews: rating, title, likes and dislikes, problems solved,
1922
+ * reviewer job title, industry and company size, validated and incentivized
1923
+ * flags - PLUS what the profile page has no form of: exact per-star counts,
1924
+ * pros and cons with per-theme counts, and company-size / role / industry /
1925
+ * region / category facets with counts.
1926
+ *
1927
+ * Fixed at 10 reviews per page; advance with `page`. This paginates well
1928
+ * past the 10 pages G2's own widget links to.
1929
+ *
1930
+ * `rating` buckets are HALF-STAR-INCLUSIVE (1 returns 0, 0.5 and 1-star).
1931
+ * Every filter is a closed enum because an unrecognised value matches
1932
+ * nothing upstream and comes back as an empty, plausible-looking result set.
1933
+ *
1934
+ * Pass `product_id` or `url`.
1935
+ *
1936
+ * Costs 5 credits.
1937
+ */
1938
+ async reviews(options) {
1939
+ return this.client._post("/api/v1/g2/reviews", options);
1940
+ }
1941
+ };
1942
+
1943
+ // src/namespaces/capterra.ts
1944
+ var CapterraNamespace = class {
1945
+ constructor(client) {
1946
+ this.client = client;
1947
+ }
1948
+ client;
1949
+ /**
1950
+ * 20 ranked Capterra software products: name, vendor description, rating,
1951
+ * review count, logo and the paid-placement flag. Every row carries
1952
+ * `product_id` and `slug` to feed product() and reviews().
1953
+ *
1954
+ * NO PAGINATION. Capterra fixes the result set at 20 and page 2 returns the
1955
+ * identical rows, so there is deliberately no page param - narrow the query
1956
+ * instead.
1957
+ *
1958
+ * Pass `query` or `url`.
1959
+ *
1960
+ * Costs 2 credits.
1961
+ */
1962
+ async search(options) {
1963
+ return this.client._post("/api/v1/capterra/search", options);
1964
+ }
1965
+ /**
1966
+ * A full Capterra profile: rating with per-star histogram and the four
1967
+ * scored criteria, likelihood to recommend, review sentiment and topics, the
1968
+ * complete pricing table with every plan and its features, every rated
1969
+ * feature, every integration, AI-derived pros and cons with the quoted
1970
+ * review, FAQs, screenshots, badges and awards, competitor comparisons and
1971
+ * alternatives, and the buyer profile by company size / industry / job
1972
+ * function - PLUS the 25 most recent reviews, which ride along at no extra
1973
+ * cost.
1974
+ *
1975
+ * `vendor` IS ALWAYS NULL here: Capterra does not publish it as structured
1976
+ * data on the product page. The reviews name the vendor per review.
1977
+ *
1978
+ * Pass `product_id` (a string) or `url`. `slug` is cosmetic on this
1979
+ * endpoint.
1980
+ *
1981
+ * Costs 2 credits. Single response, no pagination.
1982
+ */
1983
+ async product(options) {
1984
+ return this.client._post("/api/v1/capterra/product", options);
1985
+ }
1986
+ /**
1987
+ * A page of Capterra reviews: overall score plus five per-criterion scores,
1988
+ * title, pros, cons, advice, usage duration, incentivized flag, alternatives
1989
+ * considered and what the reviewer switched from, reviewer job title /
1990
+ * industry / company size, and the vendor response - plus a richer
1991
+ * competitor list than the profile carries, each alternative with its own
1992
+ * rating histogram and starting price.
1993
+ *
1994
+ * 25 reviews per page, CAPPED AT PAGE 100. Past it Capterra answers 200 with
1995
+ * PAGE ONE and the page quietly dropped from the canonical, so nothing
1996
+ * signals the cap but repeated rows. Page 1 is already inside product(), so
1997
+ * use this to page past it.
1998
+ *
1999
+ * Pass `product_id` or `url`. `slug` is load-bearing here and case-sensitive
2000
+ * upstream - a wrong one silently serves page one.
2001
+ *
2002
+ * Costs 2 credits.
2003
+ */
2004
+ async reviews(options) {
2005
+ return this.client._post("/api/v1/capterra/reviews", options);
2006
+ }
2007
+ };
2008
+
2009
+ // src/namespaces/sec.ts
2010
+ var SECNamespace = class {
2011
+ constructor(client) {
2012
+ this.client = client;
2013
+ }
2014
+ client;
2015
+ /**
2016
+ * START HERE. Resolves a company name or ticker to the CIK every other SEC
2017
+ * EDGAR endpoint is keyed by: matching filers with symbol, listing
2018
+ * exchange, and ready-made submissions / company-facts / EDGAR URLs, tiered
2019
+ * by match quality (each row carries its tier as `match`).
2020
+ *
2021
+ * `limit` sizes the response; there is no pagination. `exchange` is a
2022
+ * closed set matched case-insensitively, and filers listed with no exchange
2023
+ * are excluded by ANY value.
2024
+ *
2025
+ * Costs 1 credit.
2026
+ */
2027
+ async lookup(options) {
2028
+ return this.client._post("/api/v1/sec/lookup", options);
2029
+ }
2030
+ /**
2031
+ * Filer profile: legal and former names, SIC industry, filer category, EIN,
2032
+ * LEI, state of incorporation, fiscal year end, business and mailing
2033
+ * addresses, every ticker with its exchange, which forms it files and how
2034
+ * often, plus a preview of its 10 most recent filings.
2035
+ *
2036
+ * Either `cik` or `ticker` is required; `ticker` wins when both are given.
2037
+ *
2038
+ * Costs 1 credit. Single response, no pagination.
2039
+ */
2040
+ async company(options) {
2041
+ return this.client._post("/api/v1/sec/company", options);
2042
+ }
2043
+ /**
2044
+ * A page of one filer's filings: accession number, form and root form,
2045
+ * filing and period dates, 8-K item codes, and direct links to the primary
2046
+ * document, filing index and attachment directory.
2047
+ *
2048
+ * Either `cik` or `ticker` is required. Paged with `page` + `limit`.
2049
+ * `form` matches the form AND its root form, so "10-K" also returns 10-K/A.
2050
+ * EDGAR's "recent" block is not a fixed window - a decade for a quiet
2051
+ * filer, about a year for a prolific one; `include_history` reaches back
2052
+ * through up to 10 archived shards and sets `history_truncated` when the
2053
+ * filer had more.
2054
+ *
2055
+ * Costs 1 credit - including with `include_history`, which is the one call
2056
+ * that can buy more than one upstream fetch.
2057
+ */
2058
+ async filings(options) {
2059
+ return this.client._post("/api/v1/sec/filings", options);
2060
+ }
2061
+ /**
2062
+ * Every value a filer reported for one XBRL concept, newest period first,
2063
+ * with the form and filing each number came from. Restatements are KEPT,
2064
+ * not collapsed; `latest` disambiguates a quarter from its year-to-date
2065
+ * twin using the SEC's comparability flag.
2066
+ *
2067
+ * Either `cik` or `ticker` is required. The `concept` tag is CASE-SENSITIVE
2068
+ * - "netincomeloss" is a 404 upstream, not a match; call facts() to find
2069
+ * the real tag. `form` is an EXACT match here, so "10-K" excludes 10-K/A.
2070
+ * `limit` sizes the response; there is no pagination.
2071
+ *
2072
+ * Costs 1 credit.
2073
+ */
2074
+ async concept(options) {
2075
+ return this.client._post("/api/v1/sec/concept", options);
2076
+ }
2077
+ /**
2078
+ * The index of every XBRL concept a filer reports - tag, label,
2079
+ * description, units and most recent value - across us-gaap, dei and any
2080
+ * other taxonomy it uses. This is how you find what to ask concept() for.
2081
+ *
2082
+ * Either `cik` or `ticker` is required. `limit` sizes the response; there
2083
+ * is no pagination.
2084
+ *
2085
+ * Costs 1 credit.
2086
+ */
2087
+ async facts(options) {
2088
+ return this.client._post("/api/v1/sec/facts", options);
2089
+ }
2090
+ /**
2091
+ * EDGAR full-text search: each hit is the matching DOCUMENT with its URL,
2092
+ * form, filing date and filer identity, plus facets breaking the whole
2093
+ * result set down by company, form, industry and state.
2094
+ *
2095
+ * Coverage STARTS IN 2001 - nothing earlier is indexed. Accepts NO query at
2096
+ * all: a cik, ticker, form or date filter on its own is a valid search.
2097
+ * Paged with `page`, capped at 100 (100 documents per page) because the
2098
+ * index refuses a result window past 10,000.
2099
+ *
2100
+ * Costs 1 credit.
2101
+ */
2102
+ async search(options) {
2103
+ return this.client._post("/api/v1/sec/search", options);
2104
+ }
2105
+ };
2106
+
2107
+ // src/namespaces/companies-house.ts
2108
+ var CompaniesHouseNamespace = class {
2109
+ constructor(client) {
2110
+ this.client = client;
2111
+ }
2112
+ client;
2113
+ /**
2114
+ * START HERE. Searches the UK register by name and returns the
2115
+ * `company_number` every other endpoint is keyed by, plus name, status,
2116
+ * incorporation or dissolution date, registered office address and matched
2117
+ * former names.
2118
+ *
2119
+ * Matches CURRENT AND FORMER names. Paged with `page`, 20 results per page,
2120
+ * CAPPED AT PAGE 50 - the register serves a 1000-result window per term
2121
+ * whatever hit count it prints, and answers page 51 with HTTP 416.
2122
+ *
2123
+ * Costs 1 credit.
2124
+ */
2125
+ async search(options) {
2126
+ return this.client._post("/api/v1/companieshouse/search", options);
2127
+ }
2128
+ /**
2129
+ * Full register entry: status, type, incorporation and dissolution dates,
2130
+ * registered office, SIC codes, previous names, accounts and
2131
+ * confirmation-statement due dates with overdue flags, and whether it has
2132
+ * charges, insolvency history, officers or UK establishments. FC companies
2133
+ * return home registry / legal form / governing law, BR returns the parent,
2134
+ * CE returns the charity number.
2135
+ *
2136
+ * `company_number` is zero-padded and upper-cased for you, so a number off
2137
+ * a letterhead or out of a spreadsheet that ate its leading zeros still
2138
+ * resolves.
2139
+ *
2140
+ * Costs 1 credit. Single response, no pagination.
2141
+ */
2142
+ async company(options) {
2143
+ return this.client._post("/api/v1/companieshouse/company", options);
2144
+ }
2145
+ /**
2146
+ * Officers current and resigned: name, role, appointment and resignation
2147
+ * dates, correspondence address, nationality, country of residence,
2148
+ * month-and-year date of birth, and identity-verification status.
2149
+ *
2150
+ * Paged with `page`, 35 officers per page, NO upper bound - past the last
2151
+ * page the register answers an ordinary 200 with an empty list, identical
2152
+ * to a company with no officers.
2153
+ *
2154
+ * `officers_count` is EVERY appointment ever made and `resignations_count`
2155
+ * how many ended, so the active count is the difference. There is no
2156
+ * server-side active/resigned filter - filter on each officer's `status` in
2157
+ * the response.
2158
+ *
2159
+ * Costs 1 credit.
2160
+ */
2161
+ async officers(options) {
2162
+ return this.client._post("/api/v1/companieshouse/officers", options);
2163
+ }
2164
+ /**
2165
+ * Filings, most recent first: date, filing type code (AA, CS01, SH03),
2166
+ * description, register annotations and child documents, and a link to the
2167
+ * filed PDF with its page count.
2168
+ *
2169
+ * A filing the register has not finished processing carries a
2170
+ * `processing_note` instead of a document.
2171
+ *
2172
+ * Paged with `page`, NO upper bound - past the last page it is an ordinary
2173
+ * 200 with an empty list.
2174
+ *
2175
+ * Costs 1 credit.
2176
+ */
2177
+ async filingHistory(options) {
2178
+ return this.client._post("/api/v1/companieshouse/filing-history", options);
2179
+ }
2180
+ };
2181
+
2182
+ // src/namespaces/google-ads.ts
2183
+ var GoogleAdsNamespace = class {
2184
+ constructor(client) {
2185
+ this.client = client;
2186
+ }
2187
+ client;
2188
+ /**
2189
+ * START HERE. Resolves a brand name or a domain to the `advertiser_id` that
2190
+ * search() and creative() are keyed by.
2191
+ *
2192
+ * Returns two row kinds in one list: `advertiser` rows carry the id, the
2193
+ * verified name, the verification country and the total ad count AS A RANGE
2194
+ * (total_ads_min / total_ads_max - Google never publishes an exact figure);
2195
+ * `domain` rows carry a website. A name query returns both kinds, a
2196
+ * domain-shaped query returns domains only.
2197
+ *
2198
+ * NO PAGINATION - this is an autocomplete, roughly 20 rows per arm, and
2199
+ * `limit` caps each arm separately.
2200
+ *
2201
+ * Costs 1 credit.
2202
+ */
2203
+ async advertisers(options) {
2204
+ return this.client._post("/api/v1/googleads/advertisers", options);
2205
+ }
2206
+ /**
2207
+ * Every ad Google is running for one advertiser: the creative (archived
2208
+ * image, rich-media bundle, Google's renderer link, dimensions), advertiser
2209
+ * id and name, format, first and last seen dates, days actually run, plus
2210
+ * total_ads_min / total_ads_max.
2211
+ *
2212
+ * Cursor-paginated: read `next_cursor` off the response and send it back as
2213
+ * `cursor` WITH THE SAME FILTERS, up to 100 rows per page. `next_cursor` is
2214
+ * null once exhausted. A `limit` above 100 is not an error - Google answers
2215
+ * it with ZERO rows.
2216
+ *
2217
+ * The three `format` sets are disjoint, and `domain` is dropped from every
2218
+ * row when the query is by `advertiser_id`, so query by domain if you need
2219
+ * that field. The headline total is a RANGE, never an exact count.
2220
+ *
2221
+ * Pass `domain` or `advertiser_id`.
2222
+ *
2223
+ * Costs 1 credit per page.
2224
+ */
2225
+ async search(options) {
2226
+ return this.client._post("/api/v1/googleads/search", options);
2227
+ }
2228
+ /**
2229
+ * One creative in full, and the ONLY endpoint carrying its history: every
2230
+ * size variation of the asset, the impression bucket, the per-region
2231
+ * breakdown with first and last shown dates and a per-surface impression
2232
+ * split inside each region, the format, Google's category label, and the
2233
+ * funder disclosure on political ads.
2234
+ *
2235
+ * IMPRESSIONS AND REACH ARE EEA-ONLY: impressions_min, impressions_max and
2236
+ * first_shown are NULL on US creatives because Google publishes reach only
2237
+ * where the DSA compels it. A bucket row can carry a lower bound, an upper
2238
+ * bound, or one alone.
2239
+ *
2240
+ * Keyed by the `advertiser_id` + `creative_id` PAIR - a mismatched pair is a
2241
+ * 404, not an empty response.
2242
+ *
2243
+ * Costs 1 credit. Single response, no pagination.
2244
+ */
2245
+ async creative(options) {
2246
+ return this.client._post("/api/v1/googleads/creative", options);
2247
+ }
2248
+ };
2249
+
2250
+ // src/namespaces/meta-ads.ts
2251
+ var MetaAdsNamespace = class {
2252
+ constructor(client) {
2253
+ this.client = client;
2254
+ }
2255
+ client;
2256
+ /**
2257
+ * Search the Meta Ad Library. Page 1 returns 30 ads with the full creative:
2258
+ * page name, ad copy, headline, CTA, images and videos, the platforms each
2259
+ * ran on, and run dates - plus `total_results`, `total_is_capped`,
2260
+ * `has_next_page` and `next_cursor`.
2261
+ *
2262
+ * Cursor-paginated the whole way down: 30 ads on page 1, then 10 per page.
2263
+ * Walk `has_next_page` to pull an entire query. THE OTHER FILTERS ARE
2264
+ * IGNORED once `cursor` is set, because the cursor carries them itself.
2265
+ *
2266
+ * `total_results` CAPS AT 50000 with `total_is_capped: true` - Meta only
2267
+ * reports ">50,000", so never present it as an exact count. Spend, reach,
2268
+ * impressions and the paid-for-by disclosure are null unless
2269
+ * `ad_type` is "political_and_issue_ads".
2270
+ *
2271
+ * Costs 1 credit PER PAGE, so depth costs roughly 10 ads per credit past the
2272
+ * first 30.
2273
+ */
2274
+ async search(options) {
2275
+ return this.client._post("/api/v1/meta-ads/search", options);
2276
+ }
2277
+ /**
2278
+ * Every ad a Facebook Page is running, addressed by its numeric page id.
2279
+ * Page 1 returns 30 ads with the same creative detail as search(), then 10
2280
+ * per page off `next_cursor`; walk `has_next_page` to pull the advertiser's
2281
+ * whole library.
2282
+ *
2283
+ * The other filters are ignored once `cursor` is set. Spend, reach,
2284
+ * impressions and the paid-for-by disclosure are null on commercial ads -
2285
+ * only political/issue ads carry them.
2286
+ *
2287
+ * Costs 1 credit per page.
2288
+ */
2289
+ async advertiser(options) {
2290
+ return this.client._post("/api/v1/meta-ads/advertiser", options);
2291
+ }
2292
+ /**
2293
+ * One ad in full by archive id: creative, advertiser, run dates, platforms
2294
+ * and any political disclosure.
2295
+ *
2296
+ * Spend, reach and impressions are null unless the ad is a political/issue
2297
+ * ad.
2298
+ *
2299
+ * Costs 1 credit. Single response, no pagination.
2300
+ */
2301
+ async ad(options) {
2302
+ return this.client._post("/api/v1/meta-ads/ad", options);
2303
+ }
2304
+ };
2305
+
2306
+ // src/client.ts
2307
+ var Scavio = class {
2308
+ google;
2309
+ amazon;
2310
+ walmart;
2311
+ youtube;
2312
+ reddit;
2313
+ tiktok;
2314
+ tiktokShop;
2315
+ instagram;
2316
+ x;
2317
+ linkedin;
2318
+ threads;
2319
+ kuaishou;
2320
+ ebay;
2321
+ target;
2322
+ homeDepot;
2323
+ zillow;
2324
+ redfin;
2325
+ booking;
2326
+ airbnb;
2327
+ tripadvisor;
2328
+ yelp;
2329
+ indeed;
2330
+ glassdoor;
2331
+ appStore;
2332
+ googlePlay;
2333
+ g2;
2334
+ capterra;
2335
+ sec;
2336
+ companiesHouse;
2337
+ googleAds;
2338
+ metaAds;
2339
+ apiKey;
2340
+ baseUrl;
2341
+ timeout;
2342
+ maxRetries;
2343
+ rateLimiter;
2344
+ constructor(config) {
2345
+ this.apiKey = config?.apiKey ?? process.env.SCAVIO_API_KEY ?? "";
2346
+ if (!this.apiKey) {
2347
+ throw new MissingAPIKeyError();
2348
+ }
2349
+ this.baseUrl = (config?.baseUrl ?? BASE_URL).replace(/\/+$/, "");
2350
+ this.timeout = config?.timeout ?? DEFAULT_TIMEOUT;
2351
+ this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;
2352
+ const rps = config?.maxRequestsPerSecond ?? 1;
2353
+ if (rps < 1 || rps > 10) {
2354
+ throw new ScavioError("maxRequestsPerSecond must be between 1 and 10");
2355
+ }
2356
+ this.rateLimiter = new RateLimiter(rps);
2357
+ this.google = new GoogleNamespace(this);
2358
+ this.amazon = new AmazonNamespace(this);
2359
+ this.walmart = new WalmartNamespace(this);
2360
+ this.youtube = new YouTubeNamespace(this);
2361
+ this.reddit = new RedditNamespace(this);
2362
+ this.tiktok = new TikTokNamespace(this);
2363
+ this.tiktokShop = new TikTokShopNamespace(this);
2364
+ this.instagram = new InstagramNamespace(this);
2365
+ this.x = new XNamespace(this);
2366
+ this.linkedin = new LinkedInNamespace(this);
2367
+ this.threads = new ThreadsNamespace(this);
2368
+ this.kuaishou = new KuaishouNamespace(this);
2369
+ this.ebay = new EbayNamespace(this);
2370
+ this.target = new TargetNamespace(this);
2371
+ this.homeDepot = new HomeDepotNamespace(this);
2372
+ this.zillow = new ZillowNamespace(this);
2373
+ this.redfin = new RedfinNamespace(this);
2374
+ this.booking = new BookingNamespace(this);
2375
+ this.airbnb = new AirbnbNamespace(this);
2376
+ this.tripadvisor = new TripadvisorNamespace(this);
2377
+ this.yelp = new YelpNamespace(this);
2378
+ this.indeed = new IndeedNamespace(this);
2379
+ this.glassdoor = new GlassdoorNamespace(this);
2380
+ this.appStore = new AppStoreNamespace(this);
2381
+ this.googlePlay = new GooglePlayNamespace(this);
2382
+ this.g2 = new G2Namespace(this);
2383
+ this.capterra = new CapterraNamespace(this);
2384
+ this.sec = new SECNamespace(this);
2385
+ this.companiesHouse = new CompaniesHouseNamespace(this);
2386
+ this.googleAds = new GoogleAdsNamespace(this);
2387
+ this.metaAds = new MetaAdsNamespace(this);
2388
+ }
2389
+ /** @internal */
2390
+ async _post(path, body) {
2391
+ return request({
2392
+ method: "POST",
2393
+ path,
2394
+ apiKey: this.apiKey,
2395
+ baseUrl: this.baseUrl,
2396
+ timeout: this.timeout,
2397
+ maxRetries: this.maxRetries,
2398
+ rateLimiter: this.rateLimiter,
2399
+ body
2400
+ });
2401
+ }
2402
+ /** @internal */
2403
+ async _get(path) {
2404
+ return request({
2405
+ method: "GET",
2406
+ path,
2407
+ apiKey: this.apiKey,
2408
+ baseUrl: this.baseUrl,
2409
+ timeout: this.timeout,
2410
+ maxRetries: this.maxRetries,
2411
+ rateLimiter: this.rateLimiter
2412
+ });
2413
+ }
2414
+ async search(options) {
2415
+ return this.google.search(options);
2416
+ }
2417
+ /**
2418
+ * Read ANY web page and get it back as readability Markdown (the default),
2419
+ * plain text, or raw HTML. Returns `{ url, format, mode, content,
2420
+ * content_length }`.
2421
+ *
2422
+ * This is a core endpoint, not a platform, so it lives on the client itself:
2423
+ * `scavio.extract({ url })`, never `scavio.extract.extract()`.
2424
+ *
2425
+ * Credits are a function of `mode`, not a flat per-call constant:
2426
+ * "normal" costs 1, "advanced" costs 1, "ultra" costs 2. Billing happens
2427
+ * only on a successful extraction - a dead link, bot wall or timeout costs
2428
+ * nothing.
2429
+ *
2430
+ * Start on "normal". Move to "advanced" when the page builds its content in
2431
+ * the browser, and to "ultra" only when a bot wall blocks the other two.
2432
+ *
2433
+ * @example
2434
+ * const page = await scavio.extract({ url: "https://example.com/pricing" });
2435
+ * console.log(page.content);
2436
+ */
2437
+ async extract(options) {
2438
+ return this._post("/api/v1/extract", options);
923
2439
  }
924
2440
  async getUsage() {
925
2441
  return this._get("/api/v1/usage");
@@ -927,16 +2443,47 @@ var Scavio = class {
927
2443
  };
928
2444
  // Annotate the CommonJS export names for ESM import in node:
929
2445
  0 && (module.exports = {
2446
+ AirbnbNamespace,
2447
+ AmazonNamespace,
2448
+ AppStoreNamespace,
930
2449
  BadRequestError,
2450
+ BookingNamespace,
2451
+ CapterraNamespace,
2452
+ CompaniesHouseNamespace,
2453
+ EbayNamespace,
2454
+ G2Namespace,
2455
+ GlassdoorNamespace,
2456
+ GoogleAdsNamespace,
2457
+ GoogleNamespace,
2458
+ GooglePlayNamespace,
2459
+ HomeDepotNamespace,
2460
+ IndeedNamespace,
2461
+ InstagramNamespace,
931
2462
  InsufficientCreditsError,
932
2463
  InvalidAPIKeyError,
2464
+ KuaishouNamespace,
2465
+ LinkedInNamespace,
2466
+ MetaAdsNamespace,
933
2467
  MissingAPIKeyError,
934
2468
  NotFoundError,
935
2469
  RateLimitError,
2470
+ RedditNamespace,
2471
+ RedfinNamespace,
2472
+ SECNamespace,
936
2473
  Scavio,
937
2474
  ScavioAPIError,
938
2475
  ScavioConnectionError,
939
2476
  ScavioError,
940
- ScavioTimeoutError
2477
+ ScavioTimeoutError,
2478
+ TargetNamespace,
2479
+ ThreadsNamespace,
2480
+ TikTokNamespace,
2481
+ TikTokShopNamespace,
2482
+ TripadvisorNamespace,
2483
+ WalmartNamespace,
2484
+ XNamespace,
2485
+ YelpNamespace,
2486
+ YouTubeNamespace,
2487
+ ZillowNamespace
941
2488
  });
942
2489
  //# sourceMappingURL=index.cjs.map