[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6P50GCE0C6CCE3SH4RBVAFF":3,"skill-same:01M6P50GCE0C6CCE3SH4RBVAFF":105},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":25,"commitSha":44,"skillDirectory":45,"forksCount":13,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6P50GCE0C6CCE3SH4RBVAFF","hasdata-cli",null,"Command-line access to search, scraping, and structured web data.","duc-duy-1612\u002FOnline-Delivery-Systems-Web","duc-duy-1612","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F192231384?v=4","01M6NSDKQQDKVTHZ8DZMZ1VYY6","01M6NSDKW8DDVTQHBT1HBDDJPT",0,"MIT","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"hasdata","hasdata cli","cli","access","command-line","line","structured","main","scraping","command","data","https","search","license","official","web","github","safe","2026-11-10 10:12:30",false,"---\nname: hasdata-cli\ndescription: Command-line access to search, scraping, and structured web data.\nrisk: safe\nsource: official\nsource_type: official\nsource_repo: HasData\u002Fhasdata-cli\nlicense: MIT\nlicense_source: \"https:\u002F\u002Fgithub.com\u002FHasData\u002Fhasdata-cli\u002Fblob\u002Fmain\u002FLICENSE\"\ndate_added: \"2026-06-04\"\n---\n\n# hasdata\n\nUse the `hasdata` CLI for real-time web data. One subcommand per API — flags, enums, defaults are derived from the live schema at `api.hasdata.com\u002Fapis`.\n\n## When to Use\n\nUse this skill when:\n\n- The user wants to use the HasData CLI.\n- The user needs current web data from the command line.\n- The user wants to automate data collection in scripts.\n- The user wants to retrieve search, ecommerce, travel, or local business data.\n- The user needs web-page scraping through the CLI.\n\n## Prerequisites\n\n- `command -v hasdata` — if missing, download the installer from `https:\u002F\u002Fraw.githubusercontent.com\u002FHasData\u002Fhasdata-cli\u002Fmain\u002Finstall.sh`, inspect it, then run it locally with `sh install.sh`.\n- One-time setup: the user runs `hasdata configure`, pastes their API key, and it's saved to `~\u002F.hasdata\u002Fconfig.yaml` (mode 0600). Every future call picks it up automatically.\n- If a call fails with `no API key configured`, the user hasn't run `hasdata configure` yet — tell them to. **Never invent a key.**\n\n## Quick start\n\n```bash\nhasdata \u003Capi> --flag value [--flag value ...] --raw | jq .\n```\n\nAlways pass `--raw` when piping to `jq` (skips pretty-print and TTY detection). Use `--pretty` only for human-readable terminal output.\n\n## Picking the right subcommand\n\n| User intent | Subcommand |\n| --- | --- |\n| Web search (\"what does Google say about…\") | `google-serp` (full features) or `google-serp-light` (cheap, single page) |\n| Latest news | `google-news` |\n| AI Mode SERP | `google-ai-mode` |\n| Shopping \u002F product prices | `google-shopping` (broad), `amazon-search` \u002F `amazon-product` (Amazon), `shopify-products` (Shopify) |\n| Immersive product page | `google-immersive-product` |\n| Maps \u002F places \u002F reviews | `google-maps`, `google-maps-place`, `google-maps-reviews`, `google-maps-photos`, `google-maps-posts` |\n| Yelp \u002F YellowPages local data | `yelp-search`, `yelp-place`, `yellowpages-search`, `yellowpages-place` |\n| Real-estate listings (homes for sale\u002Frent\u002Fsold) | `zillow-listing`, `redfin-listing` |\n| Real-estate single property deep dive | `zillow-property`, `redfin-property` |\n| Travel — short-term rentals | `airbnb-listing`, `airbnb-property` |\n| Travel — hotels \u002F lodging | `booking-search`, `booking-place` |\n| Travel — flights | `google-flights` |\n| Jobs | `indeed-listing`, `indeed-job`, `glassdoor-listing`, `glassdoor-job` |\n| Bing search | `bing-serp` |\n| Trends | `google-trends` |\n| Images | `google-images` |\n| Short videos | `google-short-videos` |\n| Events | `google-events` |\n| YouTube search \u002F video \u002F channel \u002F transcript | `youtube-search-api`, `youtube-video-api`, `youtube-channel-api`, `youtube-transcript-api` |\n| Instagram profile | `instagram-profile` |\n| Amazon seller | `amazon-seller`, `amazon-seller-products` |\n| **Scrape a specific URL** | `web-scraping` — supports JS rendering, proxies, markdown output, AI extraction, screenshots |\n\nFor exact flags of a subcommand, run `hasdata \u003Capi> --help` or read the matching file in `references\u002F`.\n\n## Non-obvious triggers (when to reach for hasdata even if the user doesn't say \"scrape\")\n\nThe user often won't ask for a SERP API or a scraper directly. Map these intents to the skill:\n\n- **\"Is this still true?\" \u002F \"What's the latest on X?\" \u002F \"Has Y happened yet?\"** — LLM training data is stale. Run `google-serp` or `google-news` to ground the answer.\n- **\"Summarize this article\" \u002F \"TL;DR this URL\"** — Use `web-scraping --output-format markdown` and feed the markdown into the summary prompt. Beats copy-paste because it strips ads, nav, scripts.\n- **\"Verify this link\" \u002F \"Is this site real?\"** — `web-scraping --url X --no-block-resources` returns status + screenshot. Or `google-serp --q \"site:example.com\"`.\n- **\"What does X say about itself?\"** — Pull the company's own homepage with `web-scraping --output-format markdown`, then summarize.\n- **\"Find me alternatives to X\"** — `google-serp --q \"X alternatives\"` or `google-shopping --q \"X competitors\"`.\n- **\"What's the going rate for X?\"** — `google-shopping` (broad) or `amazon-search` (Amazon-specific) with `jq` to extract the price distribution.\n- **\"Phone number \u002F address for X\"** — `google-maps-place` or `yelp-place`. Don't guess from training data.\n- **\"Are people happy with X service?\" \u002F \"Is X reputable?\"** — `google-maps-reviews --place-id ... --sort lowest` for negative samples; `glassdoor-job` for employer rep.\n- **\"What's the salary range for Y role?\"** — `indeed-listing` filtered by role + location, then `jq` over `.jobs[].salary`.\n- **\"Find me homes\u002Fapartments matching X criteria\"** — `zillow-listing` \u002F `redfin-listing` \u002F `airbnb-listing` with the corresponding filters.\n- **\"Recent sold comps near X\"** — `zillow-listing --type sold --keyword \"X\" --days-on-zillow 12m`.\n- **\"Track this product's price\"** — Loop `amazon-product --asin X` on a schedule; persist `.price` to a file.\n- **\"Summarize \u002F cite this YouTube video\"** — `youtube-transcript-api --v-param VID --raw | jq -r '.transcript[].snippet'` → feed to the summary prompt. Beats title\u002Fthumbnail-based guesses.\n- **\"Find a hotel in $CITY for $DATES under $BUDGET\"** — `booking-search --keyword $CITY --check-in-date X --check-out-date Y --adults 2 --children 0 --rooms 1 --price-max $BUDGET --sort priceLowestFirst`. For one specific property, `booking-place --url ...` returns the full room\u002Frate matrix.\n- **\"What's this channel pushing lately?\"** — `youtube-channel-api --channel-id @handle --tab videos --raw | jq '.sections[].items[] | {title, publishedDate, views: .extractedViews}'`.\n- **\"Does this business have an active offer \u002F event?\"** — `google-maps-posts --place-id X --raw | jq '.posts[] | {postedAt, description, cta}'`. Surfaces current promotions Google indexed.\n- **\"What's trending around X?\"** — `google-trends --q \"X\"` for relative interest; `google-news --q \"X\"` for headlines.\n- **\"Find businesses near me that do X\"** — `google-maps --q \"X\" --ll \"@LAT,LNG,12z\"` then fan out `google-maps-place` for contacts.\n- **\"How does this look in country Y?\"** — `--gl Y` on SERP commands, `--proxy-country Y` on `web-scraping`. Useful for geo-targeted SEO checks, geo-blocked content.\n- **\"Pull structured data from this page\"** — `web-scraping --ai-extract-rules-json '{\"price\": {\"type\": \"number\"}, ...}'`. Works on arbitrary pages without writing CSS selectors.\n- **\"List of items → per-item details\"** — Pattern: search command produces IDs\u002FURLs, pipe through `xargs` into the matching `*-property` \u002F `*-product` \u002F `*-place` deep-dive command.\n- **\"Find this person's role \u002F employer \u002F LinkedIn \u002F followers\"** — `google-serp --q '\"Person Name\" linkedin'` first. The organic-result title is typically `Name — Role at Company | LinkedIn` and the snippet carries location, headline, connection count. SERP often answers the whole question without ever opening the profile page.\n- **\"What is company X doing? Where's their HQ? Who works there?\"** — `google-serp --q \"$COMPANY\"` returns a `.knowledge_graph` block with founder, HQ, founded year, parent, employee range — pre-extracted. `google-news --q \"$COMPANY\"` for recent activity. Specific facts via targeted SERP: `--q '\"$COMPANY\" headquarters'`, `--q '\"$COMPANY\" funding'`, `--q 'site:linkedin.com\u002Fcompany \"$COMPANY\"'`.\n- **\"Find public contact channels for company X\"** — start with SERP: `--q '\"@example.com\"'` often surfaces publicly indexed business addresses. For personal emails or phone numbers, require a legitimate purpose, user authorization, and privacy-law\u002Fterms compliance; disclose unverified guesses.\n- **\"Enrich this CSV of leads\"** — per row: `google-serp` for LinkedIn, role, employer; another SERP to verify email or pattern. Stay in SERP unless a specific field is missing.\n- **Reverse-lookup (email \u002F phone \u002F domain → identity)** — `google-serp` with the literal value in quotes (`--q '\"jane@x.com\"'`, `--q '\"+1 555 123 4567\"'`, `--q '\"acme corp\" site:example.com'`) almost always surfaces the matching person or business.\n\n**SERP-first principle**: for any data-enrichment intent (people, companies, emails, products, places), reach for `google-serp` \u002F `google-news` \u002F `google-shopping` \u002F `google-maps` first. They return Google's already-extracted structured fields (`.knowledge_graph`, `.organic_results[].snippet`, `.local_results[]`, etc.) without direct access to the target site. Only escalate to `web-scraping` when SERP doesn't surface the specific field you need, the data is public or authorized, and the target's terms\u002Faccess controls allow it. See `references\u002Fenrichment.md`.\n\nIf a user request matches one of the above and you don't invoke hasdata, you're probably hallucinating a stale answer.\n\n## Universal flag patterns\n\n- **Kebab-case** flag names. The CLI maps them back to the original camelCase before sending to the API.\n- **Booleans defaulting to `true`** have a paired negation: `--no-block-ads`, `--no-screenshot`, `--no-js-rendering`, `--no-extract-emails`, `--no-block-resources`. Setting both `--block-ads` and `--no-block-ads` errors.\n- **Anything ending in `-json`** accepts:\n    - inline JSON: `--extract-rules-json '{\"title\":\"h1\"}'`\n    - file: `--extract-rules-json @rules.json`\n    - stdin: `cat rules.json | hasdata web-scraping ... --extract-rules-json -`\n- **Repeatable key=value** flags split on the first `=` (so values containing `=` survive): `--headers User-Agent=foo --headers Cookie=session=abc`. Pair with `--headers-json` for a JSON base; kv items override per key.\n- **List flags** accept either repeats or comma-joined: `--lr lang_en --lr lang_fr` or `--lr lang_en,lang_fr`. Serialized as `key[]=value` for GET endpoints.\n- **Enum flags** validate client-side. If you guess wrong, the error lists the allowed values — read the message and retry.\n\n## Global flags (apply to every subcommand)\n\n| Flag | Effect |\n| --- | --- |\n| `--raw` | Write response bytes as-is (use this when piping to `jq`) |\n| `--pretty` | Pretty-print JSON (default when stdout is a TTY) |\n| `-o, --output FILE` | Write response to file instead of stdout (works for binary like screenshots) |\n| `--verbose` | Log outgoing URL and `X-RateLimit-*` headers to stderr |\n| `--api-key KEY` | Override env var (rarely needed) |\n| `--timeout DURATION` | Per-request timeout (default 2m) |\n| `--retries N` | Max retries on 429\u002F5xx (default 2) |\n\n## Output contract\n\nResponses are JSON. Pipe through `jq` for extraction:\n\n```bash\nhasdata google-serp --q \"espresso machine\" --num 10 --raw \\\n  | jq -c '.organic_results[] | {title, link, snippet}'\n```\n\nFor real-estate \u002F e-commerce results, the array shape is API-specific — read a single response with `--pretty` first to learn the schema, then write the `jq` filter.\n\n## Exit codes (script-safe)\n\n| Code | Meaning |\n| --- | --- |\n| 0 | success |\n| 1 | user \u002F CLI-input error (missing required flag, bad enum value, missing API key) |\n| 2 | network error |\n| 3 | API returned 4xx (auth, quota, validation) |\n| 4 | API returned 5xx |\n\n## References\n\n- [`references\u002Fenrichment.md`](references\u002Fenrichment.md) — **person and company enrichment** (LinkedIn lookup, emails, HQ\u002Ffunding\u002Fnews, CSV-row enrichment, reverse-lookup) — the highest-leverage cross-API workflows\n- [`references\u002Fsearch.md`](references\u002Fsearch.md) — Google SERP \u002F Bing \u002F News \u002F Trends flag catalog\n- [`references\u002Fweb-scraping.md`](references\u002Fweb-scraping.md) — `web-scraping` flags, JS scenarios, AI extraction\n- [`references\u002Freal-estate.md`](references\u002Freal-estate.md) — Zillow \u002F Redfin filters and bracketed params\n- [`references\u002Ftravel.md`](references\u002Ftravel.md) — Airbnb \u002F Booking \u002F Google Flights (lodging + transport)\n- [`references\u002Fecommerce.md`](references\u002Fecommerce.md) — Amazon \u002F Shopify\n- [`references\u002Flocal-business.md`](references\u002Flocal-business.md) — Maps (search\u002Fplace\u002Freviews\u002Fphotos\u002Fposts) \u002F Yelp \u002F YellowPages\n- [`references\u002Fjobs.md`](references\u002Fjobs.md) — Indeed \u002F Glassdoor\n- [`references\u002Fyoutube.md`](references\u002Fyoutube.md) — search \u002F video \u002F channel \u002F transcript\n- [`references\u002Fall-commands.md`](references\u002Fall-commands.md) — full subcommand index with credit costs\n\n\n## Limitations\n\n* Requires access to HasData services and valid credentials.\n* Data quality and available fields depend on the target website and extraction method used.\n* Website changes can impact extraction results and may require adjustments to extraction logic.\n* Rate limits, quotas, and account restrictions may apply depending on the endpoint and subscription plan.\n","# hasdata\n\nUse the `hasdata` CLI for real-time web data. One subcommand per API — flags, enums, defaults are derived from the live schema at `api.hasdata.com\u002Fapis`.\n\n## When to Use\n\nUse this skill when:\n\n- The user wants to use the HasData CLI.\n- The user needs current web data from the command line.\n- The user wants to automate data collection in scripts.\n- The user wants to retrieve search, ecommerce, travel, or local business data.\n- The user needs web-page scraping through the CLI.\n\n## Prerequisites\n\n- `command -v hasdata` — if missing, download the installer from `https:\u002F\u002Fraw.githubusercontent.com\u002FHasData\u002Fhasdata-cli\u002Fmain\u002Finstall.sh`, inspect it, then run it locally with `sh install.sh`.\n- One-time setup: the user runs `hasdata configure`, pastes their API key, and it's saved to `~\u002F.hasdata\u002Fconfig.yaml` (mode 0600). Every future call picks it up automatically.\n- If a call fails with `no API key configured`, the user hasn't run `hasdata configure` yet — tell them to. **Never invent a key.**\n\n## Quick start\n\n```bash\nhasdata \u003Capi> --flag value [--flag value ...] --raw | jq .\n```\n\nAlways pass `--raw` when piping to `jq` (skips pretty-print and TTY detection). Use `--pretty` only for human-readable terminal output.\n\n## Picking the right subcommand\n\n| User intent | Subcommand |\n| --- | --- |\n| Web search (\"what does Google say about…\") | `google-serp` (full features) or `google-serp-light` (cheap, single page) |\n| Latest news | `google-news` |\n| AI Mode SERP | `google-ai-mode` |\n| Shopping \u002F product prices | `google-shopping` (broad), `amazon-search` \u002F `amazon-product` (Amazon), `shopify-products` (Shopify) |\n| Immersive product page | `google-immersive-product` |\n| Maps \u002F places \u002F reviews | `google-maps`, `google-maps-place`, `google-maps-reviews`, `google-maps-photos`, `google-maps-posts` |\n| Yelp \u002F YellowPages local data | `yelp-search`, `yelp-place`, `yellowpages-search`, `yellowpages-place` |\n| Real-estate listings (homes for sale\u002Frent\u002Fsold) | `zillow-listing`, `redfin-listing` |\n| Real-estate single property deep dive | `zillow-property`, `redfin-property` |\n| Travel — short-term rentals | `airbnb-listing`, `airbnb-property` |\n| Travel — hotels \u002F lodging | `booking-search`, `booking-place` |\n| Travel — flights | `google-flights` |\n| Jobs | `indeed-listing`, `indeed-job`, `glassdoor-listing`, `glassdoor-job` |\n| Bing search | `bing-serp` |\n| Trends | `google-trends` |\n| Images | `google-images` |\n| Short videos | `google-short-videos` |\n| Events | `google-events` |\n| YouTube search \u002F video \u002F channel \u002F transcript | `youtube-search-api`, `youtube-video-api`, `youtube-channel-api`, `youtube-transcript-api` |\n| Instagram profile | `instagram-profile` |\n| Amazon seller | `amazon-seller`, `amazon-seller-products` |\n| **Scrape a specific URL** | `web-scraping` — supports JS rendering, proxies, markdown output, AI extraction, screenshots |\n\nFor exact flags of a subcommand, run `hasdata \u003Capi> --help` or read the matching file in `references\u002F`.\n\n## Non-obvious triggers (when to reach for hasdata even if the user doesn't say \"scrape\")\n\nThe user often won't ask for a SERP API or a scraper directly. Map these intents to the skill:\n\n- **\"Is this still true?\" \u002F \"What's the latest on X?\" \u002F \"Has Y happened yet?\"** — LLM training data is stale. Run `google-serp` or `google-news` to ground the answer.\n- **\"Summarize this article\" \u002F \"TL;DR this URL\"** — Use `web-scraping --output-format markdown` and feed the markdown into the summary prompt. Beats copy-paste because it strips ads, nav, scripts.\n- **\"Verify this link\" \u002F \"Is this site real?\"** — `web-scraping --url X --no-block-resources` returns status + screenshot. Or `google-serp --q \"site:example.com\"`.\n- **\"What does X say about itself?\"** — Pull the company's own homepage with `web-scraping --output-format markdown`, then summarize.\n- **\"Find me alternatives to X\"** — `google-serp --q \"X alternatives\"` or `google-shopping --q \"X competitors\"`.\n- **\"What's the going rate for X?\"** — `google-shopping` (broad) or `amazon-search` (Amazon-specific) with `jq` to extract the price distribution.\n- **\"Phone number \u002F address for X\"** — `google-maps-place` or `yelp-place`. Don't guess from training data.\n- **\"Are people happy with X service?\" \u002F \"Is X reputable?\"** — `google-maps-reviews --place-id ... --sort lowest` for negative samples; `glassdoor-job` for employer rep.\n- **\"What's the salary range for Y role?\"** — `indeed-listing` filtered by role + location, then `jq` over `.jobs[].salary`.\n- **\"Find me homes\u002Fapartments matching X criteria\"** — `zillow-listing` \u002F `redfin-listing` \u002F `airbnb-listing` with the corresponding filters.\n- **\"Recent sold comps near X\"** — `zillow-listing --type sold --keyword \"X\" --days-on-zillow 12m`.\n- **\"Track this product's price\"** — Loop `amazon-product --asin X` on a schedule; persist `.price` to a file.\n- **\"Summarize \u002F cite this YouTube video\"** — `youtube-transcript-api --v-param VID --raw | jq -r '.transcript[].snippet'` → feed to the summary prompt. Beats title\u002Fthumbnail-based guesses.\n- **\"Find a hotel in $CITY for $DATES under $BUDGET\"** — `booking-search --keyword $CITY --check-in-date X --check-out-date Y --adults 2 --children 0 --rooms 1 --price-max $BUDGET --sort priceLowestFirst`. For one specific property, `booking-place --url ...` returns the full room\u002Frate matrix.\n- **\"What's this channel pushing lately?\"** — `youtube-channel-api --channel-id @handle --tab videos --raw | jq '.sections[].items[] | {title, publishedDate, views: .extractedViews}'`.\n- **\"Does this business have an active offer \u002F event?\"** — `google-maps-posts --place-id X --raw | jq '.posts[] | {postedAt, description, cta}'`. Surfaces current promotions Google indexed.\n- **\"What's trending around X?\"** — `google-trends --q \"X\"` for relative interest; `google-news --q \"X\"` for headlines.\n- **\"Find businesses near me that do X\"** — `google-maps --q \"X\" --ll \"@LAT,LNG,12z\"` then fan out `google-maps-place` for contacts.\n- **\"How does this look in country Y?\"** — `--gl Y` on SERP commands, `--proxy-country Y` on `web-scraping`. Useful for geo-targeted SEO checks, geo-blocked content.\n- **\"Pull structured data from this page\"** — `web-scraping --ai-extract-rules-json '{\"price\": {\"type\": \"number\"}, ...}'`. Works on arbitrary pages without writing CSS selectors.\n- **\"List of items → per-item details\"** — Pattern: search command produces IDs\u002FURLs, pipe through `xargs` into the matching `*-property` \u002F `*-product` \u002F `*-place` deep-dive command.\n- **\"Find this person's role \u002F employer \u002F LinkedIn \u002F followers\"** — `google-serp --q '\"Person Name\" linkedin'` first. The organic-result title is typically `Name — Role at Company | LinkedIn` and the snippet carries location, headline, connection count. SERP often answers the whole question without ever opening the profile page.\n- **\"What is company X doing? Where's their HQ? Who works there?\"** — `google-serp --q \"$COMPANY\"` returns a `.knowledge_graph` block with founder, HQ, founded year, parent, employee range — pre-extracted. `google-news --q \"$COMPANY\"` for recent activity. Specific facts via targeted SERP: `--q '\"$COMPANY\" headquarters'`, `--q '\"$COMPANY\" funding'`, `--q 'site:linkedin.com\u002Fcompany \"$COMPANY\"'`.\n- **\"Find public contact channels for company X\"** — start with SERP: `--q '\"@example.com\"'` often surfaces publicly indexed business addresses. For personal emails or phone numbers, require a legitimate purpose, user authorization, and privacy-law\u002Fterms compliance; disclose unverified guesses.\n- **\"Enrich this CSV of leads\"** — per row: `google-serp` for LinkedIn, role, employer; another SERP to verify email or pattern. Stay in SERP unless a specific field is missing.\n- **Reverse-lookup (email \u002F phone \u002F domain → identity)** — `google-serp` with the literal value in quotes (`--q '\"jane@x.com\"'`, `--q '\"+1 555 123 4567\"'`, `--q '\"acme corp\" site:example.com'`) almost always surfaces the matching person or business.\n\n**SERP-first principle**: for any data-enrichment intent (people, companies, emails, products, places), reach for `google-serp` \u002F `google-news` \u002F `google-shopping` \u002F `google-maps` first. They return Google's already-extracted structured fields (`.knowledge_graph`, `.organic_results[].snippet`, `.local_results[]`, etc.) without direct access to the target site. Only escalate to `web-scraping` when SERP doesn't surface the specific field you need, the data is public or authorized, and the target's terms\u002Faccess controls allow it. See `references\u002Fenrichment.md`.\n\nIf a user request matches one of the above and you don't invoke hasdata, you're probably hallucinating a stale answer.\n\n## Universal flag patterns\n\n- **Kebab-case** flag names. The CLI maps them back to the original camelCase before sending to the API.\n- **Booleans defaulting to `true`** have a paired negation: `--no-block-ads`, `--no-screenshot`, `--no-js-rendering`, `--no-extract-emails`, `--no-block-resources`. Setting both `--block-ads` and `--no-block-ads` errors.\n- **Anything ending in `-json`** accepts:\n    - inline JSON: `--extract-rules-json '{\"title\":\"h1\"}'`\n    - file: `--extract-rules-json @rules.json`\n    - stdin: `cat rules.json | hasdata web-scraping ... --extract-rules-json -`\n- **Repeatable key=value** flags split on the first `=` (so values containing `=` survive): `--headers User-Agent=foo --headers Cookie=session=abc`. Pair with `--headers-json` for a JSON base; kv items override per key.\n- **List flags** accept either repeats or comma-joined: `--lr lang_en --lr lang_fr` or `--lr lang_en,lang_fr`. Serialized as `key[]=value` for GET endpoints.\n- **Enum flags** validate client-side. If you guess wrong, the error lists the allowed values — read the message and retry.\n\n## Global flags (apply to every subcommand)\n\n| Flag | Effect |\n| --- | --- |\n| `--raw` | Write response bytes as-is (use this when piping to `jq`) |\n| `--pretty` | Pretty-print JSON (default when stdout is a TTY) |\n| `-o, --output FILE` | Write response to file instead of stdout (works for binary like screenshots) |\n| `--verbose` | Log outgoing URL and `X-RateLimit-*` headers to stderr |\n| `--api-key KEY` | Override env var (rarely needed) |\n| `--timeout DURATION` | Per-request timeout (default 2m) |\n| `--retries N` | Max retries on 429\u002F5xx (default 2) |\n\n## Output contract\n\nResponses are JSON. Pipe through `jq` for extraction:\n\n```bash\nhasdata google-serp --q \"espresso machine\" --num 10 --raw \\\n  | jq -c '.organic_results[] | {title, link, snippet}'\n```\n\nFor real-estate \u002F e-commerce results, the array shape is API-specific — read a single response with `--pretty` first to learn the schema, then write the `jq` filter.\n\n## Exit codes (script-safe)\n\n| Code | Meaning |\n| --- | --- |\n| 0 | success |\n| 1 | user \u002F CLI-input error (missing required flag, bad enum value, missing API key) |\n| 2 | network error |\n| 3 | API returned 4xx (auth, quota, validation) |\n| 4 | API returned 5xx |\n\n## References\n\n- [`references\u002Fenrichment.md`](references\u002Fenrichment.md) — **person and company enrichment** (LinkedIn lookup, emails, HQ\u002Ffunding\u002Fnews, CSV-row enrichment, reverse-lookup) — the highest-leverage cross-API workflows\n- [`references\u002Fsearch.md`](references\u002Fsearch.md) — Google SERP \u002F Bing \u002F News \u002F Trends flag catalog\n- [`references\u002Fweb-scraping.md`](references\u002Fweb-scraping.md) — `web-scraping` flags, JS scenarios, AI extraction\n- [`references\u002Freal-estate.md`](references\u002Freal-estate.md) — Zillow \u002F Redfin filters and bracketed params\n- [`references\u002Ftravel.md`](references\u002Ftravel.md) — Airbnb \u002F Booking \u002F Google Flights (lodging + transport)\n- [`references\u002Fecommerce.md`](references\u002Fecommerce.md) — Amazon \u002F Shopify\n- [`references\u002Flocal-business.md`](references\u002Flocal-business.md) — Maps (search\u002Fplace\u002Freviews\u002Fphotos\u002Fposts) \u002F Yelp \u002F YellowPages\n- [`references\u002Fjobs.md`](references\u002Fjobs.md) — Indeed \u002F Glassdoor\n- [`references\u002Fyoutube.md`](references\u002Fyoutube.md) — search \u002F video \u002F channel \u002F transcript\n- [`references\u002Fall-commands.md`](references\u002Fall-commands.md) — full subcommand index with credit costs\n\n\n## Limitations\n\n* Requires access to HasData services and valid credentials.\n* Data quality and available fields depend on the target website and extraction method used.\n* Website changes can impact extraction results and may require adjustments to extraction logic.\n* Rate limits, quotas, and account restrictions may apply depending on the endpoint and subscription plan.\n",{"name":5,"risk":35,"source":32,"license":14,"date_added":41,"description":7,"source_repo":42,"source_type":32,"license_source":43},"2026-06-04","HasData\u002Fhasdata-cli","https:\u002F\u002Fgithub.com\u002FHasData\u002Fhasdata-cli\u002Fblob\u002Fmain\u002FLICENSE","f3312ba749561b6159f477dbfc9313c875d40a56",".agents\u002Fskills_archive\u002Fhasdata-cli","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612","2026-10-25 23:50:58",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill hasdata-cli",{"tool":55,"command":56},"bunx","bunx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill hasdata-cli",{"tool":58,"command":59},"pnpm","pnpm dlx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill hasdata-cli","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002FSKILL.md",true,[63,69,73,77,81,85,89,93,97,101],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fall-commands.md","REFERENCE","参考文档",3749,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fall-commands.md",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002Fecommerce.md",5216,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fecommerce.md",{"path":74,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fenrichment.md",10339,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fenrichment.md",{"path":78,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fjobs.md",4627,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fjobs.md",{"path":82,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Flocal-business.md",6273,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Flocal-business.md",{"path":86,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Freal-estate.md",6207,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Freal-estate.md",{"path":90,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fsearch.md",5795,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fsearch.md",{"path":94,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Ftravel.md",5610,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Ftravel.md",{"path":98,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Fweb-scraping.md",8666,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fweb-scraping.md",{"path":102,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fyoutube.md",8484,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fhasdata-cli\u002Freferences\u002Fyoutube.md",[106,135,158,179,206,229],{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":117,"publishedAt":36},"01M6Q0FA5FZ410Z33Z3TFQ4DBA","zero-trust","Implement zero-trust network architecture. Configure identity-based access, micro-segmentation, and continuous verification. Use when implementing modern security architectures.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzero-trust\u002FSKILL.md",[112],{"categoryNo":113,"categoryName":114,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[118,119,120,121,122,123,108,124,125,21,126,127,128,25,129,130,131,132,133,134],"ZeRO","trust","zero trust","architecture","assessment","verification","segmentation","devops-security","configure","only","community","active","critical","scope","scripts","relevant","implementing",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":36},"01M6Q0F1YZJW3KX5FBKEVZ8CV4","zcode-delegate","Delegate coding tasks to the Z.AI ZCode CLI only when the user explicitly requests it, while the orchestrator retains review and landing responsibility.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzcode-delegate\u002FSKILL.md",[],[142,143,144,145,20,146,147,148,149,150,151,152,153,127,154,128,155,156,130,157],"delegate","zcode","zcode delegate","review","orchestration","tasks","run","Bash","model","node","read","orchestrator","files","desktop app","app","agent-orchestration",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":36},"01M6Q0ETK41VGNMYEXW0T00AJN","youtube-transcript","Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript\u002FSKILL.md",[],[165,166,167,35,34,168,169,31,29,170,171,172,173,128,25,174,175,176,177,178],"transcript","youtube transcript","youtube","codex","research","text","fetch","tooling","clean","local","output","deepapi","youtube transcripts","blob",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":196,"publishedAt":36},"01M6Q0EPPH2PVMDW40017F8WX0","youtube-transcript-skills","Fetch YouTube video transcripts, search videos\u002Fchannels, browse channels, and extract playlists via the getyoutubetranscript.com API - free tier, no card required.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript-skills\u002FSKILL.md",[185,188,191],{"categoryNo":186,"categoryName":187,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":189,"categoryName":190,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":192,"categoryName":193,"taxonomyType":194,"taxonomyTypeDesc":195},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[165,166,167,197,35,198,34,168,31,30,199,200,201,171,202,128,25,203,204,205],"youtube transcript skills","gemini","api","Video","browse","api-integration","free","card","channels",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":216,"publishedAt":36},"01M6Q0EAB96PX83W5PTE8A0R8D","youtube-notetaker","Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-notetaker\u002FSKILL.md",[212,215],{"categoryNo":213,"categoryName":214,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":189,"categoryName":190,"taxonomyType":115,"taxonomyTypeDesc":116},[167,217,218,20,35,219,32,220,221,31,200,222,223,224,225,25,226,174,227,228],"youtube notetaker","notetaker","workflow","notes","code","markdown","slides","annotations","README","study","dair-academy","viewer",{"skillNo":230,"name":231,"nameZh":6,"description":232,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":233,"categories":234,"keywords":236,"publishedAt":36},"01M6Q0E55F0GW5MX48V8HXS8B5","youtube-full","Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-full\u002FSKILL.md",[235],{"categoryNo":186,"categoryName":187,"taxonomyType":115,"taxonomyTypeDesc":116},[237,167,238,239,35,198,30,240,241,199,200,201,171,242,202,128,25,203,243,177],"youtube full","full","google","server","dlp","credits","automatic"]