scrapebadger 0.4.0 → 0.7.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.mjs CHANGED
@@ -2186,7 +2186,7 @@ var StreamClient = class {
2186
2186
  return;
2187
2187
  }
2188
2188
  if (!reconnect) {
2189
- const reasonStr = reason instanceof Buffer ? reason.toString() : String(reason ?? "");
2189
+ const reasonStr = reason instanceof Buffer ? reason.toString() : typeof reason === "string" ? reason : "";
2190
2190
  emitter.emit(
2191
2191
  "error",
2192
2192
  new WebSocketStreamError(`WebSocket closed: ${reasonStr || String(code)}`)
@@ -2427,94 +2427,845 @@ var WebClient = class {
2427
2427
  }
2428
2428
  /**
2429
2429
  * Scrape a web page.
2430
+ *
2431
+ * @param url - The URL to scrape
2432
+ * @param options - Scrape configuration options
2433
+ * @returns The scrape result including content, metadata, and credit usage
2430
2434
  */
2431
2435
  async scrape(url, options = {}) {
2432
2436
  const body = { url };
2433
- if (options.renderJs) body.render_js = true;
2434
- if (options.outputFormat && options.outputFormat !== "html")
2435
- body.output_format = options.outputFormat;
2436
- if (options.proxyCountry) body.proxy_country = options.proxyCountry;
2437
- if (options.proxyType) body.proxy_type = options.proxyType;
2438
- if (options.sessionId) body.session_id = options.sessionId;
2439
- if (options.engine) body.engine = options.engine;
2437
+ if (options.format !== void 0) body.format = options.format;
2438
+ if (options.renderJs !== void 0) body.render_js = options.renderJs;
2439
+ if (options.engine !== void 0) body.engine = options.engine;
2440
+ if (options.waitFor !== void 0) body.wait_for = options.waitFor;
2441
+ if (options.waitTimeout !== void 0) body.wait_timeout = options.waitTimeout;
2442
+ if (options.waitAfterLoad !== void 0) body.wait_after_load = options.waitAfterLoad;
2443
+ if (options.jsScenario !== void 0) body.js_scenario = options.jsScenario;
2444
+ if (options.sessionId !== void 0) body.session_id = options.sessionId;
2445
+ if (options.retryCount !== void 0) body.retry_count = options.retryCount;
2446
+ if (options.retryOnBlock !== void 0) body.retry_on_block = options.retryOnBlock;
2447
+ if (options.country !== void 0) body.country = options.country;
2448
+ if (options.customHeaders !== void 0) body.custom_headers = options.customHeaders;
2449
+ if (options.screenshot !== void 0) body.screenshot = options.screenshot;
2450
+ if (options.video !== void 0) body.video = options.video;
2451
+ if (options.antiBot !== void 0) body.anti_bot = options.antiBot;
2452
+ if (options.escalate !== void 0) body.escalate = options.escalate;
2440
2453
  if (options.maxCost !== void 0) body.max_cost = options.maxCost;
2441
- if (options.headers) body.headers = options.headers;
2442
- if (options.waitFor) body.wait_for = options.waitFor;
2443
- if (options.timeout !== void 0) body.timeout = options.timeout;
2444
- if (options.jsScenario) body.js_scenario = options.jsScenario;
2454
+ if (options.aiExtract !== void 0) body.ai_extract = options.aiExtract;
2455
+ if (options.aiPrompt !== void 0) body.ai_prompt = options.aiPrompt;
2456
+ if (options.rawContent !== void 0) body.raw_content = options.rawContent;
2457
+ if (options.skipBotDetection !== void 0) body.skip_bot_detection = options.skipBotDetection;
2445
2458
  return this.client.request("/v1/web/scrape", {
2446
2459
  method: "POST",
2447
2460
  body
2448
2461
  });
2449
2462
  }
2450
2463
  /**
2451
- * Take a screenshot of a web page.
2464
+ * Extract structured data from a web page using AI.
2465
+ *
2466
+ * Convenience wrapper around {@link scrape} that enables AI extraction
2467
+ * with the given prompt and defaults to markdown format.
2468
+ *
2469
+ * @param url - The URL to extract data from
2470
+ * @param prompt - Natural language prompt describing what to extract (max 2000 chars)
2471
+ * @param options - Additional scrape options (aiExtract and aiPrompt are set automatically)
2472
+ * @returns The scrape result with ai_extraction populated
2452
2473
  */
2453
- async screenshot(url, options = {}) {
2454
- const body = { url };
2455
- if (options.fullPage) body.full_page = true;
2456
- if (options.viewportWidth && options.viewportWidth !== 1280)
2457
- body.viewport_width = options.viewportWidth;
2458
- if (options.viewportHeight && options.viewportHeight !== 720)
2459
- body.viewport_height = options.viewportHeight;
2460
- if (options.imageFormat && options.imageFormat !== "png")
2461
- body.image_format = options.imageFormat;
2462
- if (options.waitFor) body.wait_for = options.waitFor;
2463
- if (options.timeout !== void 0) body.timeout = options.timeout;
2464
- return this.client.request("/v1/web/screenshot", {
2465
- method: "POST",
2466
- body
2474
+ async extract(url, prompt, options = {}) {
2475
+ return this.scrape(url, {
2476
+ format: "markdown",
2477
+ ...options,
2478
+ aiExtract: true,
2479
+ aiPrompt: prompt
2467
2480
  });
2468
2481
  }
2469
2482
  /**
2470
- * Extract structured data from a web page.
2483
+ * Detect anti-bot systems on a URL.
2484
+ *
2485
+ * @param url - The URL to analyze
2486
+ * @param options - Detection options
2487
+ * @returns Detection results including identified anti-bot and captcha systems
2471
2488
  */
2472
- async extract(url, options = {}) {
2489
+ async detect(url, options = {}) {
2473
2490
  const body = { url };
2474
- if (options.schema) body.extraction_schema = options.schema;
2475
- if (options.renderJs) body.render_js = true;
2476
- if (options.waitFor) body.wait_for = options.waitFor;
2477
2491
  if (options.timeout !== void 0) body.timeout = options.timeout;
2478
- return this.client.request("/v1/web/extract", {
2492
+ if (options.country !== void 0) body.country = options.country;
2493
+ return this.client.request("/v1/web/detect", {
2479
2494
  method: "POST",
2480
2495
  body
2481
2496
  });
2482
2497
  }
2498
+ };
2499
+
2500
+ // src/vinted/search.ts
2501
+ var SearchClient = class {
2502
+ client;
2503
+ constructor(client) {
2504
+ this.client = client;
2505
+ }
2483
2506
  /**
2484
- * Scrape multiple URLs in a batch.
2507
+ * Search for Vinted items.
2508
+ *
2509
+ * @param params - Search parameters including query, filters, and pagination.
2510
+ * @returns Search results with items and pagination metadata.
2511
+ * @throws AuthenticationError - If the API key is invalid.
2512
+ * @throws ValidationError - If the search parameters are invalid.
2513
+ *
2514
+ * @example
2515
+ * ```typescript
2516
+ * const results = await client.vinted.search.search({
2517
+ * query: "vintage jacket",
2518
+ * market: "fr",
2519
+ * page: 1,
2520
+ * per_page: 20,
2521
+ * order: "newest_first",
2522
+ * });
2523
+ * console.log(`Found ${results.pagination.total_entries} items`);
2524
+ * ```
2485
2525
  */
2486
- async batch(urls, options = {}) {
2487
- const body = { urls };
2488
- if (options.renderJs) body.render_js = true;
2489
- if (options.outputFormat && options.outputFormat !== "html")
2490
- body.output_format = options.outputFormat;
2491
- if (options.maxConcurrency && options.maxConcurrency !== 5)
2492
- body.max_concurrency = options.maxConcurrency;
2493
- if (options.engine) body.engine = options.engine;
2494
- if (options.timeout !== void 0) body.timeout = options.timeout;
2495
- return this.client.request("/v1/web/batch", {
2496
- method: "POST",
2497
- body
2526
+ async search(params) {
2527
+ return this.client.request("/v1/vinted/search", {
2528
+ params: {
2529
+ query: params.query,
2530
+ market: params.market,
2531
+ page: params.page,
2532
+ per_page: params.per_page,
2533
+ price_from: params.price_from,
2534
+ price_to: params.price_to,
2535
+ brand_ids: params.brand_ids,
2536
+ color_ids: params.color_ids,
2537
+ status_ids: params.status_ids,
2538
+ order: params.order
2539
+ }
2498
2540
  });
2499
2541
  }
2542
+ };
2543
+
2544
+ // src/vinted/items.ts
2545
+ var ItemsClient = class {
2546
+ client;
2547
+ constructor(client) {
2548
+ this.client = client;
2549
+ }
2500
2550
  /**
2501
- * Create a new scraping session for a domain.
2551
+ * Get a single item by ID.
2552
+ *
2553
+ * @param itemId - The Vinted item ID to fetch.
2554
+ * @param options - Optional parameters.
2555
+ * @param options.market - Market code (default: "fr").
2556
+ * @returns The item detail response including full item data.
2557
+ * @throws NotFoundError - If the item doesn't exist.
2558
+ * @throws AuthenticationError - If the API key is invalid.
2559
+ *
2560
+ * @example
2561
+ * ```typescript
2562
+ * const response = await client.vinted.items.get(123456789);
2563
+ * const { item } = response;
2564
+ * console.log(`${item.title}: ${item.description}`);
2565
+ * console.log(`Brand: ${item.brand_title}, Size: ${item.size_title}`);
2566
+ * console.log(`Photos: ${item.photos.length}`);
2567
+ * ```
2502
2568
  */
2503
- async createSession(domain, persist = true) {
2504
- return this.client.request("/v1/web/sessions", {
2505
- method: "POST",
2506
- body: {
2507
- domain,
2508
- new_session: true,
2509
- persist_session: persist
2569
+ async get(itemId, options = {}) {
2570
+ return this.client.request(
2571
+ `/v1/vinted/items/${itemId}`,
2572
+ { params: { market: options.market } }
2573
+ );
2574
+ }
2575
+ };
2576
+
2577
+ // src/vinted/users.ts
2578
+ var UsersClient2 = class {
2579
+ client;
2580
+ constructor(client) {
2581
+ this.client = client;
2582
+ }
2583
+ /**
2584
+ * Get a user's profile.
2585
+ *
2586
+ * @param userId - The Vinted user ID.
2587
+ * @param options - Optional parameters.
2588
+ * @param options.market - Market code (default: "fr").
2589
+ * @returns The user profile response.
2590
+ * @throws NotFoundError - If the user doesn't exist.
2591
+ * @throws AuthenticationError - If the API key is invalid.
2592
+ *
2593
+ * @example
2594
+ * ```typescript
2595
+ * const response = await client.vinted.users.getProfile(12345);
2596
+ * const { user } = response;
2597
+ * console.log(`${user.login} from ${user.city}, ${user.country_code}`);
2598
+ * console.log(`Reputation: ${user.feedback_reputation}`);
2599
+ * console.log(`Items: ${user.item_count}, Followers: ${user.followers_count}`);
2600
+ * ```
2601
+ */
2602
+ async getProfile(userId, options = {}) {
2603
+ return this.client.request(
2604
+ `/v1/vinted/users/${userId}`,
2605
+ { params: { market: options.market } }
2606
+ );
2607
+ }
2608
+ /**
2609
+ * Get items listed by a user.
2610
+ *
2611
+ * @param userId - The Vinted user ID.
2612
+ * @param options - Optional parameters for pagination and market.
2613
+ * @param options.market - Market code (default: "fr").
2614
+ * @param options.page - Page number.
2615
+ * @param options.per_page - Items per page.
2616
+ * @returns The user's items with pagination metadata.
2617
+ * @throws NotFoundError - If the user doesn't exist.
2618
+ * @throws AuthenticationError - If the API key is invalid.
2619
+ *
2620
+ * @example
2621
+ * ```typescript
2622
+ * const response = await client.vinted.users.getItems(12345, {
2623
+ * market: "de",
2624
+ * page: 1,
2625
+ * per_page: 20,
2626
+ * });
2627
+ * console.log(`Page ${response.pagination.current_page} of ${response.pagination.total_pages}`);
2628
+ * for (const item of response.items) {
2629
+ * console.log(`${item.title} — ${item.price.amount} ${item.price.currency_code}`);
2630
+ * }
2631
+ * ```
2632
+ */
2633
+ async getItems(userId, options = {}) {
2634
+ return this.client.request(
2635
+ `/v1/vinted/users/${userId}/items`,
2636
+ {
2637
+ params: {
2638
+ market: options.market,
2639
+ page: options.page,
2640
+ per_page: options.per_page
2641
+ }
2510
2642
  }
2643
+ );
2644
+ }
2645
+ };
2646
+
2647
+ // src/vinted/reference.ts
2648
+ var ReferenceClient = class {
2649
+ client;
2650
+ constructor(client) {
2651
+ this.client = client;
2652
+ }
2653
+ /**
2654
+ * Search for brands by keyword.
2655
+ *
2656
+ * @param options - Optional parameters.
2657
+ * @param options.keyword - Brand name to search for.
2658
+ * @param options.market - Market code (default: "fr").
2659
+ * @param options.per_page - Number of results per page.
2660
+ * @returns Brands matching the keyword.
2661
+ *
2662
+ * @example
2663
+ * ```typescript
2664
+ * const response = await client.vinted.reference.brands({
2665
+ * keyword: "adidas",
2666
+ * market: "de",
2667
+ * per_page: 10,
2668
+ * });
2669
+ * for (const brand of response.brands) {
2670
+ * console.log(`${brand.title} (${brand.slug}): ${brand.item_count} items`);
2671
+ * }
2672
+ * ```
2673
+ */
2674
+ async brands(options = {}) {
2675
+ return this.client.request("/v1/vinted/brands", {
2676
+ params: {
2677
+ keyword: options.keyword,
2678
+ market: options.market,
2679
+ per_page: options.per_page
2680
+ }
2681
+ });
2682
+ }
2683
+ /**
2684
+ * Get available colors for a market.
2685
+ *
2686
+ * @param options - Optional parameters.
2687
+ * @param options.market - Market code (default: "fr").
2688
+ * @returns List of available colors.
2689
+ *
2690
+ * @example
2691
+ * ```typescript
2692
+ * const response = await client.vinted.reference.colors({ market: "fr" });
2693
+ * for (const color of response.colors) {
2694
+ * console.log(`${color.title} (#${color.hex})`);
2695
+ * }
2696
+ * ```
2697
+ */
2698
+ async colors(options = {}) {
2699
+ return this.client.request("/v1/vinted/colors", {
2700
+ params: { market: options.market }
2701
+ });
2702
+ }
2703
+ /**
2704
+ * Get available item condition statuses for a market.
2705
+ *
2706
+ * @param options - Optional parameters.
2707
+ * @param options.market - Market code (default: "fr").
2708
+ * @returns List of item condition statuses.
2709
+ *
2710
+ * @example
2711
+ * ```typescript
2712
+ * const response = await client.vinted.reference.statuses({ market: "fr" });
2713
+ * for (const status of response.statuses) {
2714
+ * console.log(`${status.id}: ${status.title}`);
2715
+ * }
2716
+ * ```
2717
+ */
2718
+ async statuses(options = {}) {
2719
+ return this.client.request("/v1/vinted/statuses", {
2720
+ params: { market: options.market }
2721
+ });
2722
+ }
2723
+ /**
2724
+ * Get all available Vinted markets.
2725
+ *
2726
+ * @returns List of all supported Vinted markets/countries.
2727
+ *
2728
+ * @example
2729
+ * ```typescript
2730
+ * const response = await client.vinted.reference.markets();
2731
+ * for (const market of response.markets) {
2732
+ * console.log(`${market.name}: ${market.domain} (${market.currency})`);
2733
+ * }
2734
+ * ```
2735
+ */
2736
+ async markets() {
2737
+ return this.client.request("/v1/vinted/markets");
2738
+ }
2739
+ };
2740
+
2741
+ // src/vinted/client.ts
2742
+ var VintedClient = class {
2743
+ /** Client for item search operations */
2744
+ search;
2745
+ /** Client for individual item operations */
2746
+ items;
2747
+ /** Client for user operations */
2748
+ users;
2749
+ /** Client for reference data (brands, colors, statuses, markets) */
2750
+ reference;
2751
+ /**
2752
+ * Create a new Vinted client.
2753
+ *
2754
+ * @param client - The base HTTP client for making requests.
2755
+ */
2756
+ constructor(client) {
2757
+ this.search = new SearchClient(client);
2758
+ this.items = new ItemsClient(client);
2759
+ this.users = new UsersClient2(client);
2760
+ this.reference = new ReferenceClient(client);
2761
+ }
2762
+ };
2763
+
2764
+ // src/google/ai-mode.ts
2765
+ var AiModeClient = class {
2766
+ constructor(client) {
2767
+ this.client = client;
2768
+ }
2769
+ async search(params) {
2770
+ return this.client.request("/v1/google/ai-mode/search", {
2771
+ params: { ...params }
2772
+ });
2773
+ }
2774
+ };
2775
+
2776
+ // src/google/autocomplete.ts
2777
+ var AutocompleteClient = class {
2778
+ constructor(client) {
2779
+ this.client = client;
2780
+ }
2781
+ /**
2782
+ * Get Google autocomplete suggestions for a query.
2783
+ *
2784
+ * @example
2785
+ * ```typescript
2786
+ * const res = await client.google.autocomplete.get({ q: "apple" });
2787
+ * for (const s of res.suggestions) {
2788
+ * console.log(s.value, s.entity_name, s.thumbnail);
2789
+ * }
2790
+ * ```
2791
+ */
2792
+ async get(params) {
2793
+ return this.client.request("/v1/google/autocomplete", {
2794
+ params: { ...params }
2795
+ });
2796
+ }
2797
+ };
2798
+
2799
+ // src/google/finance.ts
2800
+ var FinanceClient = class {
2801
+ constructor(client) {
2802
+ this.client = client;
2803
+ }
2804
+ async quote(params) {
2805
+ return this.client.request("/v1/google/finance/quote", {
2806
+ params: { ...params }
2807
+ });
2808
+ }
2809
+ };
2810
+
2811
+ // src/google/flights.ts
2812
+ var FlightsClient = class {
2813
+ constructor(client) {
2814
+ this.client = client;
2815
+ }
2816
+ /** Search Google Flights for available itineraries. */
2817
+ async search(params) {
2818
+ return this.client.request("/v1/google/flights/search", {
2819
+ params: { ...params }
2820
+ });
2821
+ }
2822
+ };
2823
+
2824
+ // src/google/hotels.ts
2825
+ var HotelsClient = class {
2826
+ constructor(client) {
2827
+ this.client = client;
2828
+ }
2829
+ async search(params) {
2830
+ return this.client.request("/v1/google/hotels/search", {
2831
+ params: { ...params }
2832
+ });
2833
+ }
2834
+ async details(params) {
2835
+ return this.client.request("/v1/google/hotels/details", {
2836
+ params: { ...params }
2837
+ });
2838
+ }
2839
+ };
2840
+
2841
+ // src/google/images.ts
2842
+ var ImagesClient = class {
2843
+ constructor(client) {
2844
+ this.client = client;
2845
+ }
2846
+ async search(params) {
2847
+ return this.client.request("/v1/google/images/search", {
2848
+ params: { ...params }
2849
+ });
2850
+ }
2851
+ };
2852
+
2853
+ // src/google/jobs.ts
2854
+ var JobsClient = class {
2855
+ constructor(client) {
2856
+ this.client = client;
2857
+ }
2858
+ async search(params) {
2859
+ return this.client.request("/v1/google/jobs/search", {
2860
+ params: { ...params }
2861
+ });
2862
+ }
2863
+ };
2864
+
2865
+ // src/google/lens.ts
2866
+ var LensClient = class {
2867
+ constructor(client) {
2868
+ this.client = client;
2869
+ }
2870
+ async search(params) {
2871
+ return this.client.request("/v1/google/lens/search", {
2872
+ params: { ...params }
2873
+ });
2874
+ }
2875
+ };
2876
+
2877
+ // src/google/maps.ts
2878
+ var MapsClient = class {
2879
+ constructor(client) {
2880
+ this.client = client;
2881
+ }
2882
+ /**
2883
+ * Search Maps for places by text query, place_id, or ludocid.
2884
+ *
2885
+ * Returns up to 20 results per page with full details (place_id,
2886
+ * data_id, GPS, rating, reviews, address, phone, website, extensions,
2887
+ * weekly hours, thumbnail) in a single call.
2888
+ */
2889
+ async search(params) {
2890
+ if (!params.q && !params.place_id && !params.ludocid) {
2891
+ throw new Error("q, place_id, or ludocid is required");
2892
+ }
2893
+ return this.client.request("/v1/google/maps/search", {
2894
+ params: { ...params }
2895
+ });
2896
+ }
2897
+ /**
2898
+ * Get full place detail by `place_id` or `data_id`.
2899
+ *
2900
+ * Returns title, address, phone, website, GPS, rating, reviews_count,
2901
+ * rating_summary (per-star distribution), categories, extensions
2902
+ * (service_options, accessibility, offerings, payments), weekly
2903
+ * operating hours, popular_times graph, provider_id,
2904
+ * permanently_closed, thumbnail, and photo list.
2905
+ */
2906
+ async place(params) {
2907
+ if (!params.place_id && !params.data_id) {
2908
+ throw new Error("place_id or data_id is required");
2909
+ }
2910
+ return this.client.request("/v1/google/maps/place", {
2911
+ params: { ...params }
2511
2912
  });
2512
2913
  }
2513
2914
  /**
2514
- * Scrape using an existing session.
2915
+ * Get reviews for a place (paginated, optional topic filter).
2916
+ *
2917
+ * Pass the `next_page_token` from `response.pagination.next` for
2918
+ * subsequent pages, or use `topic_id` from `response.topics[].id`
2919
+ * to scope to a specific review topic.
2920
+ */
2921
+ async reviews(params) {
2922
+ return this.client.request("/v1/google/maps/reviews", {
2923
+ params: { ...params }
2924
+ });
2925
+ }
2926
+ /**
2927
+ * Get photos for a place with place-specific categories.
2928
+ *
2929
+ * Returns place-specific categories (Menu, Vibe, Comfort food, dish
2930
+ * names) and photo URLs from all CDN families. Use `category_id` to
2931
+ * scope to a category, or `page_size: 200` to fetch all photos in
2932
+ * one call (Google caps at ~120 photos per response).
2515
2933
  */
2516
- async reuseSession(url, sessionId, options = {}) {
2517
- return this.scrape(url, { ...options, sessionId });
2934
+ async photos(params) {
2935
+ return this.client.request("/v1/google/maps/photos", {
2936
+ params: { ...params }
2937
+ });
2938
+ }
2939
+ /** Get business posts (promotional updates, announcements) for a place. */
2940
+ async posts(params) {
2941
+ if (!params.data_id && !params.place_id) {
2942
+ throw new Error("data_id or place_id is required");
2943
+ }
2944
+ return this.client.request("/v1/google/maps/posts", {
2945
+ params: { ...params }
2946
+ });
2947
+ }
2948
+ };
2949
+
2950
+ // src/google/news.ts
2951
+ var NewsClient = class {
2952
+ constructor(client) {
2953
+ this.client = client;
2954
+ }
2955
+ /**
2956
+ * Search Google News. One of `q`, `topic_token`, `publication_token`,
2957
+ * or `story_token` is required (or pass no params for the trending
2958
+ * home feed). Returns `menu_links`, `news_results`, `related_topics`.
2959
+ */
2960
+ async search(params = {}) {
2961
+ if (!params.q && !params.topic_token && !params.publication_token && !params.story_token) {
2962
+ throw new Error("Provide q, topic_token, publication_token, or story_token");
2963
+ }
2964
+ return this.client.request("/v1/google/news/search", {
2965
+ params: { ...params }
2966
+ });
2967
+ }
2968
+ async topics(params) {
2969
+ return this.client.request("/v1/google/news/topics", {
2970
+ params: { ...params }
2971
+ });
2972
+ }
2973
+ async trending(params = {}) {
2974
+ return this.client.request("/v1/google/news/trending", {
2975
+ params: { ...params }
2976
+ });
2977
+ }
2978
+ };
2979
+
2980
+ // src/google/patents.ts
2981
+ var PatentsClient = class {
2982
+ constructor(client) {
2983
+ this.client = client;
2984
+ }
2985
+ async search(params) {
2986
+ return this.client.request("/v1/google/patents/search", {
2987
+ params: { ...params }
2988
+ });
2989
+ }
2990
+ /**
2991
+ * Get rich patent document details by patent number.
2992
+ *
2993
+ * Response includes full abstract + every claim + complete description,
2994
+ * plus structured `cpc_classifications` (code + description), split
2995
+ * `backward_citations` / `forward_citations` (with `primary_examiner`
2996
+ * flag), `non_patent_citations`, `concepts` (research fields),
2997
+ * `legal_events` (prosecution history), `figures` (full-res URLs),
2998
+ * every `inventor`, and the full `assignees_original` history.
2999
+ */
3000
+ async detail(params) {
3001
+ return this.client.request("/v1/google/patents/detail", {
3002
+ params: { ...params }
3003
+ });
3004
+ }
3005
+ };
3006
+
3007
+ // src/google/products.ts
3008
+ var ProductsClient = class {
3009
+ constructor(client) {
3010
+ this.client = client;
3011
+ }
3012
+ async detail(params) {
3013
+ return this.client.request("/v1/google/products/detail", {
3014
+ params: { ...params }
3015
+ });
3016
+ }
3017
+ };
3018
+
3019
+ // src/google/scholar.ts
3020
+ var ScholarClient = class {
3021
+ constructor(client) {
3022
+ this.client = client;
3023
+ }
3024
+ /**
3025
+ * Search Google Scholar. Returns each result with doc `id`, `type`
3026
+ * badge, wrapped `inline_links`, PDF `resources`, and structured
3027
+ * authors. Envelope includes `scholar_results` alias,
3028
+ * `related_searches`, and matched `profiles` cards.
3029
+ */
3030
+ async search(params) {
3031
+ return this.client.request("/v1/google/scholar/search", {
3032
+ params: { ...params }
3033
+ });
3034
+ }
3035
+ /** Search Google Scholar for author profiles by name. */
3036
+ async profiles(params) {
3037
+ return this.client.request("/v1/google/scholar/profiles", {
3038
+ params: { ...params }
3039
+ });
3040
+ }
3041
+ /**
3042
+ * Full Scholar author profile: structured `interests_detailed`,
3043
+ * publications (with per-article `citation_id` + nested
3044
+ * `cited_by{value, link, citation_id}`), stats, and co-authors.
3045
+ */
3046
+ async author(params) {
3047
+ return this.client.request("/v1/google/scholar/author", {
3048
+ params: { ...params }
3049
+ });
3050
+ }
3051
+ /** Citations-per-year chart for a Scholar author. */
3052
+ async authorCitation(params) {
3053
+ return this.client.request("/v1/google/scholar/author/citation", {
3054
+ params: { ...params }
3055
+ });
3056
+ }
3057
+ /**
3058
+ * MLA / APA / Chicago / Harvard / Vancouver citation formats plus
3059
+ * BibTeX / RIS / EndNote / RefWorks export links for a paper.
3060
+ */
3061
+ async cite(params) {
3062
+ return this.client.request("/v1/google/scholar/cite", {
3063
+ params: { ...params }
3064
+ });
3065
+ }
3066
+ };
3067
+
3068
+ // src/google/search.ts
3069
+ var SearchClient2 = class {
3070
+ constructor(client) {
3071
+ this.client = client;
3072
+ }
3073
+ /**
3074
+ * Search Google and get a structured SERP response with organic results,
3075
+ * knowledge graph, People Also Ask, related searches, AI overview, and
3076
+ * pagination.
3077
+ */
3078
+ async search(params) {
3079
+ return this.client.request("/v1/google/search", { params: { ...params } });
3080
+ }
3081
+ /**
3082
+ * Lightweight Google Search — organic results + related searches only.
3083
+ *
3084
+ * ~40% faster than {@link search}. Skips ads, Knowledge Graph, AI
3085
+ * Overview, local pack, news, inline videos, and shopping blocks.
3086
+ * Credit cost is configured per-endpoint by admins — query
3087
+ * `/public/pricing` for the live rate.
3088
+ *
3089
+ * @example
3090
+ * ```typescript
3091
+ * const lite = await client.google.search.light({ q: "python 3.13" });
3092
+ * ```
3093
+ */
3094
+ async light(params) {
3095
+ return this.client.request("/v1/google/search", {
3096
+ params: { ...params, mode: "fast" }
3097
+ });
3098
+ }
3099
+ };
3100
+
3101
+ // src/google/shopping.ts
3102
+ var ShoppingClient = class {
3103
+ constructor(client) {
3104
+ this.client = client;
3105
+ }
3106
+ /** Search Google Shopping for products. */
3107
+ async search(params) {
3108
+ return this.client.request("/v1/google/shopping/search", {
3109
+ params: { ...params }
3110
+ });
3111
+ }
3112
+ /** Fetch the Google Shopping product detail page by `product_id`. */
3113
+ async product(params) {
3114
+ return this.client.request("/v1/google/shopping/product", {
3115
+ params: { ...params }
3116
+ });
3117
+ }
3118
+ /**
3119
+ * Resolve the direct merchant URL for a Shopping product tile via
3120
+ * Google's "I'm Feeling Lucky" redirect (scoped to the card's `source`
3121
+ * merchant via the `site:` operator). You only pay for the call when
3122
+ * you actually want the merchant link — no bulk enrichment of every
3123
+ * tile.
3124
+ */
3125
+ async click(params) {
3126
+ return this.client.request("/v1/google/shopping/product/click", {
3127
+ params: { ...params }
3128
+ });
3129
+ }
3130
+ };
3131
+
3132
+ // src/google/shorts.ts
3133
+ var ShortsClient = class {
3134
+ constructor(client) {
3135
+ this.client = client;
3136
+ }
3137
+ async search(params) {
3138
+ return this.client.request("/v1/google/shorts/search", {
3139
+ params: { ...params }
3140
+ });
3141
+ }
3142
+ };
3143
+
3144
+ // src/google/trends.ts
3145
+ var TrendsClient2 = class {
3146
+ constructor(client) {
3147
+ this.client = client;
3148
+ }
3149
+ async interest(params) {
3150
+ return this.client.request("/v1/google/trends/interest", {
3151
+ params: { ...params }
3152
+ });
3153
+ }
3154
+ async regions(params) {
3155
+ return this.client.request("/v1/google/trends/regions", {
3156
+ params: { ...params }
3157
+ });
3158
+ }
3159
+ async related(params) {
3160
+ return this.client.request("/v1/google/trends/related", {
3161
+ params: { ...params }
3162
+ });
3163
+ }
3164
+ async trending(params = {}) {
3165
+ return this.client.request("/v1/google/trends/trending", {
3166
+ params: { ...params }
3167
+ });
3168
+ }
3169
+ /**
3170
+ * Current trending searches with the full Google Trends UI filter set
3171
+ * — `geo`, `hours`, `category`, `status`, `sort`, `hl`.
3172
+ */
3173
+ async trendingNow(params = {}) {
3174
+ return this.client.request("/v1/google/trends/trending-now", {
3175
+ params: { ...params }
3176
+ });
3177
+ }
3178
+ /**
3179
+ * Unified Google Trends query — pick the response shape via
3180
+ * `data_type` (TIMESERIES | GEO_MAP | GEO_MAP_0 | RELATED_TOPICS |
3181
+ * RELATED_QUERIES).
3182
+ */
3183
+ async search(params) {
3184
+ return this.client.request("/v1/google/trends/search", {
3185
+ params: { ...params }
3186
+ });
3187
+ }
3188
+ /**
3189
+ * Return categorized Knowledge Graph topic entities (`mid`, `type`,
3190
+ * direct link into Trends explore) for a query prefix. Distinct from
3191
+ * Google Search autocomplete.
3192
+ */
3193
+ async autocomplete(params) {
3194
+ return this.client.request("/v1/google/trends/autocomplete", {
3195
+ params: { ...params }
3196
+ });
3197
+ }
3198
+ };
3199
+
3200
+ // src/google/videos.ts
3201
+ var VideosClient = class {
3202
+ constructor(client) {
3203
+ this.client = client;
3204
+ }
3205
+ async search(params) {
3206
+ return this.client.request("/v1/google/videos/search", {
3207
+ params: { ...params }
3208
+ });
3209
+ }
3210
+ };
3211
+
3212
+ // src/google/client.ts
3213
+ var GoogleClient = class {
3214
+ /** Google Web Search (SERP) — with optional deferred AI Overview follow-up. */
3215
+ search;
3216
+ /** Google Maps — places, reviews, photos, posts. */
3217
+ maps;
3218
+ /** Google News — articles, topics, trending. */
3219
+ news;
3220
+ /** Google Hotels — search and property details. */
3221
+ hotels;
3222
+ /** Google Trends — interest, regions, related, trending, topic autocomplete. */
3223
+ trends;
3224
+ /** Google Jobs. */
3225
+ jobs;
3226
+ /** Google Shopping — search, details, click enrichment. */
3227
+ shopping;
3228
+ /** Google Patents — search and document details. */
3229
+ patents;
3230
+ /** Google Scholar — search, profiles, author, author citation, cite formats. */
3231
+ scholar;
3232
+ /** Google Autocomplete — search suggestions. */
3233
+ autocomplete;
3234
+ /** Google Images. */
3235
+ images;
3236
+ /** Google Videos. */
3237
+ videos;
3238
+ /** Google Finance — stock and index quotes. */
3239
+ finance;
3240
+ /** Google AI Mode — generative answer responses. */
3241
+ aiMode;
3242
+ /** Google Lens — visual image search. */
3243
+ lens;
3244
+ /** Google Shorts — short-form vertical video results (udm=39). */
3245
+ shorts;
3246
+ /** Google Flights — one-way, round-trip, and multi-city itineraries. */
3247
+ flights;
3248
+ /** Google Products — immersive product detail. */
3249
+ products;
3250
+ constructor(client) {
3251
+ this.search = new SearchClient2(client);
3252
+ this.maps = new MapsClient(client);
3253
+ this.news = new NewsClient(client);
3254
+ this.hotels = new HotelsClient(client);
3255
+ this.trends = new TrendsClient2(client);
3256
+ this.jobs = new JobsClient(client);
3257
+ this.shopping = new ShoppingClient(client);
3258
+ this.patents = new PatentsClient(client);
3259
+ this.scholar = new ScholarClient(client);
3260
+ this.autocomplete = new AutocompleteClient(client);
3261
+ this.images = new ImagesClient(client);
3262
+ this.videos = new VideosClient(client);
3263
+ this.finance = new FinanceClient(client);
3264
+ this.aiMode = new AiModeClient(client);
3265
+ this.lens = new LensClient(client);
3266
+ this.shorts = new ShortsClient(client);
3267
+ this.flights = new FlightsClient(client);
3268
+ this.products = new ProductsClient(client);
2518
3269
  }
2519
3270
  };
2520
3271
 
@@ -2525,6 +3276,10 @@ var ScrapeBadger = class {
2525
3276
  twitter;
2526
3277
  /** Web scraping API client */
2527
3278
  web;
3279
+ /** Vinted scraper API client */
3280
+ vinted;
3281
+ /** Google Scraper API client — 19 Google product APIs */
3282
+ google;
2528
3283
  /**
2529
3284
  * Create a new ScrapeBadger client.
2530
3285
  *
@@ -2561,9 +3316,11 @@ var ScrapeBadger = class {
2561
3316
  this.baseClient = new BaseClient(resolvedConfig);
2562
3317
  this.twitter = new TwitterClient(this.baseClient);
2563
3318
  this.web = new WebClient(this.baseClient);
3319
+ this.vinted = new VintedClient(this.baseClient);
3320
+ this.google = new GoogleClient(this.baseClient);
2564
3321
  }
2565
3322
  };
2566
3323
 
2567
- export { AccountRestrictedError, AuthenticationError, CommunitiesClient, ConflictError, GeoClient, InsufficientCreditsError, ListsClient, NotFoundError, RateLimitError, ScrapeBadger, ScrapeBadgerError, ServerError, SpacesClient, StreamClient, TimeoutError, TrendsClient, TweetsClient, TwitterClient, UsersClient, ValidationError, WebClient, WebSocketStreamError, collectAll, verifyWebhookSignature };
3324
+ export { AccountRestrictedError, AuthenticationError, CommunitiesClient, ConflictError, GeoClient, AiModeClient as GoogleAiModeClient, AutocompleteClient as GoogleAutocompleteClient, GoogleClient, FinanceClient as GoogleFinanceClient, FlightsClient as GoogleFlightsClient, HotelsClient as GoogleHotelsClient, ImagesClient as GoogleImagesClient, JobsClient as GoogleJobsClient, LensClient as GoogleLensClient, MapsClient as GoogleMapsClient, NewsClient as GoogleNewsClient, PatentsClient as GooglePatentsClient, ProductsClient as GoogleProductsClient, ScholarClient as GoogleScholarClient, SearchClient2 as GoogleSearchClient, ShoppingClient as GoogleShoppingClient, ShortsClient as GoogleShortsClient, TrendsClient2 as GoogleTrendsClient, VideosClient as GoogleVideosClient, InsufficientCreditsError, ListsClient, NotFoundError, RateLimitError, ScrapeBadger, ScrapeBadgerError, ServerError, SpacesClient, StreamClient, TimeoutError, TrendsClient, TweetsClient, TwitterClient, UsersClient, ValidationError, VintedClient, ItemsClient as VintedItemsClient, ReferenceClient as VintedReferenceClient, SearchClient as VintedSearchClient, UsersClient2 as VintedUsersClient, WebClient, WebSocketStreamError, collectAll, verifyWebhookSignature };
2568
3325
  //# sourceMappingURL=index.mjs.map
2569
3326
  //# sourceMappingURL=index.mjs.map