diff --git a/GENERATION_REPORT.md b/GENERATION_REPORT.md index 39ba047..cd666ed 100644 --- a/GENERATION_REPORT.md +++ b/GENERATION_REPORT.md @@ -1,8 +1,8 @@ # Generation Report -Generated at: 2026-06-24T08:08:48Z +Generated at: 2026-08-16T07:12:12Z -## APIs generated (48) +## APIs generated (55) - airbnb-listing - airbnb-property - amazon-product @@ -16,7 +16,9 @@ Generated at: 2026-06-24T08:08:48Z - yellowpages-place - yellowpages-search - yelp-place +- yelp-reviews - yelp-search +- duckduckgo - google-images - google-maps - google-maps-contributor-reviews @@ -35,7 +37,6 @@ Generated at: 2026-06-24T08:08:48Z - google-flights - google-hotels - google-trends -- instagram-profile - glassdoor-job - glassdoor-listing - indeed-job @@ -44,6 +45,12 @@ Generated at: 2026-06-24T08:08:48Z - redfin-property - shopify-collections - shopify-products +- instagram-posts +- instagram-profile +- tiktok-comments +- tiktok-posts +- tiktok-profile +- tiktok-search - web-scraping - youtube-channel-api - youtube-search-api diff --git a/cmd/gen_bing_serp.go b/cmd/gen_bing_serp.go index 94b5057..c29a1d6 100644 --- a/cmd/gen_bing_serp.go +++ b/cmd/gen_bing_serp.go @@ -20,7 +20,6 @@ var ( func newBingSerpCmd() *cobra.Command { var p_ccVar string - var p_countVar int var p_deviceTypeVar string var p_filtersVar string var p_firstVar int @@ -29,12 +28,13 @@ func newBingSerpCmd() *cobra.Command { var p_lonVar string var p_mktVar string var p_qVar string - var p_safeVar string + var p_safeSearchVar string + var p_setLangVar string cmd := &cobra.Command{ Use: "bing-serp", Short: "Bing SERP API (10 credits/call)", - Long: "The Bing SERP API provides real-time access to structured Bing search results, offering no blocks or CAPTCHAs.\n\nEndpoint: GET https://api.hasdata.com/scrape/bing/serp\nCost: 10 credits per call.", + Long: "The Bing SERP API provides real-time access to structured Bing search results with a high success rate at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/bing/serp\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("device-type") { @@ -42,8 +42,8 @@ func newBingSerpCmd() *cobra.Command { return err } } - if c.Flags().Changed("safe") { - if err := validateEnumString("safe", p_safeVar, []string{"off", "moderate", "strict"}); err != nil { + if c.Flags().Changed("safe-search") { + if err := validateEnumString("safe-search", p_safeSearchVar, []string{"off", "moderate", "strict"}); err != nil { return err } } @@ -59,9 +59,6 @@ func newBingSerpCmd() *cobra.Command { if c.Flags().Changed("cc") { params.Set("cc", p_ccVar) } - if c.Flags().Changed("count") { - params.Set("count", strconv.Itoa(p_countVar)) - } if c.Flags().Changed("device-type") { params.Set("deviceType", p_deviceTypeVar) } @@ -84,8 +81,11 @@ func newBingSerpCmd() *cobra.Command { params.Set("mkt", p_mktVar) } params.Set("q", p_qVar) - if c.Flags().Changed("safe") { - params.Set("safe", p_safeVar) + if c.Flags().Changed("safe-search") { + params.Set("safeSearch", p_safeSearchVar) + } + if c.Flags().Changed("set-lang") { + params.Set("setLang", p_setLangVar) } resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/bing/serp", params, nil) if err != nil { @@ -95,7 +95,6 @@ func newBingSerpCmd() *cobra.Command { }, } cmd.Flags().StringVar(&p_ccVar, "cc", "", "cc Country: The two-letter country code for the country to search from.") - cmd.Flags().IntVar(&p_countVar, "count", 0, "count Number of Results: Number of results per page, ranging from 1 to 50.") cmd.Flags().StringVar(&p_deviceTypeVar, "device-type", "desktop", "deviceType Device: Specify the device type for the search. [allowed: desktop|mobile|tablet]") _ = cmd.RegisterFlagCompletionFunc("device-type", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { return []string{"desktop", "mobile", "tablet"}, cobra.ShellCompDirectiveNoFileComp @@ -103,15 +102,16 @@ func newBingSerpCmd() *cobra.Command { cmd.Flags().StringVar(&p_filtersVar, "filters", "", "filters Additional Filtering: Allows applying various filters to narrow search results, including date-based options:\n\n - `ex1:\"ez1\"` – past 24 hours\n - `ex1:\"ez2\"` – past week\n - `ex1:\"ez3\"` – past month\n\nFor complex filters, run a Bing search and copy the filters parameter from the URL.\n") cmd.Flags().IntVar(&p_firstVar, "first", 0, "first Result Offset: This parameter specifies the number of search results to skip and is used for implementing pagination. For example, a value of 1 (default) indicates the first page of results, 11 refers to the second page, and 21 to the third page.\n") cmd.Flags().StringVar(&p_latVar, "lat", "", "lat Latitude: GPS latitude for the search origin.") - cmd.Flags().StringVar(&p_locationVar, "location", "Austin,Texas,United States", "location Location: Defines the search’s origin location. For realistic results, set location at the city level. If omitted, the proxy’s location may be used.") + cmd.Flags().StringVar(&p_locationVar, "location", "Austin, Texas, United States", "location Location: Defines the search’s origin location as free text (e.g. `Austin, Texas`). It is resolved to coordinates to localize the results. For realistic results, set location at the city level. If both `lat` and `lon` are provided, they take precedence and `location` is ignored. If omitted, the proxy’s location may be used.") cmd.Flags().StringVar(&p_lonVar, "lon", "", "lon Longitude: GPS longitude for the search origin.") cmd.Flags().StringVar(&p_mktVar, "mkt", "", "mkt Market Code: The two-letter country code for the country to search from.") cmd.Flags().StringVar(&p_qVar, "q", "Coffee", "q Search Query: Specify the search term for which you want to scrape the SERP. (required)") _ = cmd.MarkFlagRequired("q") - cmd.Flags().StringVar(&p_safeVar, "safe", "", "safe Adult Content Filtering: Adult Content Filtering option. [allowed: off|moderate|strict]") - _ = cmd.RegisterFlagCompletionFunc("safe", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + cmd.Flags().StringVar(&p_safeSearchVar, "safe-search", "", "safeSearch Adult Content Filtering: Adult Content Filtering option. [allowed: off|moderate|strict]") + _ = cmd.RegisterFlagCompletionFunc("safe-search", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { return []string{"off", "moderate", "strict"}, cobra.ShellCompDirectiveNoFileComp }) + cmd.Flags().StringVar(&p_setLangVar, "set-lang", "", "setLang Interface Language: The language of the user interface and preferred result language. Accepts a two-letter language code (e.g. `en`, `de`) or a locale/script variant (e.g. `en-gb`, `zh-hans`, `pt-br`).") return cmd } diff --git a/cmd/gen_booking_place.go b/cmd/gen_booking_place.go index f5b975b..e2be790 100644 --- a/cmd/gen_booking_place.go +++ b/cmd/gen_booking_place.go @@ -31,7 +31,7 @@ func newBookingPlaceCmd() *cobra.Command { cmd := &cobra.Command{ Use: "booking-place", - Short: "Booking.com Place API (10 credits/call)", + Short: "Booking.com Place Scraper API (10 credits/call)", Long: "The Booking.com Place API returns full details for a single Booking.com property along with the list of available room suites for the requested stay dates and guest composition.\n\nEndpoint: GET https://api.hasdata.com/scrape/booking/place\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { diff --git a/cmd/gen_booking_search.go b/cmd/gen_booking_search.go index 094e4c7..1945f62 100644 --- a/cmd/gen_booking_search.go +++ b/cmd/gen_booking_search.go @@ -50,7 +50,7 @@ func newBookingSearchCmd() *cobra.Command { cmd := &cobra.Command{ Use: "booking-search", - Short: "Booking.com Search API (10 credits/call)", + Short: "Booking.com Search Scraper API (10 credits/call)", Long: "The Booking.com Search API returns the collection of accommodations from a Booking.com search results page for a given destination and stay dates, with rich filtering by property type, rating, facilities, price and more.\n\nEndpoint: GET https://api.hasdata.com/scrape/booking/search\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { diff --git a/cmd/gen_duckduckgo.go b/cmd/gen_duckduckgo.go new file mode 100644 index 0000000..285e7b7 --- /dev/null +++ b/cmd/gen_duckduckgo.go @@ -0,0 +1,126 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newDuckduckgoCmd() *cobra.Command { + var p_ccVar string + var p_deviceTypeVar string + var p_klVar string + var p_nextPageTokenVar string + var p_qVar string + var p_safeSearchVar string + var p_setLangVar string + + cmd := &cobra.Command{ + Use: "duckduckgo", + Short: "DuckDuckGo SERP API (10 credits/call)", + Long: "The DuckDuckGo SERP API provides real-time access to structured DuckDuckGo search results with a high success rate at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/duckduckgo/serp\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + if c.Flags().Changed("cc") { + if err := validateEnumString("cc", p_ccVar, []string{"ar", "au", "at", "be", "br", "ca", "cl", "dk", "fi", "fr", "de", "hk", "in", "id", "it", "jp", "kr", "my", "mx", "nl", "nz", "no", "cn", "pl", "pt", "ph", "ru", "sa", "za", "es", "se", "ch", "tw", "tr", "gb", "us"}); err != nil { + return err + } + } + if c.Flags().Changed("device-type") { + if err := validateEnumString("device-type", p_deviceTypeVar, []string{"desktop", "mobile", "tablet"}); err != nil { + return err + } + } + if c.Flags().Changed("kl") { + if err := validateEnumString("kl", p_klVar, []string{"ar-es", "au-en", "at-de", "be-nl", "be-fr", "br-pt", "ca-en", "ca-fr", "cl-es", "dk-da", "fi-fi", "fr-fr", "de-de", "hk-tzh", "in-en", "id-en", "it-it", "jp-jp", "kr-kr", "my-en", "mx-es", "nl-nl", "nz-en", "no-no", "cn-zh", "pl-pl", "ph-en", "ru-ru", "za-en", "es-es", "se-sv", "ch-de", "tw-tzh", "tr-tr", "uk-en", "us-en", "wt-wt"}); err != nil { + return err + } + } + if c.Flags().Changed("safe-search") { + if err := validateEnumString("safe-search", p_safeSearchVar, []string{"off", "moderate", "strict"}); err != nil { + return err + } + } + if c.Flags().Changed("set-lang") { + if err := validateEnumString("set-lang", p_setLangVar, []string{"ar", "ca", "zh-hans", "zh-hant", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "he", "hu", "it", "ja", "ko", "lv", "lt", "nb", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr", "uk", "vi"}); err != nil { + return err + } + } + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + if c.Flags().Changed("cc") { + params.Set("cc", p_ccVar) + } + if c.Flags().Changed("device-type") { + params.Set("deviceType", p_deviceTypeVar) + } + if c.Flags().Changed("kl") { + params.Set("kl", p_klVar) + } + if c.Flags().Changed("next-page-token") { + params.Set("nextPageToken", p_nextPageTokenVar) + } + if c.Flags().Changed("q") { + params.Set("q", p_qVar) + } + if c.Flags().Changed("safe-search") { + params.Set("safeSearch", p_safeSearchVar) + } + if c.Flags().Changed("set-lang") { + params.Set("setLang", p_setLangVar) + } + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/duckduckgo/serp", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_ccVar, "cc", "", "cc Country: The two-letter country code for the country to search from. Combined with `setLang` to form the DuckDuckGo region. Ignored if `kl` is set. [allowed: ar|au|at|be|br|ca|cl|dk|fi|fr|de|hk|in|id|it|jp|kr|my|mx|nl|nz|no|cn|pl|pt|ph|ru|sa|za|es|se|ch|tw|tr|gb|us]") + _ = cmd.RegisterFlagCompletionFunc("cc", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"ar", "au", "at", "be", "br", "ca", "cl", "dk", "fi", "fr", "de", "hk", "in", "id", "it", "jp", "kr", "my", "mx", "nl", "nz", "no", "cn", "pl", "pt", "ph", "ru", "sa", "za", "es", "se", "ch", "tw", "tr", "gb", "us"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().StringVar(&p_deviceTypeVar, "device-type", "desktop", "deviceType Device: Specify the device type for the search. [allowed: desktop|mobile|tablet]") + _ = cmd.RegisterFlagCompletionFunc("device-type", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"desktop", "mobile", "tablet"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().StringVar(&p_klVar, "kl", "", "kl Region: DuckDuckGo region code in `-` form (e.g. `us-en`, `de-de`). Sets country and interface language at once; takes precedence over `cc`/`setLang`. Use `wt-wt` for no region. [allowed: ar-es|au-en|at-de|be-nl|be-fr|br-pt|ca-en|ca-fr|cl-es|dk-da|fi-fi|fr-fr|de-de|hk-tzh|in-en|id-en|it-it|jp-jp|kr-kr|my-en|mx-es|nl-nl|nz-en|no-no|cn-zh|pl-pl|ph-en|ru-ru|za-en|es-es|se-sv|ch-de|tw-tzh|tr-tr|uk-en|us-en|wt-wt]") + _ = cmd.RegisterFlagCompletionFunc("kl", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"ar-es", "au-en", "at-de", "be-nl", "be-fr", "br-pt", "ca-en", "ca-fr", "cl-es", "dk-da", "fi-fi", "fr-fr", "de-de", "hk-tzh", "in-en", "id-en", "it-it", "jp-jp", "kr-kr", "my-en", "mx-es", "nl-nl", "nz-en", "no-no", "cn-zh", "pl-pl", "ph-en", "ru-ru", "za-en", "es-es", "se-sv", "ch-de", "tw-tzh", "tr-tr", "uk-en", "us-en", "wt-wt"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Opaque token returned in each response as `nextPageToken`. Pass it back (in place of `q`) to fetch the next page of results. It carries a pre-signed page URL bound to the original request's session, so it must be used as-is and cannot be constructed manually. Absent when there are no further pages.\n") + cmd.Flags().StringVar(&p_qVar, "q", "Coffee", "q Search Query: Specify the search term for which you want to scrape the SERP. Required unless `nextPageToken` is provided (which carries the query of the page it continues).") + cmd.Flags().StringVar(&p_safeSearchVar, "safe-search", "", "safeSearch Adult Content Filtering: Adult Content Filtering option. [allowed: off|moderate|strict]") + _ = cmd.RegisterFlagCompletionFunc("safe-search", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"off", "moderate", "strict"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().StringVar(&p_setLangVar, "set-lang", "", "setLang Interface Language: The preferred result/interface language code — usually two letters (e.g. `en`, `de`), with script-tag variants for some languages (e.g. `zh-hans`, `zh-hant`). Combined with `cc` to form the DuckDuckGo region. Ignored if `kl` is set. [allowed: ar|ca|zh-hans|zh-hant|hr|cs|da|nl|en|et|fi|fr|de|he|hu|it|ja|ko|lv|lt|nb|pl|pt|ro|ru|sk|sl|es|sv|th|tr|uk|vi]") + _ = cmd.RegisterFlagCompletionFunc("set-lang", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"ar", "ca", "zh-hans", "zh-hant", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "he", "hu", "it", "ja", "ko", "lv", "lt", "nb", "pl", "pt", "ro", "ru", "sk", "sl", "es", "sv", "th", "tr", "uk", "vi"}, cobra.ShellCompDirectiveNoFileComp + }) + + return cmd +} + +func init() { + RegisterAPICommand("duckduckgo", "DuckDuckGo", newDuckduckgoCmd()) +} diff --git a/cmd/gen_google_images.go b/cmd/gen_google_images.go index 8fb1e1c..42435ed 100644 --- a/cmd/gen_google_images.go +++ b/cmd/gen_google_images.go @@ -34,7 +34,7 @@ func newGoogleImagesCmd() *cobra.Command { cmd := &cobra.Command{ Use: "google-images", Short: "Google Images API (5 credits/call)", - Long: "Provides real-time access to Google image search results, tailored to specific parameters, ensuring efficient retrieval free from blocks or CAPTCHAs.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/images\nCost: 5 credits per call.", + Long: "Provides real-time access to Google image search results, tailored to specific parameters, ensuring efficient and reliable retrieval at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/images\nCost: 5 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("device-type") { diff --git a/cmd/gen_google_immersive_product.go b/cmd/gen_google_immersive_product.go index 531ff95..23ae29b 100644 --- a/cmd/gen_google_immersive_product.go +++ b/cmd/gen_google_immersive_product.go @@ -54,7 +54,7 @@ func newGoogleImmersiveProductCmd() *cobra.Command { } cmd.Flags().BoolVar(&p_moreStoresVar, "more-stores", false, "moreStores Fetch More Stores: Fetch additional store results in a single search. By default it returns 3–5 stores, and when true it returns up to 13 or the maximum available for the product.") cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Stores Next Page Token: Token used to retrieve the next page of store results.") - cmd.Flags().StringVar(&p_pageTokenVar, "page-token", "eyJyZHMiOiJQQ18zMjQ1NDc2NDAwODMzNTUxOTQ4fFBST0RfUENfMzI0NTQ3NjQwMDgzMzU1MTk0OCIsInByb2R1Y3RpZCI6IjEyNTE4MTc2MDIxNjEyNzgxNzUyIiwiY2F0YWxvZ2lkIjoiMTY5MTQ4Nzc2MjUyODA5Nzc4NjUiLCJoZWFkbGluZU9mZmVyRG9jaWQiOiIxNzc2Njg4MTE3MjA4NzEzODU1NSIsImltYWdlRG9jaWQiOiIzNTQ4NDgyNzk5NTQyMzA0NzkxIiwiZ3BjaWQiOiIzMjQ1NDc2NDAwODMzNTUxOTQ4IiwibWlkIjoiNTc2NDYyNjEyMjgwMTMwNDgxIiwicSI6ImNvZmZlZSIsImhsIjoiZW4iLCJnbCI6InVzIiwiY29va2llcyI6Il9fU2VjdXJlLVNUUlA9QUVFUDdnTDhveTExMkFEcGdEZkdDVmtjdXVRMHNmal8ySlhHaktsbHVQVjhxTHBLVTg3UlN6RmJKd0FvYkNjWjVQUU8tYmJZdGRGd1JDYnBHWmFmVzdnc0ZaYjlQM3VPaF9kSTsgQUVDPUFhSm1hNXVoaGE4ZTdjUnF6cThoZG1Na3ExSmk2MGE4MU1kRkQ1Z2M0Szd4WjZaRnQ0S05RYVJLVkpJOyBOSUQ9NTMxPWcySHJDN296elVZUnVraDhFT1NzakN3QWw0cEFWN25mYkNvcVlnWEVmdVNEUWxWLW80WVZZamxvOTh3cW5taHoxWWQ4NF9jUkFhWlZBV1A4dTVkUzNOVHhKVG9ZcjlNbkI1S3h0R0NESWR4azAya2tGajhGbkdfalAzNGQwM0haR1RjNkV4SWpldlBGREQ5X2xCM1VpNmRabmhoLVlveXN6SUxLVTkwT1MxekZBdHJnNFU1NUE4YWVlVFdlQW5ieEgzSGUxTHRSSFY0UVc4Y2d3Vzc0dW45bTZpdThaaldDZVp0QUhoS0ZsbDdycTJGbG1ybDRRdTV6UGxzIiwieHNyZiI6IkFLUE9yMVM2YmtDejdIcEM0WVo0U2VmNzY4RWE0YnhLbGc6MTc3OTI2ODI0NjMxNCIsIm9hcHZmYyI6IkVvd0RDc3dDUVUxdU15MTVWR1JQTjNrNWJEWndTa1JQT0RWemVpMXJaSFF6YUU1SlVteGlSRE00Wm1WRWVVTXRjakZHYVcxM1lpMW9TRVU1T0ZJeU5UbGhTRXBvTlZKNVdrUTBjMHBKWHkxM1ZEVXhOVlowV25OdFMydFlYMUYzTlZKUmQycFNkREJtYlhWV01IcEdWSG95YVVsWWMzcGpWWGhDU0hJd2ExQmZPRW80YmpWdmNsVmFVR056UWsxMVNEUllkSGc1ZWxKSU9WbzBTMnhSZVhKTlRqZG9UMFIzUmpkT00wSjNWMUYwTmpsUFQxVkplRUZZVERKeFh6ZzBNVU4zTUZseGFqWmhkakp2VEZKSWQzbGZUVUU0WjBoUWRHMHpUMVZvU0cxRVJFbDZTMmhYTFRoa1JsRnRha1ZhVmt0d1pXZE1hMUpYT1ZrdExYbDZjMHhIZFhCSlR6VXhXa1JZTWxoU2VFaE5SRlphYVZOVE9YWklSMUpxU25WSVVsOU9RV1JOU1dSNVZYYzRiMHc1YVVkVFNsUjZSVGgwTjFaNVdHVlJiR1Y1VUZaTFpETjJhR3h2Y0djdGNUSkRhbGNTRjJ4WWIwNWhkbGd4VFUxVGVuRjBjMUJ3VFU5Mk5sRm5HaUpCU2t0TVJtMUtXV1pGU21GaGQzUktSakEwVEdOclYwTmlia281VkhwdWF6Rm4ifQ", "pageToken Page Token: Token for displaying more product info in the Google immersive pop-up, available in the Google Shopping API response as the `immersiveProductPageToken` property. (required)") + cmd.Flags().StringVar(&p_pageTokenVar, "page-token", "eyJyZHMiOiJQQ18zMjQ1NDc2NDAwODMzNTUxOTQ4fFBST0RfUENfMzI0NTQ3NjQwMDgzMzU1MTk0OCIsInByb2R1Y3RpZCI6IjE2NTYxODg2MzMwNjI5NzA1MjY5IiwiY2F0YWxvZ2lkIjoiMTA5MDU3MjEzODE1NDM1NDgwMCIsImhlYWRsaW5lT2ZmZXJEb2NpZCI6IjEwNTQwMDUxMzg0NjEzOTczOTg1IiwiaW1hZ2VEb2NpZCI6IjE3MjMwMzM3NDkwMTYzODIyNjMiLCJncGNpZCI6IjgyOTk1MTI3NTExOTg2NzE2MjIiLCJtaWQiOiI1NzY0NjI2MTIyODAxMzA0ODEiLCJxIjoiYnV5IGNvZmZlZSIsImhsIjoiZW4iLCJnbCI6InVzIiwiY29va2llcyI6Il9fU2VjdXJlLVNUUlA9QU5tWndhMHZsZUx5TFN3SDZKcmFHRU15RGxnbEhJN3NJelN2NFVJcXhZUDhFQk5kd1FXNTRoRHVsX3RZRl9hSFBsQjM3ajhNMWZRY1NwOVhTMy1icmVOdzIwa1RybjhnajhCaDsgQUVDPUFkSlZFYXR5TE1ZbHktUk5IRGxTVm04MGkySWRhWm4yeE5mWlVBX3JzV3pDX0xyTFFTeUwzTGJ3TkJnOyBOSUQ9NTMyPWtadG5CQnpoNE02cU5lTW9VM1Rjekd1d0VKdmtkcjBZMzFFbmNPTlZUT084TmlVX0oyUTVucmR3Q0dWUU5pWVlvWUROSEdWTE9BdUd0SWI2ZjEwSDk3OHM3bk9hajFFTVN1ellIaDVTMzdDTkJDZkdwLWlmcThVenV4aHR3TTR0YmNidXdnbVBNUHJHeXBlMS1aQmZtTEVCOXpTam9aMFpGOUZHQ3ZQdkc3aGdXZzRCcndvb1RYclhnTHdhc3BtYXpUVi1YYUg1bzJjV2lUNTUwc0dHNG5pRVpYLUI1aFZsbllYQ1QxZU91LXU0Tjk4MXQtUnYzYi1RZS1nTGV2NmV4ZGNFdlE7IERWPU02U2J0ZDljdGtvc1VKSEhKMHhOMXZfa3lxX0M5Tm42MHAxSjhPd3dCd1FBQUFBIiwieHNyZiI6IkFGNXRTTzRGb3VnZDItOVJPN09YU29oMzlvWnhLUzZGNVE6MTc4MzY4OTMxMzM5MiIsIm9hcHZmYyI6IkVvc0RDc3dDUVVwcFZEUjBTMGMwTmxObk16TktTRmxmYW05SlpUbFNNM1ZaVTFJeWJ6ZENlRGgwWm5kRVNGWTFja2hzZFVZNVMzWnVOMVUxYkVSSU1YTlVSMUpyV1VwWFpVWlNUVVY0Y2s5ak1EaElYMWd3UVRaR1RVbzJTVmxpZVdGdU5IRklVV1o0WTJ4d1RVUm1hRFZPT1dSbGFXOVZaVFpNT1ZaT1VXZHJNMlJTTlZNMlQzWlhiSEI1UW01aU5DMHlUR0psYnpWTVJEVkhSazVoYlZkZlVFUmxlbkIwTlc1U2FtRjJOVUprVWkxTloxcFJhbHBsY21kc1VXbDNXVWcxY1dKeFdtTjZWR0ZEVDB0a2RISldTekYwYzB0MVlqaHBiR1o2TFc1cFZsODNjV296VTI5RVgydDVkSE13WlVNNVJVaGhhRTU0WHpKT2ExY3plR3BXY1VGMlJXVjBhVmN5T1ZkNk9WaEVialV5VldVNGNtdHlPVUV4Ym1ZdFNYRjRkM1J3VUMxdFNYUjZORUk0Y3pCV1REUlhkbTVHUldodE1ETnVaaTFNTFZSUlRuUm9PVmRDWDNoaVoyNXVkVWtTRmxsUVFsRmhjV1ZrVFZCWGRIRjBjMUEwV1U5elRWRWFJa0ZFYzNJNVpsRjZSMVpNTkZKR2IwRmhZbmhQWmpSRFRqbHBNRTVCWjAxcFowRSIsInZlcnNpb24iOjJ9", "pageToken Page Token: Token for displaying more product info in the Google immersive pop-up, available in the Google Shopping API response as the `immersiveProductPageToken` property. (required)") _ = cmd.MarkFlagRequired("page-token") return cmd diff --git a/cmd/gen_google_maps.go b/cmd/gen_google_maps.go index 979ae84..288cadc 100644 --- a/cmd/gen_google_maps.go +++ b/cmd/gen_google_maps.go @@ -28,8 +28,8 @@ func newGoogleMapsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "google-maps", - Short: "Google Maps API (5 credits/call)", - Long: "The Google Maps API allows users to retreive business data including business type, phone, address, website, ratings, number of reviews, and more.\n\nEndpoint: GET https://api.hasdata.com/scrape/google-maps/search\nCost: 5 credits per call.", + Short: "Google Maps Search API (5 credits/call)", + Long: "The Google Maps Search API allows users to search for locations using keyword, coordinates, and various filters. The API returns relevant location details and map data.\n\nEndpoint: GET https://api.hasdata.com/scrape/google-maps/search\nCost: 5 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("domain") { diff --git a/cmd/gen_google_maps_reviews.go b/cmd/gen_google_maps_reviews.go index f666592..6faa371 100644 --- a/cmd/gen_google_maps_reviews.go +++ b/cmd/gen_google_maps_reviews.go @@ -33,7 +33,7 @@ func newGoogleMapsReviewsCmd() *cobra.Command { Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("sort-by") { - if err := validateEnumString("sort-by", p_sortByVar, []string{"qualityScore", "newestFirst", "ratingHigh", "ratingLow"}); err != nil { + if err := validateEnumString("sort-by", p_sortByVar, []string{"mostRelevant", "newestFirst", "ratingHigh", "ratingLow"}); err != nil { return err } } @@ -75,9 +75,9 @@ func newGoogleMapsReviewsCmd() *cobra.Command { cmd.Flags().StringVar(&p_hlVar, "hl", "", "hl Language: The two-letter language code for the language you want to use for the search.") cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Defines the next page token. It is used for retrieving the next page results.") cmd.Flags().StringVar(&p_placeIdVar, "place-id", "", "placeId Place ID: Unique reference to a place on a Google Map. Either dataId or placeId should be set.") - cmd.Flags().StringVar(&p_sortByVar, "sort-by", "", "sortBy Sort By: Parameter used for sorting and refining results. [allowed: qualityScore|newestFirst|ratingHigh|ratingLow]") + cmd.Flags().StringVar(&p_sortByVar, "sort-by", "", "sortBy Sort By: Parameter used for sorting and refining results. [allowed: mostRelevant|newestFirst|ratingHigh|ratingLow]") _ = cmd.RegisterFlagCompletionFunc("sort-by", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { - return []string{"qualityScore", "newestFirst", "ratingHigh", "ratingLow"}, cobra.ShellCompDirectiveNoFileComp + return []string{"mostRelevant", "newestFirst", "ratingHigh", "ratingLow"}, cobra.ShellCompDirectiveNoFileComp }) cmd.Flags().StringVar(&p_topicIdVar, "topic-id", "", "topicId Topic ID: Defines the ID of the topic you want to use for filtering reviews.") diff --git a/cmd/gen_google_news.go b/cmd/gen_google_news.go index a74fa8d..ada7dd1 100644 --- a/cmd/gen_google_news.go +++ b/cmd/gen_google_news.go @@ -31,7 +31,7 @@ func newGoogleNewsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "google-news", Short: "Google News API (10 credits/call)", - Long: "The Google News API offers real-time access to comprehensive news articles from Google, enabling users to fetch news based on specific queries, locations, publishers, and various filter options for tailored news feeds.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/news\nCost: 10 credits per call.", + Long: "Real-time access to structured Google News results with a high success rate at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/news\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { return nil diff --git a/cmd/gen_google_serp.go b/cmd/gen_google_serp.go index 3d00065..ccee963 100644 --- a/cmd/gen_google_serp.go +++ b/cmd/gen_google_serp.go @@ -42,7 +42,7 @@ func newGoogleSerpCmd() *cobra.Command { cmd := &cobra.Command{ Use: "google-serp", Short: "Google SERP API (10 credits/call)", - Long: "The Google SERP API provides real-time access to structured Google search results, offering no blocks or CAPTCHAs.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/serp\nCost: 10 credits per call.", + Long: "The Google SERP API provides real-time access to structured Google search results with a high success rate at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/serp\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("device-type") { diff --git a/cmd/gen_google_shopping.go b/cmd/gen_google_shopping.go index 0f8327b..7fa53ef 100644 --- a/cmd/gen_google_shopping.go +++ b/cmd/gen_google_shopping.go @@ -33,7 +33,7 @@ func newGoogleShoppingCmd() *cobra.Command { cmd := &cobra.Command{ Use: "google-shopping", Short: "Google Shopping API (10 credits/call)", - Long: "The Google Shopping API gives real-time access to structured product listings from Google Shopping, with no blocks or CAPTCHAs.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/shopping\nCost: 10 credits per call.", + Long: "The Google Shopping API gives real-time access to structured product listings from Google Shopping with a high success rate at scale.\n\nEndpoint: GET https://api.hasdata.com/scrape/google/shopping\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("device-type") { diff --git a/cmd/gen_instagram_posts.go b/cmd/gen_instagram_posts.go new file mode 100644 index 0000000..1dfe59d --- /dev/null +++ b/cmd/gen_instagram_posts.go @@ -0,0 +1,65 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newInstagramPostsCmd() *cobra.Command { + var p_handleVar string + var p_limitVar int + var p_nextPageTokenVar string + + cmd := &cobra.Command{ + Use: "instagram-posts", + Short: "Instagram Posts Scraper API (5 credits/call)", + Long: "The Instagram Posts Scraper API lets you retrieve the latest posts of a public Instagram account using its handle. It returns posts with captions, hashtags, mentions, likes, comments, and plays counts, image and video URLs, and timestamps, with token-based pagination for retrieving older posts.\n\nEndpoint: GET https://api.hasdata.com/scrape/instagram/posts\nCost: 5 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + params.Set("handle", p_handleVar) + if c.Flags().Changed("limit") { + params.Set("limit", strconv.Itoa(p_limitVar)) + } + if c.Flags().Changed("next-page-token") { + params.Set("nextPageToken", p_nextPageTokenVar) + } + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/instagram/posts", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_handleVar, "handle", "hasdatadotcom", "handle Instagram Handle: The Instagram username of the account whose posts you want to scrape, without the `@` symbol. (required)") + _ = cmd.MarkFlagRequired("handle") + cmd.Flags().IntVar(&p_limitVar, "limit", 12, "limit Results Limit: The maximum number of posts to retrieve per request. Defaults to 12.") + cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Defines the next page token. It is used for retrieving the next page results. Use the `nextPageToken` value returned by the previous response.") + + return cmd +} + +func init() { + RegisterAPICommand("social", "Social", newInstagramPostsCmd()) +} diff --git a/cmd/gen_instagram_profile.go b/cmd/gen_instagram_profile.go index 7303fd0..d3a9567 100644 --- a/cmd/gen_instagram_profile.go +++ b/cmd/gen_instagram_profile.go @@ -51,5 +51,5 @@ func newInstagramProfileCmd() *cobra.Command { } func init() { - RegisterAPICommand("instagram", "Instagram", newInstagramProfileCmd()) + RegisterAPICommand("social", "Social", newInstagramProfileCmd()) } diff --git a/cmd/gen_redfin_listing.go b/cmd/gen_redfin_listing.go index 547e16f..1556c1a 100644 --- a/cmd/gen_redfin_listing.go +++ b/cmd/gen_redfin_listing.go @@ -497,7 +497,7 @@ func newRedfinListingCmd() *cobra.Command { _ = cmd.RegisterFlagCompletionFunc("home-types", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { return []string{"house", "townhouse", "townhome", "condo", "land", "multiFamily", "mobile", "coOp", "other", "apartment"}, cobra.ShellCompDirectiveNoFileComp }) - cmd.Flags().StringVar(&p_keywordVar, "keyword", "33321", "keyword Location: The zipcode used to search for listings. (required)") + cmd.Flags().StringVar(&p_keywordVar, "keyword", "33321", "keyword Location: The location to search for listings. Accepts a zipcode (`33321`), a city (`Austin` or `Austin, TX`), a neighborhood (`East Austin`), a school (`BASIS Austin`), a school district (`Austin Independent School District`), an apartment building by its name (`Maizon Brickell`), or a full street address (`5805 Woodview Ave, Austin, TX 78756`), including a single unit (`221 SW 12th St Unit 1716, Miami, FL`). An address or a building returns a single property card instead of a list of listings, and the `type` parameter does not apply to it. (required)") _ = cmd.MarkFlagRequired("keyword") cmd.Flags().StringSliceVar(&p_listingType_categoryVar, "listing-type-category", nil, "listingType[category][] Listing Category: An array of listing categories.") _ = cmd.RegisterFlagCompletionFunc("listing-type-category", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { diff --git a/cmd/gen_tiktok_comments.go b/cmd/gen_tiktok_comments.go new file mode 100644 index 0000000..2f6e0a2 --- /dev/null +++ b/cmd/gen_tiktok_comments.go @@ -0,0 +1,65 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newTiktokCommentsCmd() *cobra.Command { + var p_commentIdVar string + var p_nextPageTokenVar string + var p_videoIdVar string + + cmd := &cobra.Command{ + Use: "tiktok-comments", + Short: "TikTok Comments Scraper API (10 credits/call)", + Long: "The TikTok Comments Scraper API returns the comments on a public TikTok video, or the replies to a specific comment. Each comment includes its text, like count, timestamp, reply count, and author (with links to the author's profile and posts). Results are paginated with a token.\n\nEndpoint: GET https://api.hasdata.com/scrape/tiktok/comments\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + if c.Flags().Changed("comment-id") { + params.Set("commentId", p_commentIdVar) + } + if c.Flags().Changed("next-page-token") { + params.Set("nextPageToken", p_nextPageTokenVar) + } + params.Set("videoId", p_videoIdVar) + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/tiktok/comments", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_commentIdVar, "comment-id", "", "commentId Comment ID: When provided, returns the replies to this comment instead of the video's top-level comments.") + cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Defines the next page token. Use the `nextPageToken` value returned by the previous response. Omit it to fetch the first page.") + cmd.Flags().StringVar(&p_videoIdVar, "video-id", "7667749432279977230", "videoId Video ID: The numeric id of the video (the number after `/video/` in a TikTok URL). (required)") + _ = cmd.MarkFlagRequired("video-id") + + return cmd +} + +func init() { + RegisterAPICommand("social", "Social", newTiktokCommentsCmd()) +} diff --git a/cmd/gen_tiktok_posts.go b/cmd/gen_tiktok_posts.go new file mode 100644 index 0000000..8453b3a --- /dev/null +++ b/cmd/gen_tiktok_posts.go @@ -0,0 +1,60 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newTiktokPostsCmd() *cobra.Command { + var p_handleVar string + var p_nextPageTokenVar string + + cmd := &cobra.Command{ + Use: "tiktok-posts", + Short: "TikTok Posts Scraper API (10 credits/call)", + Long: "The TikTok Posts Scraper API lets you retrieve the videos of a public TikTok account using its handle. It returns each video with description, hashtags, mentions, like/comment/share/play counts, cover and playable video URLs, music, and timestamp. Results are paginated with a token — pass the `nextPageToken` from a response to fetch the next page.\n\nEndpoint: GET https://api.hasdata.com/scrape/tiktok/posts\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + params.Set("handle", p_handleVar) + if c.Flags().Changed("next-page-token") { + params.Set("nextPageToken", p_nextPageTokenVar) + } + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/tiktok/posts", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_handleVar, "handle", "tiktok", "handle TikTok Handle: The TikTok username of the account whose videos you want to scrape, with or without the `@` symbol. (required)") + _ = cmd.MarkFlagRequired("handle") + cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Defines the next page token. It is used for retrieving the next page of results. Use the `nextPageToken` value returned by the previous response. Omit it to fetch the first page.") + + return cmd +} + +func init() { + RegisterAPICommand("social", "Social", newTiktokPostsCmd()) +} diff --git a/cmd/gen_tiktok_profile.go b/cmd/gen_tiktok_profile.go new file mode 100644 index 0000000..e268441 --- /dev/null +++ b/cmd/gen_tiktok_profile.go @@ -0,0 +1,55 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newTiktokProfileCmd() *cobra.Command { + var p_handleVar string + + cmd := &cobra.Command{ + Use: "tiktok-profile", + Short: "TikTok Profile Scraper API (10 credits/call)", + Long: "The TikTok Profile Scraper API lets you retrieve public profile information for a specific TikTok account using its handle. It returns data such as nickname, bio, followers, likes, videos count, and other visible profile details.\n\nEndpoint: GET https://api.hasdata.com/scrape/tiktok/profile\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + params.Set("handle", p_handleVar) + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/tiktok/profile", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_handleVar, "handle", "nasa", "handle TikTok Handle: The TikTok username of the profile you want to scrape, with or without the `@` symbol. (required)") + _ = cmd.MarkFlagRequired("handle") + + return cmd +} + +func init() { + RegisterAPICommand("social", "Social", newTiktokProfileCmd()) +} diff --git a/cmd/gen_tiktok_search.go b/cmd/gen_tiktok_search.go new file mode 100644 index 0000000..be86812 --- /dev/null +++ b/cmd/gen_tiktok_search.go @@ -0,0 +1,73 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newTiktokSearchCmd() *cobra.Command { + var p_keywordVar string + var p_nextPageTokenVar string + var p_typeVar string + + cmd := &cobra.Command{ + Use: "tiktok-search", + Short: "TikTok Search Scraper API (10 credits/call)", + Long: "The TikTok Search Scraper API lets you search TikTok by keyword for videos or users. Video results include description, hashtags, stats, cover and playable URLs, and author info; user results include nickname, bio, avatar, verified flag, and follower count. Results are paginated with a token.\n\nEndpoint: GET https://api.hasdata.com/scrape/tiktok/search\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + if c.Flags().Changed("type") { + if err := validateEnumString("type", p_typeVar, []string{"video", "user"}); err != nil { + return err + } + } + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + params.Set("keyword", p_keywordVar) + if c.Flags().Changed("next-page-token") { + params.Set("nextPageToken", p_nextPageTokenVar) + } + if c.Flags().Changed("type") { + params.Set("type", p_typeVar) + } + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/tiktok/search", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_keywordVar, "keyword", "dance", "keyword Keyword: The phrase to search for on TikTok. (required)") + _ = cmd.MarkFlagRequired("keyword") + cmd.Flags().StringVar(&p_nextPageTokenVar, "next-page-token", "", "nextPageToken Next Page Token: Defines the next page token. Use the `nextPageToken` value returned by the previous response. Omit it to fetch the first page.") + cmd.Flags().StringVar(&p_typeVar, "type", "", "type Result Type: What to search for — videos or users. Defaults to video. [allowed: video|user]") + _ = cmd.RegisterFlagCompletionFunc("type", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"video", "user"}, cobra.ShellCompDirectiveNoFileComp + }) + + return cmd +} + +func init() { + RegisterAPICommand("social", "Social", newTiktokSearchCmd()) +} diff --git a/cmd/gen_web_scraping.go b/cmd/gen_web_scraping.go index b5c4d1b..55ed358 100644 --- a/cmd/gen_web_scraping.go +++ b/cmd/gen_web_scraping.go @@ -50,7 +50,7 @@ func newWebScrapingCmd() *cobra.Command { cmd := &cobra.Command{ Use: "web-scraping", Short: "Web Scraping API (10 credits/call)", - Long: "If you're tired of fiddling with proxies, headless browsers and captchas, it's time to use Scrape-it.cloud. Send the desired URL and we'll return an HTML response. Work without headaches and worries about blocking.\n\nEndpoint: POST https://api.hasdata.com/scrape/web\nCost: 10 credits per call.", + Long: "Web Scraping API allows you to scrape web pages without the hassle of managing proxies and headless browsers. Simply send the URL and get the HTML response in return.\n\n\nEndpoint: POST https://api.hasdata.com/scrape/web\nCost: 10 credits per call.", Args: cobra.NoArgs, PreRunE: func(c *cobra.Command, _ []string) error { if c.Flags().Changed("block-ads") && c.Flags().Changed("no-"+"block-ads") { diff --git a/cmd/gen_yelp_reviews.go b/cmd/gen_yelp_reviews.go new file mode 100644 index 0000000..e416283 --- /dev/null +++ b/cmd/gen_yelp_reviews.go @@ -0,0 +1,111 @@ +// Code generated by internal/gen. DO NOT EDIT. + +package cmd + +import ( + "encoding/json" + "fmt" + "net/url" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + _ = json.Marshal + _ = fmt.Sprintf + _ = url.Values{} + _ = strconv.Itoa +) + +func newYelpReviewsCmd() *cobra.Command { + var p_domainVar string + var p_languageCodeVar string + var p_notRecommendedVar bool + var p_numVar int + var p_placeIdVar string + var p_queryVar string + var p_ratingVar string + var p_sortByVar string + var p_startVar int + + cmd := &cobra.Command{ + Use: "yelp-reviews", + Short: "Yelp Reviews Scraper API (10 credits/call)", + Long: "The Yelp Reviews Scraper API allows users to retrieve the review feed of a specific place on Yelp, with filtering by rating, language and keyword.\n\nEndpoint: GET https://api.hasdata.com/scrape/yelp/reviews\nCost: 10 credits per call.", + Args: cobra.NoArgs, + PreRunE: func(c *cobra.Command, _ []string) error { + if c.Flags().Changed("domain") { + if err := validateEnumString("domain", p_domainVar, []string{"www.yelp.com", "www.yelp.co.uk", "www.yelp.ca", "www.yelp.com.au", "ms.yelp.my", "www.yelp.cz", "www.yelp.dk", "www.yelp.de", "www.yelp.at", "de.yelp.ch", "en.yelp.be", "en.yelp.com.hk", "en.yelp.my", "www.yelp.co.nz", "en.yelp.com.ph", "www.yelp.ie", "www.yelp.com.sg", "en.yelp.ch", "www.yelp.com.ar", "www.yelp.cl", "www.yelp.es", "www.yelp.com.mx", "fil.yelp.com.ph", "fr.yelp.be", "fr.yelp.ca", "www.yelp.fr", "fr.yelp.ch", "www.yelp.it", "it.yelp.ch", "nl.yelp.be", "www.yelp.nl", "www.yelp.no", "www.yelp.pl", "www.yelp.com.br", "www.yelp.pt", "fi.yelp.fi", "sv.yelp.fi", "www.yelp.com.tr", "www.yelp.co.jp", "zh.yelp.com.hk", "www.yelp.com.tw"}); err != nil { + return err + } + } + if c.Flags().Changed("sort-by") { + if err := validateEnumString("sort-by", p_sortByVar, []string{"relevanceDesc", "dateDesc", "dateAsc", "ratingDesc", "ratingAsc", "elitesDesc"}); err != nil { + return err + } + } + return nil + }, + RunE: func(c *cobra.Command, _ []string) error { + ctx := c.Context() + cli, err := Client() + if err != nil { + return err + } + params := url.Values{} + if c.Flags().Changed("domain") { + params.Set("domain", p_domainVar) + } + if c.Flags().Changed("language-code") { + params.Set("languageCode", p_languageCodeVar) + } + if c.Flags().Changed("not-recommended") { + params.Set("notRecommended", strconv.FormatBool(p_notRecommendedVar)) + } + if c.Flags().Changed("num") { + params.Set("num", strconv.Itoa(p_numVar)) + } + params.Set("placeId", p_placeIdVar) + if c.Flags().Changed("query") { + params.Set("query", p_queryVar) + } + if c.Flags().Changed("rating") { + params.Set("rating", p_ratingVar) + } + if c.Flags().Changed("sort-by") { + params.Set("sortBy", p_sortByVar) + } + if c.Flags().Changed("start") { + params.Set("start", strconv.Itoa(p_startVar)) + } + resp, err := cli.Do(ctx, "GET", "https://api.hasdata.com/scrape/yelp/reviews", params, nil) + if err != nil { + return err + } + return WriteResponse(c, resp) + }, + } + cmd.Flags().StringVar(&p_domainVar, "domain", "", "domain Domain: Yelp domain to use. Default is `www.yelp.com`. [allowed: www.yelp.com|www.yelp.co.uk|www.yelp.ca|www.yelp.com.au|ms.yelp.my|www.yelp.cz|www.yelp.dk|www.yelp.de|www.yelp.at|de.yelp.ch|en.yelp.be|en.yelp.com.hk|en.yelp.my|www.yelp.co.nz|en.yelp.com.ph|www.yelp.ie|www.yelp.com.sg|en.yelp.ch|www.yelp.com.ar|www.yelp.cl|www.yelp.es|www.yelp.com.mx|fil.yelp.com.ph|fr.yelp.be|fr.yelp.ca|www.yelp.fr|fr.yelp.ch|www.yelp.it|it.yelp.ch|nl.yelp.be|www.yelp.nl|www.yelp.no|www.yelp.pl|www.yelp.com.br|www.yelp.pt|fi.yelp.fi|sv.yelp.fi|www.yelp.com.tr|www.yelp.co.jp|zh.yelp.com.hk|www.yelp.com.tw]") + _ = cmd.RegisterFlagCompletionFunc("domain", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"www.yelp.com", "www.yelp.co.uk", "www.yelp.ca", "www.yelp.com.au", "ms.yelp.my", "www.yelp.cz", "www.yelp.dk", "www.yelp.de", "www.yelp.at", "de.yelp.ch", "en.yelp.be", "en.yelp.com.hk", "en.yelp.my", "www.yelp.co.nz", "en.yelp.com.ph", "www.yelp.ie", "www.yelp.com.sg", "en.yelp.ch", "www.yelp.com.ar", "www.yelp.cl", "www.yelp.es", "www.yelp.com.mx", "fil.yelp.com.ph", "fr.yelp.be", "fr.yelp.ca", "www.yelp.fr", "fr.yelp.ch", "www.yelp.it", "it.yelp.ch", "nl.yelp.be", "www.yelp.nl", "www.yelp.no", "www.yelp.pl", "www.yelp.com.br", "www.yelp.pt", "fi.yelp.fi", "sv.yelp.fi", "www.yelp.com.tr", "www.yelp.co.jp", "zh.yelp.com.hk", "www.yelp.com.tw"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().StringVar(&p_languageCodeVar, "language-code", "en", "languageCode Language: Language of the reviews to return, as a two-letter code (e.g., 'en', 'es', 'fr'). Defaults to en.") + cmd.Flags().BoolVar(&p_notRecommendedVar, "not-recommended", false, "notRecommended Not Recommended: Returns the reviews Yelp does not currently recommend (filtered out of the main feed by its recommendation software) instead of the recommended ones. These reviews carry no photos, videos or reactions, and are paginated ten at a time. Defaults to false.\n") + cmd.Flags().IntVar(&p_numVar, "num", 0, "num Number of Results: Number of reviews to return per page. The maximum is 49. Defaults to 49 for the recommended feed and to 10 when `notRecommended` is set.\n") + cmd.Flags().StringVar(&p_placeIdVar, "place-id", "-4ofMtrD7pSpZIX5pnDkig", "placeId Place ID: The Yelp ID of the place. For example, '-4ofMtrD7pSpZIX5pnDkig'. Yelp IDs can be obtained from the Yelp Search Scraper API. (required)") + _ = cmd.MarkFlagRequired("place-id") + cmd.Flags().StringVar(&p_queryVar, "query", "", "query Search Query: Note: Yelp ignores the `rating` filter while searching, so a query returns matching reviews of every star rating. Free-text query to search within the reviews of the place.\n") + cmd.Flags().StringVar(&p_ratingVar, "rating", "5,4", "rating Rating: Note: Yelp ignores this filter when `query` is set, so a search returns matching reviews of every star rating. Filters the reviews by star rating. Possible values are 5, 4, 3, 2 and 1. To return only five-star reviews, set it to `5`. To include several ratings, pass them comma-separated, for example `5,4,3`. When omitted, reviews with any rating are returned.\n") + cmd.Flags().StringVar(&p_sortByVar, "sort-by", "", "sortBy Sort By: The order in which the reviews are returned. Defaults to relevanceDesc. [allowed: relevanceDesc|dateDesc|dateAsc|ratingDesc|ratingAsc|elitesDesc]") + _ = cmd.RegisterFlagCompletionFunc("sort-by", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { + return []string{"relevanceDesc", "dateDesc", "dateAsc", "ratingDesc", "ratingAsc", "elitesDesc"}, cobra.ShellCompDirectiveNoFileComp + }) + cmd.Flags().IntVar(&p_startVar, "start", 0, "start Result Offset: Result offset for pagination. It skips the given number of reviews, so the step matches `num` (e.g., 0, 49, 98 for the recommended feed, or 0, 10, 20 when `notRecommended` is set).\n") + + return cmd +} + +func init() { + RegisterAPICommand("business", "Business", newYelpReviewsCmd()) +} diff --git a/internal/gen/spec-hash.txt b/internal/gen/spec-hash.txt index 1c478f1..1fee42e 100644 --- a/internal/gen/spec-hash.txt +++ b/internal/gen/spec-hash.txt @@ -1 +1 @@ -f7e64a0a67b5fb781a2a160750b3fee18cd4361c9b3a5107c489d01a168df16f +f01e0fd1bb1fe8e9634e5fd196a8f682b3932f52e03edfc977ed79c277064753 diff --git a/pr-body.md b/pr-body.md index 41e4911..de92a38 100644 --- a/pr-body.md +++ b/pr-body.md @@ -1,44 +1,29 @@ ## Changes - GENERATION_REPORT.md | 2 +- - cmd/gen_airbnb_listing.go | 4 +-- - cmd/gen_airbnb_property.go | 4 +-- - cmd/gen_amazon_product.go | 4 +-- - cmd/gen_amazon_reviews.go | 4 +-- - cmd/gen_amazon_search.go | 4 +-- - cmd/gen_amazon_seller.go | 4 +-- - cmd/gen_amazon_seller_products.go | 4 +-- - cmd/gen_booking_place.go | 4 +-- - cmd/gen_booking_search.go | 4 +-- - cmd/gen_glassdoor_job.go | 4 +-- - cmd/gen_glassdoor_listing.go | 4 +-- - cmd/gen_indeed_job.go | 4 +-- - cmd/gen_indeed_listing.go | 4 +-- - cmd/gen_instagram_profile.go | 4 +-- - cmd/gen_redfin_listing.go | 4 +-- - cmd/gen_redfin_property.go | 4 +-- - cmd/gen_shopify_collections.go | 4 +-- - cmd/gen_shopify_products.go | 4 +-- - cmd/gen_yellowpages_place.go | 4 +-- - cmd/gen_yellowpages_search.go | 4 +-- - cmd/gen_yelp_place.go | 4 +-- - cmd/gen_yelp_search.go | 4 +-- - cmd/gen_youtube_channel_api.go | 4 +-- - cmd/gen_youtube_search_api.go | 4 +-- - cmd/gen_youtube_transcript_api.go | 4 +-- - cmd/gen_youtube_video_api.go | 4 +-- - cmd/gen_zillow_listing.go | 4 +-- - cmd/gen_zillow_property.go | 4 +-- - internal/gen/spec-hash.txt | 2 +- - pr-body.md | 64 --------------------------------------- - 31 files changed, 58 insertions(+), 122 deletions(-) + GENERATION_REPORT.md | 13 ++++-- + cmd/gen_bing_serp.go | 28 ++++++------ + cmd/gen_booking_place.go | 2 +- + cmd/gen_booking_search.go | 2 +- + cmd/gen_google_images.go | 2 +- + cmd/gen_google_immersive_product.go | 2 +- + cmd/gen_google_maps.go | 4 +- + cmd/gen_google_maps_reviews.go | 6 +-- + cmd/gen_google_news.go | 2 +- + cmd/gen_google_serp.go | 2 +- + cmd/gen_google_shopping.go | 2 +- + cmd/gen_instagram_profile.go | 2 +- + cmd/gen_redfin_listing.go | 2 +- + cmd/gen_web_scraping.go | 2 +- + internal/gen/spec-hash.txt | 2 +- + pr-body.md | 90 ------------------------------------- + 16 files changed, 40 insertions(+), 123 deletions(-) ## Generation Report # Generation Report -Generated at: 2026-06-24T08:08:48Z +Generated at: 2026-08-16T07:12:12Z -## APIs generated (48) +## APIs generated (55) - airbnb-listing - airbnb-property - amazon-product @@ -52,7 +37,9 @@ Generated at: 2026-06-24T08:08:48Z - yellowpages-place - yellowpages-search - yelp-place +- yelp-reviews - yelp-search +- duckduckgo - google-images - google-maps - google-maps-contributor-reviews @@ -71,7 +58,6 @@ Generated at: 2026-06-24T08:08:48Z - google-flights - google-hotels - google-trends -- instagram-profile - glassdoor-job - glassdoor-listing - indeed-job @@ -80,6 +66,12 @@ Generated at: 2026-06-24T08:08:48Z - redfin-property - shopify-collections - shopify-products +- instagram-posts +- instagram-profile +- tiktok-comments +- tiktok-posts +- tiktok-profile +- tiktok-search - web-scraping - youtube-channel-api - youtube-search-api