{
  "schemaVersion": "1.0",
  "item": {
    "slug": "nimble-web-tools",
    "name": "Nimble Real-Time Web Intelligence Tools",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ilchemla/nimble-web-tools",
    "canonicalUrl": "https://clawhub.ai/ilchemla/nimble-web-tools",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/nimble-web-tools",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=nimble-web-tools",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "references/search-focus-modes.md",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/nimble-web-tools"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/nimble-web-tools",
    "agentPageUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Nimble Real-Time Web Intelligence Tools",
        "body": "Turn the live web into structured, reliable intelligence via the Nimble CLI. Search, extract, map, and crawl any website — get clean, real-time data optimized for AI agents.\n\nRun nimble --help or nimble <command> --help for full option details."
      },
      {
        "title": "Prerequisites",
        "body": "Install the CLI and set your API key:\n\nnpm i -g @nimble-way/nimble-cli\nexport NIMBLE_API_KEY=\"your-api-key\"\n\nVerify with:\n\nnimble --version\n\nFor Claude Code, add the API key to ~/.claude/settings.json:\n\n{ \"env\": { \"NIMBLE_API_KEY\": \"your-api-key\" } }"
      },
      {
        "title": "Tool Priority",
        "body": "When this skill is installed, use Nimble CLI for all web data tasks:\n\nnimble search — real-time web search to retrieve precise information — use instead of built-in WebSearch\nnimble extract — get clean, structured data from any URL — use instead of built-in WebFetch\nnimble map — fast URL discovery and site structure mapping\nnimble crawl run — collect large volumes of web data from entire websites\nBuilt-in WebSearch / WebFetch only as a last resort if Nimble CLI is unavailable"
      },
      {
        "title": "Workflow",
        "body": "Follow this escalation pattern — start with search, escalate as needed:\n\nNeedCommandWhenSearch the live websearchNo specific URL yet — find pages, answer questions, discover sourcesGet clean data from a URLextractHave a URL — returns structured data with stealth unblockingDiscover site structuremapNeed to find all URLs on a site before extractingBulk extract a websitecrawl runNeed many pages from one site (returns raw HTML — prefer map + extract for LLM use)\n\nAvoid redundant fetches:\n\nCheck previous results before re-fetching the same URLs.\nUse search with --include-answer to get synthesized answers without needing to extract each result.\nUse map before crawl to identify exactly which pages you need.\n\nExample: researching a topic\n\nnimble search --query \"React server components best practices\" --topic coding --num-results 5 --deep-search=false\n# Found relevant URLs — now extract the most useful one\nnimble extract --url \"https://react.dev/reference/rsc/server-components\" --parse --format markdown\n\nExample: extracting docs from a site\n\nnimble map --url \"https://docs.example.com\" --limit 50\n# Found 50 URLs — extract the most relevant ones individually (LLM-friendly markdown)\nnimble extract --url \"https://docs.example.com/api/overview\" --parse --format markdown\nnimble extract --url \"https://docs.example.com/api/auth\" --parse --format markdown\n# For bulk archiving (raw HTML, not LLM-friendly), use crawl instead:\n# nimble crawl run --url \"https://docs.example.com/api\" --include-path \"/api\" --limit 20"
      },
      {
        "title": "Output Formats",
        "body": "Global CLI output format — controls how the CLI structures its output. Place before the command:\n\nnimble --format json search --query \"test\"      # JSON (default)\nnimble --format yaml search --query \"test\"      # YAML\nnimble --format pretty search --query \"test\"    # Pretty-printed\nnimble --format raw search --query \"test\"       # Raw API response\n\nContent parsing format — controls how page content is returned. These are command-specific flags:\n\nsearch: --parsing-type markdown (or plain_text, simplified_html)\nextract: --format markdown (or html) — note: this is a content format flag on extract, not the global output format\n\n# Search with markdown content parsing\nnimble search --query \"test\" --parsing-type markdown --deep-search=false\n\n# Extract with markdown content + YAML CLI output\nnimble --format yaml extract --url \"https://example.com\" --parse --format markdown\n\nUse --transform with GJSON syntax to extract specific fields:\n\nnimble search --query \"AI news\" --transform \"results.#.url\""
      },
      {
        "title": "search",
        "body": "Accurate, real-time web search with 8 focus modes. AI Agents search the live web to retrieve precise information. Run nimble search --help for all options.\n\nIMPORTANT: The search command defaults to deep mode (fetches full page content), which is 5-10x slower. Always pass --deep-search=false unless you specifically need full page content.\n\nAlways explicitly set these parameters on every search call:\n\n--deep-search=false: Pass this on every call for fast responses (1-3s vs 5-15s). Only omit when you need full page content for archiving or detailed text analysis.\n--include-answer: Recommended on every research/exploration query. Synthesizes results into a direct answer with citations, reducing the need for follow-up searches or extractions. Only skip for URL-discovery-only queries where you just need links. Note: This is a premium feature (Enterprise plans). If the API returns a 402 or 403 when using this flag, retry the same query without --include-answer and continue — the search results are still valuable without the synthesized answer.\n--topic: Match to query type — coding, news, academic, etc. Default is general. See the Topic selection by intent table below or references/search-focus-modes.md for guidance.\n--num-results: Default 10 — balanced speed and coverage.\n\n# Basic search (always include --deep-search=false)\nnimble search --query \"your query\" --deep-search=false\n\n# Coding-focused search\nnimble search --query \"React hooks tutorial\" --topic coding --deep-search=false\n\n# News search with time filter\nnimble search --query \"AI developments\" --topic news --time-range week --deep-search=false\n\n# Search with AI-generated answer summary\nnimble search --query \"what is WebAssembly\" --include-answer --deep-search=false\n\n# Domain-filtered search\nnimble search --query \"authentication best practices\" --include-domain github.com --include-domain stackoverflow.com --deep-search=false\n\n# Date-filtered search\nnimble search --query \"tech layoffs\" --start-date 2026-01-01 --end-date 2026-02-01 --deep-search=false\n\n# Filter by content type (only with focus=general)\nnimble search --query \"annual report\" --content-type pdf --deep-search=false\n\n# Control number of results\nnimble search --query \"Python tutorials\" --num-results 15 --deep-search=false\n\n# Deep search — ONLY when you need full page content (5-15s, much slower)\nnimble search --query \"machine learning\" --deep-search --num-results 5\n\nKey options:\n\nFlagDescription--querySearch query string (required)--deep-search=falseAlways pass this. Disables full page content fetch for 5-10x faster responses--deep-searchEnable full page content fetch (slow, 5-15s — only when needed)--topicFocus mode: general, coding, news, academic, shopping, social, geo, location--num-resultsMax results to return (default 10)--include-answerGenerate AI answer summary from results--include-domainOnly include results from these domains (repeatable, max 50)--exclude-domainExclude results from these domains (repeatable, max 50)--time-rangeRecency filter: hour, day, week, month, year--start-dateFilter results after this date (YYYY-MM-DD)--end-dateFilter results before this date (YYYY-MM-DD)--content-typeFilter by type: pdf, docx, xlsx, documents, spreadsheets, presentations--parsing-typeOutput format: markdown, plain_text, simplified_html--countryCountry code for localized results--localeLocale for language settings--max-subagentsMax parallel subagents for shopping/social/geo modes (1-10, default 3)\n\nFocus modes (quick reference — for detailed per-mode guidance, decision tree, and combination strategies, read references/search-focus-modes.md):\n\nModeBest forgeneralBroad web searches (default)codingProgramming docs, code examples, technical contentnewsCurrent events, breaking news, recent articlesacademicResearch papers, scholarly articles, studiesshoppingProduct searches, price comparisons, e-commercesocialPeople research, LinkedIn/X/YouTube profiles, community discussionsgeoGeographic information, regional datalocationLocal businesses, place-specific queries\n\nTopic selection by intent (see references/search-focus-modes.md for full table):\n\nQuery IntentPrimary TopicSecondary (parallel)Research a personsocialgeneralResearch a companygeneralnewsFind code/docscoding—Current eventsnewssocialFind a product/priceshopping—Find a place/businesslocationgeoFind research papersacademic—\n\nPerformance tips:\n\nWith --deep-search=false (FAST): 1-3 seconds, returns titles + snippets + URLs — use this 95% of the time\nWithout the flag / --deep-search (SLOW): 5-15 seconds, returns full page content — only for archiving or full-text analysis\nUse --include-answer for quick synthesized insights — works great with fast mode\nStart with 5-10 results, increase only if needed"
      },
      {
        "title": "extract",
        "body": "Scalable data collection with stealth unblocking. Get clean, real-time HTML and structured data from any URL. Supports JS rendering, browser emulation, and geolocation. Run nimble extract --help for all options.\n\nIMPORTANT: Always use --parse --format markdown to get clean markdown output. Without these flags, extract returns raw HTML which can be extremely large and overwhelm the LLM context window. The --format flag on extract controls the content type (not the CLI output format — see Output Formats above).\n\n# Standard extraction (always use --parse --format markdown for LLM-friendly output)\nnimble extract --url \"https://example.com/article\" --parse --format markdown\n\n# Render JavaScript (for SPAs, dynamic content)\nnimble extract --url \"https://example.com/app\" --render --parse --format markdown\n\n# Extract with geolocation (see content as if from a specific country)\nnimble extract --url \"https://example.com\" --country US --city \"New York\" --parse --format markdown\n\n# Handle cookie consent automatically\nnimble extract --url \"https://example.com\" --consent-header --parse --format markdown\n\n# Custom browser emulation\nnimble extract --url \"https://example.com\" --browser chrome --device desktop --os windows --parse --format markdown\n\n# Multiple content format preferences (API tries first, falls back to second)\nnimble extract --url \"https://example.com\" --parse --format markdown --format html\n\nKey options:\n\nFlagDescription--urlTarget URL to extract (required)--parseParse the response content (always use this)--formatContent type preference: markdown, html (always use markdown for LLM-friendly output)--renderRender JavaScript using a browser--countryCountry code for geolocation and proxy--cityCity for geolocation--stateUS state for geolocation (only when country=US)--localeLocale for language settings--consent-headerAuto-handle cookie consent--browserBrowser type to emulate--deviceDevice type for emulation--osOperating system to emulate--driverBrowser driver to use--methodHTTP method (GET, POST, etc.)--headersCustom HTTP headers (key=value)--cookiesBrowser cookies--referrer-typeReferrer policy--http2Use HTTP/2 protocol--request-timeoutTimeout in milliseconds--tagUser-defined tag for request tracking"
      },
      {
        "title": "map",
        "body": "Fast URL discovery and site structure mapping. Easily plan extraction workflows. Returns URL metadata only (URLs, titles, descriptions) — not page content. Use extract or crawl to get actual content from the discovered URLs. Run nimble map --help for all options.\n\n# Map all URLs on a site (returns URLs only, not content)\nnimble map --url \"https://example.com\"\n\n# Limit number of URLs returned\nnimble map --url \"https://docs.example.com\" --limit 100\n\n# Include subdomains\nnimble map --url \"https://example.com\" --domain-filter subdomains\n\n# Use sitemap for discovery\nnimble map --url \"https://example.com\" --sitemap auto\n\nKey options:\n\nFlagDescription--urlURL to map (required)--limitMax number of links to return--domain-filterInclude subdomains in mapping--sitemapUse sitemap for URL discovery--countryCountry code for geolocation--localeLocale for language settings"
      },
      {
        "title": "crawl",
        "body": "Extract contents from entire websites in a single request. Collect large volumes of web data automatically. Crawl is async — you start a job, poll for completion, then retrieve the results. Run nimble crawl run --help for all options.\n\nCrawl defaults:\n\nSettingDefaultNotes--sitemapautoAutomatically uses sitemap if available--max-discovery-depth5How deep the crawler follows links--limitNo limitAlways set a limit to avoid crawling entire sites\n\nStart a crawl:\n\n# Crawl a site section (always set --limit)\nnimble crawl run --url \"https://docs.example.com\" --limit 50\n\n# Crawl with path filtering\nnimble crawl run --url \"https://example.com\" --include-path \"/docs\" --include-path \"/api\" --limit 100\n\n# Exclude paths\nnimble crawl run --url \"https://example.com\" --exclude-path \"/blog\" --exclude-path \"/archive\" --limit 50\n\n# Control crawl depth\nnimble crawl run --url \"https://example.com\" --max-discovery-depth 3 --limit 50\n\n# Allow subdomains and external links\nnimble crawl run --url \"https://example.com\" --allow-subdomains --allow-external-links --limit 50\n\n# Crawl entire domain (not just child paths)\nnimble crawl run --url \"https://example.com/docs\" --crawl-entire-domain --limit 100\n\n# Named crawl for tracking\nnimble crawl run --url \"https://example.com\" --name \"docs-crawl-feb-2026\" --limit 200\n\n# Use sitemap for discovery\nnimble crawl run --url \"https://example.com\" --sitemap auto --limit 50\n\nKey options for crawl run:\n\nFlagDescription--urlURL to crawl (required)--limitMax pages to crawl (always set this)--max-discovery-depthMax depth based on discovery order (default 5)--include-pathRegex patterns for URLs to include (repeatable)--exclude-pathRegex patterns for URLs to exclude (repeatable)--allow-subdomainsFollow links to subdomains--allow-external-linksFollow links to external sites--crawl-entire-domainFollow sibling/parent URLs, not just child paths--ignore-query-parametersDon't re-scrape same path with different query params--nameName for the crawl job--sitemapUse sitemap for URL discovery (default auto)--callbackWebhook for receiving results\n\nPoll crawl status and retrieve results:\n\nCrawl jobs run asynchronously. After starting a crawl, poll for completion, then retrieve content using individual task IDs (not the crawl ID):\n\n# 1. Start the crawl → returns a crawl_id\nnimble crawl run --url \"https://docs.example.com\" --limit 5\n# Returns: crawl_id \"abc-123\"\n\n# 2. Poll status until completed → returns individual task_ids per page\nnimble crawl status --id \"abc-123\"\n# Returns: tasks: [{ task_id: \"task-456\" }, { task_id: \"task-789\" }, ...]\n# Status values: running, completed, failed, terminated\n\n# 3. Retrieve content using INDIVIDUAL task_ids (NOT the crawl_id)\nnimble tasks results --task-id \"task-456\"\nnimble tasks results --task-id \"task-789\"\n# ⚠️ Using the crawl_id here returns 404 — you must use the per-page task_ids from step 2\n\nIMPORTANT: nimble tasks results requires the individual task IDs from crawl status (each crawled page gets its own task ID), not the crawl job ID. Using the crawl ID will return a 404 error.\n\nPolling guidelines:\n\nPoll every 15-30 seconds for small crawls (< 50 pages)\nPoll every 30-60 seconds for larger crawls (50+ pages)\nStop polling after status is completed, failed, or terminated\nNote: crawl status may occasionally misreport individual task statuses (showing \"failed\" for tasks that actually succeeded). If crawl status shows failed tasks, try retrieving their results with nimble tasks results before assuming failure\n\nList crawls:\n\n# List all crawls\nnimble crawl list\n\n# Filter by status\nnimble crawl list --status running\n\n# Paginate results\nnimble crawl list --limit 10\n\nCancel a crawl:\n\nnimble crawl terminate --id \"crawl-task-id\""
      },
      {
        "title": "Search Strategy",
        "body": "Always pass --deep-search=false — the default is deep mode (slow). Fast mode covers 95% of use cases: URL discovery, research, comparisons, answer generation\nOnly use deep mode when you need full page text — archiving articles, extracting complete docs, building datasets\nStart with the right focus mode — match --topic to your query type (see references/search-focus-modes.md)\nUse --include-answer — get AI-synthesized insights without extracting each result. If it returns 402/403, retry without it.\nFilter domains — use --include-domain to target authoritative sources\nAdd time filters — use --time-range for time-sensitive queries"
      },
      {
        "title": "Multi-Search Strategy",
        "body": "When researching a topic in depth, run 2-3 searches in parallel with:\n\nDifferent topics — e.g., social + general for people research\nDifferent query angles — e.g., \"Jane Doe current job\" + \"Jane Doe career history\" + \"Jane Doe publications\"\n\nThis is faster than sequential searches and gives broader coverage. Deduplicate results by URL before extracting."
      },
      {
        "title": "Disambiguating Common Names",
        "body": "When searching for a person with a common name:\n\nInclude distinguishing context in the query: company name, job title, city\nUse --topic social — LinkedIn results include location and current company, making disambiguation easier\nCross-reference results across searches to confirm you're looking at the right person"
      },
      {
        "title": "Extraction Strategy",
        "body": "Always use --parse --format markdown — returns clean markdown instead of raw HTML, preventing context window overflow\nTry without --render first — it's faster for static pages\nAdd --render for SPAs — when content is loaded by JavaScript\nSet geolocation — use --country to see region-specific content"
      },
      {
        "title": "Crawl Strategy",
        "body": "Prefer map + extract over crawl for LLM use — crawl results return raw HTML (60-115KB per page) which overwhelms LLM context. For LLM-friendly output, use map to discover URLs, then extract --parse --format markdown on individual pages\nUse crawl only for bulk archiving or data pipelines — when you need raw content from many pages and will post-process it outside the LLM context\nAlways set --limit — crawl has no default limit, so always specify one to avoid crawling entire sites\nUse path filters — --include-path and --exclude-path to target specific sections\nName your crawls — use --name for easy tracking\nRetrieve with individual task IDs — crawl status returns per-page task IDs; use those (not the crawl ID) with nimble tasks results --task-id"
      },
      {
        "title": "Researching a person",
        "body": "# Step 1: Run social + general in parallel for max coverage\nnimble search --query \"Jane Doe Head of Engineering\" --topic social --deep-search=false --num-results 10 --include-answer\nnimble search --query \"Jane Doe Head of Engineering\" --topic general --deep-search=false --num-results 10 --include-answer\n\n# Step 2: Broaden with different query angles in parallel\nnimble search --query \"Jane Doe career history Acme Corp\" --deep-search=false --include-answer\nnimble search --query \"Jane Doe publications blog articles\" --deep-search=false --include-answer\n\n# Step 3: Extract the most promising non-auth-walled URLs (skip LinkedIn — see Known Limitations)\nnimble extract --url \"https://www.companysite.com/team/jane-doe\" --parse --format markdown"
      },
      {
        "title": "Researching a company",
        "body": "# Step 1: Overview + recent news in parallel\nnimble search --query \"Acme Corp\" --topic general --deep-search=false --include-answer\nnimble search --query \"Acme Corp\" --topic news --time-range month --deep-search=false --include-answer\n\n# Step 2: Extract company page\nnimble extract --url \"https://acme.com/about\" --parse --format markdown"
      },
      {
        "title": "Technical research",
        "body": "# Step 1: Find docs and code examples\nnimble search --query \"React Server Components migration guide\" --topic coding --deep-search=false --include-answer\n\n# Step 2: Extract the most relevant doc\nnimble extract --url \"https://react.dev/reference/rsc/server-components\" --parse --format markdown"
      },
      {
        "title": "Error Handling",
        "body": "ErrorSolutionNIMBLE_API_KEY not setSet the environment variable: export NIMBLE_API_KEY=\"your-key\"401 UnauthorizedVerify API key is active at nimbleway.com402/403 with --include-answerPremium feature not available on current plan. Retry the same query without --include-answer and continue429 Too Many RequestsReduce request frequency or upgrade API tierTimeoutEnsure --deep-search=false is set, reduce --num-results, or increase --request-timeoutNo resultsTry different --topic, broaden query, remove domain filters"
      },
      {
        "title": "Known Limitations",
        "body": "SiteIssueWorkaroundLinkedIn profilesAuth wall blocks extraction (returns redirect/JS, status 999)Use --topic social search instead — it returns LinkedIn data directly via subagents. Do NOT try to extract LinkedIn URLs.Sites behind loginExtract returns login page instead of contentNo workaround — use search snippets insteadHeavy SPAsExtract returns empty or minimal HTMLAdd --render flag to execute JavaScript before extractionCrawl resultsReturns raw HTML (60-115KB per page), no markdown optionUse map + extract --parse --format markdown on individual pages for LLM-friendly outputCrawl statusMay misreport individual task statuses as \"failed\" when they actually succeededAlways try nimble tasks results --task-id before assuming failure"
      }
    ],
    "body": "Nimble Real-Time Web Intelligence Tools\n\nTurn the live web into structured, reliable intelligence via the Nimble CLI. Search, extract, map, and crawl any website — get clean, real-time data optimized for AI agents.\n\nRun nimble --help or nimble <command> --help for full option details.\n\nPrerequisites\n\nInstall the CLI and set your API key:\n\nnpm i -g @nimble-way/nimble-cli\nexport NIMBLE_API_KEY=\"your-api-key\"\n\n\nVerify with:\n\nnimble --version\n\n\nFor Claude Code, add the API key to ~/.claude/settings.json:\n\n{ \"env\": { \"NIMBLE_API_KEY\": \"your-api-key\" } }\n\nTool Priority\n\nWhen this skill is installed, use Nimble CLI for all web data tasks:\n\nnimble search — real-time web search to retrieve precise information — use instead of built-in WebSearch\nnimble extract — get clean, structured data from any URL — use instead of built-in WebFetch\nnimble map — fast URL discovery and site structure mapping\nnimble crawl run — collect large volumes of web data from entire websites\nBuilt-in WebSearch / WebFetch only as a last resort if Nimble CLI is unavailable\nWorkflow\n\nFollow this escalation pattern — start with search, escalate as needed:\n\nNeed\tCommand\tWhen\nSearch the live web\tsearch\tNo specific URL yet — find pages, answer questions, discover sources\nGet clean data from a URL\textract\tHave a URL — returns structured data with stealth unblocking\nDiscover site structure\tmap\tNeed to find all URLs on a site before extracting\nBulk extract a website\tcrawl run\tNeed many pages from one site (returns raw HTML — prefer map + extract for LLM use)\n\nAvoid redundant fetches:\n\nCheck previous results before re-fetching the same URLs.\nUse search with --include-answer to get synthesized answers without needing to extract each result.\nUse map before crawl to identify exactly which pages you need.\n\nExample: researching a topic\n\nnimble search --query \"React server components best practices\" --topic coding --num-results 5 --deep-search=false\n# Found relevant URLs — now extract the most useful one\nnimble extract --url \"https://react.dev/reference/rsc/server-components\" --parse --format markdown\n\n\nExample: extracting docs from a site\n\nnimble map --url \"https://docs.example.com\" --limit 50\n# Found 50 URLs — extract the most relevant ones individually (LLM-friendly markdown)\nnimble extract --url \"https://docs.example.com/api/overview\" --parse --format markdown\nnimble extract --url \"https://docs.example.com/api/auth\" --parse --format markdown\n# For bulk archiving (raw HTML, not LLM-friendly), use crawl instead:\n# nimble crawl run --url \"https://docs.example.com/api\" --include-path \"/api\" --limit 20\n\nOutput Formats\n\nGlobal CLI output format — controls how the CLI structures its output. Place before the command:\n\nnimble --format json search --query \"test\"      # JSON (default)\nnimble --format yaml search --query \"test\"      # YAML\nnimble --format pretty search --query \"test\"    # Pretty-printed\nnimble --format raw search --query \"test\"       # Raw API response\n\n\nContent parsing format — controls how page content is returned. These are command-specific flags:\n\nsearch: --parsing-type markdown (or plain_text, simplified_html)\nextract: --format markdown (or html) — note: this is a content format flag on extract, not the global output format\n# Search with markdown content parsing\nnimble search --query \"test\" --parsing-type markdown --deep-search=false\n\n# Extract with markdown content + YAML CLI output\nnimble --format yaml extract --url \"https://example.com\" --parse --format markdown\n\n\nUse --transform with GJSON syntax to extract specific fields:\n\nnimble search --query \"AI news\" --transform \"results.#.url\"\n\nCommands\nsearch\n\nAccurate, real-time web search with 8 focus modes. AI Agents search the live web to retrieve precise information. Run nimble search --help for all options.\n\nIMPORTANT: The search command defaults to deep mode (fetches full page content), which is 5-10x slower. Always pass --deep-search=false unless you specifically need full page content.\n\nAlways explicitly set these parameters on every search call:\n\n--deep-search=false: Pass this on every call for fast responses (1-3s vs 5-15s). Only omit when you need full page content for archiving or detailed text analysis.\n--include-answer: Recommended on every research/exploration query. Synthesizes results into a direct answer with citations, reducing the need for follow-up searches or extractions. Only skip for URL-discovery-only queries where you just need links. Note: This is a premium feature (Enterprise plans). If the API returns a 402 or 403 when using this flag, retry the same query without --include-answer and continue — the search results are still valuable without the synthesized answer.\n--topic: Match to query type — coding, news, academic, etc. Default is general. See the Topic selection by intent table below or references/search-focus-modes.md for guidance.\n--num-results: Default 10 — balanced speed and coverage.\n# Basic search (always include --deep-search=false)\nnimble search --query \"your query\" --deep-search=false\n\n# Coding-focused search\nnimble search --query \"React hooks tutorial\" --topic coding --deep-search=false\n\n# News search with time filter\nnimble search --query \"AI developments\" --topic news --time-range week --deep-search=false\n\n# Search with AI-generated answer summary\nnimble search --query \"what is WebAssembly\" --include-answer --deep-search=false\n\n# Domain-filtered search\nnimble search --query \"authentication best practices\" --include-domain github.com --include-domain stackoverflow.com --deep-search=false\n\n# Date-filtered search\nnimble search --query \"tech layoffs\" --start-date 2026-01-01 --end-date 2026-02-01 --deep-search=false\n\n# Filter by content type (only with focus=general)\nnimble search --query \"annual report\" --content-type pdf --deep-search=false\n\n# Control number of results\nnimble search --query \"Python tutorials\" --num-results 15 --deep-search=false\n\n# Deep search — ONLY when you need full page content (5-15s, much slower)\nnimble search --query \"machine learning\" --deep-search --num-results 5\n\n\nKey options:\n\nFlag\tDescription\n--query\tSearch query string (required)\n--deep-search=false\tAlways pass this. Disables full page content fetch for 5-10x faster responses\n--deep-search\tEnable full page content fetch (slow, 5-15s — only when needed)\n--topic\tFocus mode: general, coding, news, academic, shopping, social, geo, location\n--num-results\tMax results to return (default 10)\n--include-answer\tGenerate AI answer summary from results\n--include-domain\tOnly include results from these domains (repeatable, max 50)\n--exclude-domain\tExclude results from these domains (repeatable, max 50)\n--time-range\tRecency filter: hour, day, week, month, year\n--start-date\tFilter results after this date (YYYY-MM-DD)\n--end-date\tFilter results before this date (YYYY-MM-DD)\n--content-type\tFilter by type: pdf, docx, xlsx, documents, spreadsheets, presentations\n--parsing-type\tOutput format: markdown, plain_text, simplified_html\n--country\tCountry code for localized results\n--locale\tLocale for language settings\n--max-subagents\tMax parallel subagents for shopping/social/geo modes (1-10, default 3)\n\nFocus modes (quick reference — for detailed per-mode guidance, decision tree, and combination strategies, read references/search-focus-modes.md):\n\nMode\tBest for\ngeneral\tBroad web searches (default)\ncoding\tProgramming docs, code examples, technical content\nnews\tCurrent events, breaking news, recent articles\nacademic\tResearch papers, scholarly articles, studies\nshopping\tProduct searches, price comparisons, e-commerce\nsocial\tPeople research, LinkedIn/X/YouTube profiles, community discussions\ngeo\tGeographic information, regional data\nlocation\tLocal businesses, place-specific queries\n\nTopic selection by intent (see references/search-focus-modes.md for full table):\n\nQuery Intent\tPrimary Topic\tSecondary (parallel)\nResearch a person\tsocial\tgeneral\nResearch a company\tgeneral\tnews\nFind code/docs\tcoding\t—\nCurrent events\tnews\tsocial\nFind a product/price\tshopping\t—\nFind a place/business\tlocation\tgeo\nFind research papers\tacademic\t—\n\nPerformance tips:\n\nWith --deep-search=false (FAST): 1-3 seconds, returns titles + snippets + URLs — use this 95% of the time\nWithout the flag / --deep-search (SLOW): 5-15 seconds, returns full page content — only for archiving or full-text analysis\nUse --include-answer for quick synthesized insights — works great with fast mode\nStart with 5-10 results, increase only if needed\nextract\n\nScalable data collection with stealth unblocking. Get clean, real-time HTML and structured data from any URL. Supports JS rendering, browser emulation, and geolocation. Run nimble extract --help for all options.\n\nIMPORTANT: Always use --parse --format markdown to get clean markdown output. Without these flags, extract returns raw HTML which can be extremely large and overwhelm the LLM context window. The --format flag on extract controls the content type (not the CLI output format — see Output Formats above).\n\n# Standard extraction (always use --parse --format markdown for LLM-friendly output)\nnimble extract --url \"https://example.com/article\" --parse --format markdown\n\n# Render JavaScript (for SPAs, dynamic content)\nnimble extract --url \"https://example.com/app\" --render --parse --format markdown\n\n# Extract with geolocation (see content as if from a specific country)\nnimble extract --url \"https://example.com\" --country US --city \"New York\" --parse --format markdown\n\n# Handle cookie consent automatically\nnimble extract --url \"https://example.com\" --consent-header --parse --format markdown\n\n# Custom browser emulation\nnimble extract --url \"https://example.com\" --browser chrome --device desktop --os windows --parse --format markdown\n\n# Multiple content format preferences (API tries first, falls back to second)\nnimble extract --url \"https://example.com\" --parse --format markdown --format html\n\n\nKey options:\n\nFlag\tDescription\n--url\tTarget URL to extract (required)\n--parse\tParse the response content (always use this)\n--format\tContent type preference: markdown, html (always use markdown for LLM-friendly output)\n--render\tRender JavaScript using a browser\n--country\tCountry code for geolocation and proxy\n--city\tCity for geolocation\n--state\tUS state for geolocation (only when country=US)\n--locale\tLocale for language settings\n--consent-header\tAuto-handle cookie consent\n--browser\tBrowser type to emulate\n--device\tDevice type for emulation\n--os\tOperating system to emulate\n--driver\tBrowser driver to use\n--method\tHTTP method (GET, POST, etc.)\n--headers\tCustom HTTP headers (key=value)\n--cookies\tBrowser cookies\n--referrer-type\tReferrer policy\n--http2\tUse HTTP/2 protocol\n--request-timeout\tTimeout in milliseconds\n--tag\tUser-defined tag for request tracking\nmap\n\nFast URL discovery and site structure mapping. Easily plan extraction workflows. Returns URL metadata only (URLs, titles, descriptions) — not page content. Use extract or crawl to get actual content from the discovered URLs. Run nimble map --help for all options.\n\n# Map all URLs on a site (returns URLs only, not content)\nnimble map --url \"https://example.com\"\n\n# Limit number of URLs returned\nnimble map --url \"https://docs.example.com\" --limit 100\n\n# Include subdomains\nnimble map --url \"https://example.com\" --domain-filter subdomains\n\n# Use sitemap for discovery\nnimble map --url \"https://example.com\" --sitemap auto\n\n\nKey options:\n\nFlag\tDescription\n--url\tURL to map (required)\n--limit\tMax number of links to return\n--domain-filter\tInclude subdomains in mapping\n--sitemap\tUse sitemap for URL discovery\n--country\tCountry code for geolocation\n--locale\tLocale for language settings\ncrawl\n\nExtract contents from entire websites in a single request. Collect large volumes of web data automatically. Crawl is async — you start a job, poll for completion, then retrieve the results. Run nimble crawl run --help for all options.\n\nCrawl defaults:\n\nSetting\tDefault\tNotes\n--sitemap\tauto\tAutomatically uses sitemap if available\n--max-discovery-depth\t5\tHow deep the crawler follows links\n--limit\tNo limit\tAlways set a limit to avoid crawling entire sites\n\nStart a crawl:\n\n# Crawl a site section (always set --limit)\nnimble crawl run --url \"https://docs.example.com\" --limit 50\n\n# Crawl with path filtering\nnimble crawl run --url \"https://example.com\" --include-path \"/docs\" --include-path \"/api\" --limit 100\n\n# Exclude paths\nnimble crawl run --url \"https://example.com\" --exclude-path \"/blog\" --exclude-path \"/archive\" --limit 50\n\n# Control crawl depth\nnimble crawl run --url \"https://example.com\" --max-discovery-depth 3 --limit 50\n\n# Allow subdomains and external links\nnimble crawl run --url \"https://example.com\" --allow-subdomains --allow-external-links --limit 50\n\n# Crawl entire domain (not just child paths)\nnimble crawl run --url \"https://example.com/docs\" --crawl-entire-domain --limit 100\n\n# Named crawl for tracking\nnimble crawl run --url \"https://example.com\" --name \"docs-crawl-feb-2026\" --limit 200\n\n# Use sitemap for discovery\nnimble crawl run --url \"https://example.com\" --sitemap auto --limit 50\n\n\nKey options for crawl run:\n\nFlag\tDescription\n--url\tURL to crawl (required)\n--limit\tMax pages to crawl (always set this)\n--max-discovery-depth\tMax depth based on discovery order (default 5)\n--include-path\tRegex patterns for URLs to include (repeatable)\n--exclude-path\tRegex patterns for URLs to exclude (repeatable)\n--allow-subdomains\tFollow links to subdomains\n--allow-external-links\tFollow links to external sites\n--crawl-entire-domain\tFollow sibling/parent URLs, not just child paths\n--ignore-query-parameters\tDon't re-scrape same path with different query params\n--name\tName for the crawl job\n--sitemap\tUse sitemap for URL discovery (default auto)\n--callback\tWebhook for receiving results\n\nPoll crawl status and retrieve results:\n\nCrawl jobs run asynchronously. After starting a crawl, poll for completion, then retrieve content using individual task IDs (not the crawl ID):\n\n# 1. Start the crawl → returns a crawl_id\nnimble crawl run --url \"https://docs.example.com\" --limit 5\n# Returns: crawl_id \"abc-123\"\n\n# 2. Poll status until completed → returns individual task_ids per page\nnimble crawl status --id \"abc-123\"\n# Returns: tasks: [{ task_id: \"task-456\" }, { task_id: \"task-789\" }, ...]\n# Status values: running, completed, failed, terminated\n\n# 3. Retrieve content using INDIVIDUAL task_ids (NOT the crawl_id)\nnimble tasks results --task-id \"task-456\"\nnimble tasks results --task-id \"task-789\"\n# ⚠️ Using the crawl_id here returns 404 — you must use the per-page task_ids from step 2\n\n\nIMPORTANT: nimble tasks results requires the individual task IDs from crawl status (each crawled page gets its own task ID), not the crawl job ID. Using the crawl ID will return a 404 error.\n\nPolling guidelines:\n\nPoll every 15-30 seconds for small crawls (< 50 pages)\nPoll every 30-60 seconds for larger crawls (50+ pages)\nStop polling after status is completed, failed, or terminated\nNote: crawl status may occasionally misreport individual task statuses (showing \"failed\" for tasks that actually succeeded). If crawl status shows failed tasks, try retrieving their results with nimble tasks results before assuming failure\n\nList crawls:\n\n# List all crawls\nnimble crawl list\n\n# Filter by status\nnimble crawl list --status running\n\n# Paginate results\nnimble crawl list --limit 10\n\n\nCancel a crawl:\n\nnimble crawl terminate --id \"crawl-task-id\"\n\nBest Practices\nSearch Strategy\nAlways pass --deep-search=false — the default is deep mode (slow). Fast mode covers 95% of use cases: URL discovery, research, comparisons, answer generation\nOnly use deep mode when you need full page text — archiving articles, extracting complete docs, building datasets\nStart with the right focus mode — match --topic to your query type (see references/search-focus-modes.md)\nUse --include-answer — get AI-synthesized insights without extracting each result. If it returns 402/403, retry without it.\nFilter domains — use --include-domain to target authoritative sources\nAdd time filters — use --time-range for time-sensitive queries\nMulti-Search Strategy\n\nWhen researching a topic in depth, run 2-3 searches in parallel with:\n\nDifferent topics — e.g., social + general for people research\nDifferent query angles — e.g., \"Jane Doe current job\" + \"Jane Doe career history\" + \"Jane Doe publications\"\n\nThis is faster than sequential searches and gives broader coverage. Deduplicate results by URL before extracting.\n\nDisambiguating Common Names\n\nWhen searching for a person with a common name:\n\nInclude distinguishing context in the query: company name, job title, city\nUse --topic social — LinkedIn results include location and current company, making disambiguation easier\nCross-reference results across searches to confirm you're looking at the right person\nExtraction Strategy\nAlways use --parse --format markdown — returns clean markdown instead of raw HTML, preventing context window overflow\nTry without --render first — it's faster for static pages\nAdd --render for SPAs — when content is loaded by JavaScript\nSet geolocation — use --country to see region-specific content\nCrawl Strategy\nPrefer map + extract over crawl for LLM use — crawl results return raw HTML (60-115KB per page) which overwhelms LLM context. For LLM-friendly output, use map to discover URLs, then extract --parse --format markdown on individual pages\nUse crawl only for bulk archiving or data pipelines — when you need raw content from many pages and will post-process it outside the LLM context\nAlways set --limit — crawl has no default limit, so always specify one to avoid crawling entire sites\nUse path filters — --include-path and --exclude-path to target specific sections\nName your crawls — use --name for easy tracking\nRetrieve with individual task IDs — crawl status returns per-page task IDs; use those (not the crawl ID) with nimble tasks results --task-id\nCommon Recipes\nResearching a person\n# Step 1: Run social + general in parallel for max coverage\nnimble search --query \"Jane Doe Head of Engineering\" --topic social --deep-search=false --num-results 10 --include-answer\nnimble search --query \"Jane Doe Head of Engineering\" --topic general --deep-search=false --num-results 10 --include-answer\n\n# Step 2: Broaden with different query angles in parallel\nnimble search --query \"Jane Doe career history Acme Corp\" --deep-search=false --include-answer\nnimble search --query \"Jane Doe publications blog articles\" --deep-search=false --include-answer\n\n# Step 3: Extract the most promising non-auth-walled URLs (skip LinkedIn — see Known Limitations)\nnimble extract --url \"https://www.companysite.com/team/jane-doe\" --parse --format markdown\n\nResearching a company\n# Step 1: Overview + recent news in parallel\nnimble search --query \"Acme Corp\" --topic general --deep-search=false --include-answer\nnimble search --query \"Acme Corp\" --topic news --time-range month --deep-search=false --include-answer\n\n# Step 2: Extract company page\nnimble extract --url \"https://acme.com/about\" --parse --format markdown\n\nTechnical research\n# Step 1: Find docs and code examples\nnimble search --query \"React Server Components migration guide\" --topic coding --deep-search=false --include-answer\n\n# Step 2: Extract the most relevant doc\nnimble extract --url \"https://react.dev/reference/rsc/server-components\" --parse --format markdown\n\nError Handling\nError\tSolution\nNIMBLE_API_KEY not set\tSet the environment variable: export NIMBLE_API_KEY=\"your-key\"\n401 Unauthorized\tVerify API key is active at nimbleway.com\n402/403 with --include-answer\tPremium feature not available on current plan. Retry the same query without --include-answer and continue\n429 Too Many Requests\tReduce request frequency or upgrade API tier\nTimeout\tEnsure --deep-search=false is set, reduce --num-results, or increase --request-timeout\nNo results\tTry different --topic, broaden query, remove domain filters\nKnown Limitations\nSite\tIssue\tWorkaround\nLinkedIn profiles\tAuth wall blocks extraction (returns redirect/JS, status 999)\tUse --topic social search instead — it returns LinkedIn data directly via subagents. Do NOT try to extract LinkedIn URLs.\nSites behind login\tExtract returns login page instead of content\tNo workaround — use search snippets instead\nHeavy SPAs\tExtract returns empty or minimal HTML\tAdd --render flag to execute JavaScript before extraction\nCrawl results\tReturns raw HTML (60-115KB per page), no markdown option\tUse map + extract --parse --format markdown on individual pages for LLM-friendly output\nCrawl status\tMay misreport individual task statuses as \"failed\" when they actually succeeded\tAlways try nimble tasks results --task-id before assuming failure"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ilchemla/nimble-web-tools",
    "publisherUrl": "https://clawhub.ai/ilchemla/nimble-web-tools",
    "owner": "ilchemla",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/nimble-web-tools",
    "downloadUrl": "https://openagent3.xyz/downloads/nimble-web-tools",
    "agentUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nimble-web-tools/agent.md"
  }
}