nimble-extract-reference
Reference for nimble extract command. Load when fetching URLs or scraping pages. Contains: render tiers 1-3, all flags, browser actions, network capture, parser schemas, geo targeting, async, parallelization.
Best use case
nimble-extract-reference is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Reference for nimble extract command. Load when fetching URLs or scraping pages. Contains: render tiers 1-3, all flags, browser actions, network capture, parser schemas, geo targeting, async, parallelization.
Teams using nimble-extract-reference should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/nimble-extract/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How nimble-extract-reference Compares
| Feature / Agent | nimble-extract-reference | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Reference for nimble extract command. Load when fetching URLs or scraping pages. Contains: render tiers 1-3, all flags, browser actions, network capture, parser schemas, geo targeting, async, parallelization.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# nimble extract — reference
Fetches a URL and returns its content. The workhorse command — use for any URL where no agent exists.
## Table of Contents
- [Parameters](#parameters)
- [Drivers](#drivers)
- [CLI](#cli)
- [Python SDK](#python-sdk)
- [Render tiers — escalate on failure](#render-tiers--escalate-on-failure)
- [Browser actions](#browser-actions)
- [Network capture](#network-capture)
- [Parser schemas — structured extraction](#parser-schemas--structured-extraction)
- [Geo targeting](#geo-targeting)
- [Async extract](#async-extract)
- [Batch extract](#batch-extract)
- [Parallelization](#parallelization)
- [Response](#response)
---
## Parameters
| Parameter | CLI flag | Type | Default | Description |
| ----------------- | ------------------- | ------ | ------- | --------------------------------------------------------------------------- |
| `url` | `--url` | string | — | Target URL (**required**) |
| `render` | `--render` | bool | false | Enable headless browser (JS rendering) |
| `driver` | `--driver` | string | `vx6` | Engine: `vx6` · `vx8` · `vx8-pro` · `vx10` · `vx10-pro` — see Drivers table |
| `formats` | `--format` | array | `["html"]` | Output format(s): `"html"`, `"markdown"`. CLI: string (`--format markdown`). SDK: array (`formats=["markdown"]`). |
| `parse` | `--parse` | bool | false | Enable parser (use with `parser`) |
| `parser` | `--parser` | JSON | — | Extraction schema — see [parsing-schema.md](parsing-schema.md) |
| `browser_actions` | `--browser-action` | JSON | — | Browser actions sequence — see [browser-actions.md](browser-actions.md) |
| `network_capture` | `--network-capture` | JSON | — | XHR intercept rules — see [network-capture.md](network-capture.md) |
| `is_xhr` | `--is-xhr` | bool | false | Direct API call — no browser, no render |
| `country` | `--country` | string | — | ISO Alpha-2 geo proxy (e.g. `US`, `GB`) |
| `state` | `--state` | string | — | State-level geo targeting |
| `city` | `--city` | string | — | City-level geo targeting |
| `locale` | `--locale` | string | — | LCID locale (e.g. `en-US`, `fr-FR`) — pair with `country` |
| `method` | `--method` | string | `GET` | HTTP method: `GET`, `POST`, `PUT`, `PATCH`, `DELETE` |
| `tag` | `--tag` | string | — | Request tag for analytics |
---
## Drivers
| Driver | Description | Render | Best for |
| ---------- | ----------------- | ------ | ------------------------------ |
| `vx6` | Fast HTTP (no JS) | No | Static HTML, APIs, high volume |
| `vx8` | Headless browser | Yes | Dynamic sites, SPAs |
| `vx8-pro` | Headful browser | Yes | Complex interactions |
| `vx10` | Stealth headless | Yes | Bot-protected sites |
| `vx10-pro` | Stealth headful | Yes | Most protected sites |
---
## CLI
```bash
# Markdown output (default for most tasks)
nimble --transform "data.markdown" extract \
--url "https://example.com/page" --format markdown
# Save to file
nimble --transform "data.markdown" extract \
--url "https://example.com/page" --format markdown > .nimble/page.md
```
## Python SDK
```python
from nimble_python import Nimble
nimble = Nimble()
resp = nimble.extract(url="https://example.com/page", formats=["markdown"])
print(resp["data"]["markdown"])
```
---
## Render tiers — escalate on failure
**Failure signals:** status 500 · empty `data.html` / `data.markdown` · "captcha" / "verify you are human" in content · login wall instead of target page
| Tier | CLI | When |
| ---- | --------------------------------------------------------------------- | ----------------------------------------------- |
| 1 | `extract --url "..."` | Static pages, docs, news, GitHub, Wikipedia, HN |
| 2 | `extract --url "..." --render` | SPAs, dynamic content, JS-rendered pages |
| 2b | `--render --render-options '{"render_type":"idle2","timeout":60000}'` | Slow SPAs, wait for network idle |
| 3 | `--render --driver vx10-pro` | E-commerce, social, job boards — max stealth |
```bash
# Tier 1 — no render
nimble --transform "data.markdown" extract --url "https://example.com" --format markdown
# Tier 2 — render
nimble --transform "data.markdown" extract --url "https://example.com" --render --format markdown
# Tier 3 — stealth
nimble --transform "data.markdown" extract --url "https://example.com" --render --driver vx10-pro --format markdown
```
```python
# Tier 2 — render
resp = nimble.extract(url="https://example.com", render=True, formats=["markdown"])
# Tier 3 — stealth
resp = nimble.extract(url="https://example.com", render=True, driver="vx10-pro", formats=["markdown"])
```
---
## Browser actions
For interacting with a page before extracting — clicks, scrolls, form fills, infinite scroll. Requires `render=True`.
See [browser-actions.md](browser-actions.md) for all action types and params.
```bash
nimble --transform "data.markdown" extract \
--url "https://example.com/product" --render \
--browser-action '[
{"type": "click", "selector": ".tab-reviews", "required": false},
{"type": "wait_for_element", "selector": ".review-list"}
]' --format markdown
```
```python
resp = nimble.extract(
url="https://example.com/product",
render=True,
browser_actions=[
{"type": "click", "selector": ".tab-reviews", "required": False},
{"type": "wait_for_element", "selector": ".review-list"},
],
formats=["markdown"],
)
```
---
## Network capture
When page data comes from XHR/AJAX calls, or to call a known API endpoint directly with `--is-xhr`.
See [network-capture.md](network-capture.md) for filter syntax and `--is-xhr` mode.
```bash
# Intercept an API call triggered by the page
nimble extract \
--url "https://example.com/products" --render \
--network-capture '[{"url": {"type": "contains", "value": "/api/products"}, "resource_type": ["xhr", "fetch"]}]' \
> .nimble/products-api.json
# Known public API endpoint — use --is-xhr (no browser, fastest)
nimble --transform "data.markdown" extract \
--url "https://api.example.com/v1/markets?q=elections&limit=50" \
--is-xhr --format markdown
```
```python
# Intercept via render
resp = nimble.extract(
url="https://example.com/products",
render=True,
network_capture=[{"url": {"type": "contains", "value": "/api/products"}, "resource_type": ["xhr", "fetch"]}],
)
captures = resp["data"]["network_capture"]
# Direct API call — no browser
resp = nimble.extract(
url="https://api.example.com/v1/markets?q=elections&limit=50",
is_xhr=True,
)
```
> **Note:** `is_xhr` and `render` are mutually exclusive.
---
## Parser schemas — structured extraction
When markdown doesn't contain fields cleanly. Results land in `data.parsing`.
See [parsing-schema.md](parsing-schema.md) for selector types, extractors, and post-processors.
```bash
nimble extract --url "https://example.com/product" --render --parse \
--parser '{
"type": "schema",
"fields": {
"title": {"type": "terminal", "selector": {"type": "css", "css_selector": "h1"}, "extractor": {"type": "text"}},
"price": {"type": "terminal", "selector": {"type": "css", "css_selector": "[data-price]"}, "extractor": {"type": "text"}}
}
}'
```
```python
resp = nimble.extract(
url="https://example.com/product",
render=True,
parse=True,
parser={
"type": "schema",
"fields": {
"title": {"type": "terminal", "selector": {"type": "css", "css_selector": "h1"}, "extractor": {"type": "text"}},
"price": {"type": "terminal", "selector": {"type": "css", "css_selector": "[data-price]"}, "extractor": {"type": "text"}},
},
},
)
print(resp["data"]["parsing"])
```
---
## Geo targeting
```bash
# Country
nimble --transform "data.markdown" extract --url "https://example.com" --country US --format markdown
# City-level
nimble --transform "data.markdown" extract --url "https://example.com" --country US --state CA --city los_angeles --format markdown
# Localized (pair --locale with --country)
nimble --transform "data.markdown" extract --url "https://example.com/fr" --country FR --locale fr-FR --format markdown
```
```python
resp = nimble.extract(url="https://example.com", country="US", formats=["markdown"])
resp = nimble.extract(url="https://example.com", country="US", state="CA", city="los_angeles", formats=["markdown"])
```
---
## Async extract
For batch processing or long-running extractions. Returns immediately with a task ID; poll for results.
**Additional async-only params:**
| Parameter | CLI flag | Type | Description |
| -------------- | ---------------- | ------ | ----------------------------------------- |
| `storage_type` | `--storage-type` | string | Cloud provider: `s3` or `gs` |
| `storage_url` | `--storage-url` | string | Destination (e.g. `s3://my-bucket/path/`) |
| `compress` | `--compress` | bool | GZIP compress results before storing |
| `custom_name` | `--custom-name` | string | Custom filename (default: task ID) |
| `callback_url` | `--callback-url` | string | Webhook URL — called on completion |
**Task states:** `pending` → `running` → `success` / `failed`
```bash
# Submit async
nimble extract-async --url "https://example.com/page" --render --format markdown
# Poll status
nimble tasks get --task-id <task_id>
# Fetch results
nimble tasks results --task-id <task_id>
```
```python
import asyncio
from nimble_python import AsyncNimble
async def extract():
nimble = AsyncNimble()
task = await nimble.extract_async(url="https://example.com/page", render=True, formats=["markdown"])
task_id = task["task"]["id"]
while True:
status = await nimble.tasks.get(task_id=task_id)
state = status["task"]["state"]
if state in ("success", "failed"):
break
await asyncio.sleep(5)
result = await nimble.tasks.results(task_id=task_id)
print(result["data"]["markdown"])
asyncio.run(extract())
```
---
## Batch extract
Submit up to 1,000 URLs in a single request. Uses an `inputs` + `shared_inputs` pattern
— shared config applies to all items, per-item values override.
**Parameters:**
| Parameter | CLI flag | Type | Default | Description |
| --------------- | ----------------- | ----- | -------- | --------------------------------------------------------------- |
| `inputs` | `--input` | array | required | Array of per-URL requests, each with at least `url` |
| `shared_inputs` | `--shared-inputs` | JSON | — | Defaults applied to all items (render, format, driver, delivery)|
**`shared_inputs` fields:**
- **Extraction defaults** (overridable per item): `render`, `driver`, `formats`, `country`, `locale`, `parse`, `parser`
- **Delivery params** (batch-wide, not overridable): `storage_type`, `storage_url`, `storage_compress`, `storage_object_name`, `callback_url`
**CLI:**
```bash
nimble extract-batch \
--shared-inputs 'render: true' --shared-inputs 'format: markdown' \
--input '{"url": "https://example.com/page-1"}' \
--input '{"url": "https://example.com/page-2"}' \
--input '{"url": "https://example.com/page-3"}'
```
**Python SDK:**
```python
resp = nimble.extract_batch(
inputs=[
{"url": "https://example.com/page-1"},
{"url": "https://example.com/page-2"},
{"url": "https://example.com/page-3"},
],
shared_inputs={"render": True, "formats": ["markdown"]},
)
batch_id = resp["batch_id"]
```
**Node SDK:**
```javascript
const resp = await nimble.extractBatch({
inputs: [
{ url: "https://example.com/page-1" },
{ url: "https://example.com/page-2" },
{ url: "https://example.com/page-3" },
],
sharedInputs: { render: true, formats: ["markdown"] },
});
const batchId = resp.batch_id;
```
**Response:**
```json
{
"batch_id": "b7e1a2f3-...",
"batch_size": 3,
"tasks": [
{ "id": "task-001-uuid", "state": "pending", "batch_id": "b7e1a2f3-..." }
]
}
```
**Polling:** Use `nimble batches progress --batch-id <batch_id>` to check completion,
then `nimble batches get --batch-id <batch_id>` to get all task IDs, then
`nimble tasks results --task-id <id>` for each successful task.
See `nimble-tasks` reference for the full polling flow.
**Delivery options:**
- **Polling** — check status with batch/task IDs (default)
- **Webhooks** — pass `callback_url` in `shared_inputs`; Nimble POSTs on completion
- **Cloud storage** — set `storage_type` + `storage_url` in `shared_inputs`
---
## Parallelization
```bash
mkdir -p .nimble
nimble --transform "data.markdown" extract --url "https://example.com/1" --format markdown > .nimble/1.md &
nimble --transform "data.markdown" extract --url "https://example.com/2" --format markdown > .nimble/2.md &
nimble --transform "data.markdown" extract --url "https://example.com/3" --format markdown > .nimble/3.md &
wait
```
---
## Response
| Field | Type | Description |
| ------------------------- | ------ | ---------------------------------------------------- |
| `data.html` | string | Extracted HTML content |
| `data.markdown` | string | Content as markdown (if `format=markdown`) |
| `data.parsing` | object | Structured data (if `parse=True`) |
| `data.network_capture` | array | Captured network requests (if `network_capture` set) |
| `status_code` | number | HTTP status code from target |
| `task_id` | string | Unique request identifier |
| `metadata.driver` | string | Driver used (e.g. `vx6`, `vx10-pro`) |
| `metadata.query_duration` | number | Extraction time in ms |Related Skills
nimble-tasks-reference
Reference for nimble tasks and batches commands. Load when polling async task status, tracking batch progress, or fetching results. Works for ALL async types: agent run-async, agent run-batch, extract-async, extract-batch, crawl (per-page tasks), search async, map async. CRITICAL: agent tasks use "success"/"error" states; crawl page tasks use "completed"/"failed".
nimble-search-reference
Reference for nimble search command. Load when searching the live web. Contains: all flags, 8 focus modes (general/coding/news/academic/shopping/social/geo/location), search_depth modes (lite/fast/deep), response structure, credit costs.
nimble-map-reference
Reference for nimble map command. Load when discovering URLs on a site before bulk extraction. Contains: all flags (limit 1-100000, sitemap include/only/skip, domain_filter), response structure {links[].url/title/description}, map→filter→extract pattern, map vs crawl comparison.
nimble-crawl-reference
Reference for nimble crawl command. Load when bulk-crawling many pages asynchronously. Contains: async workflow (create → status → tasks results), all flags, polling guidelines, CRITICAL: use task_id (not crawl_id) for results, crawl vs map comparison.
nimble-agents-reference
Reference for nimble agent commands. Load for Step 0 agent lookup. Contains: full agent table (50+ sites across e-commerce, food, real estate, jobs, social, travel), discover/list/schema/run commands, response shapes (PDP=dict, SERP=list, google=entities), agent memory.
nimble-web-expert
Get web data now — fast, incremental, immediately responsive to what the user needs. The only way Claude can access live websites. USE FOR: - Fetching any URL or reading any webpage - Scraping prices, listings, reviews, jobs, stats, docs from any site - Discovering URLs on a site before bulk extraction - Calling public REST/XHR API endpoints - Web search and research (8 focus modes) - Bulk crawling website sections Must be pre-installed and authenticated. Run `nimble --version` to verify. For building reusable extraction workflows to run at scale over time, use nimble-agent-builder instead.
nimble-agent-builder
A building experience: create, test, validate, refine, and publish extraction workflows based on existing or new Nimble agents. For users who want to invest in a durable, reusable workflow for a specific domain — not get data immediately. Trigger phrases: "set up extraction for X site", "I need to extract from this site regularly", "build an agent for", "create a reusable scraper", "generate a Nimble agent", "refine my agent", "add a field to my agent", or when the user wants to run extraction at scale. For getting data immediately, use nimble-web-expert instead.
healthcare-providers-extract
Extracts structured practitioner data from healthcare practice websites. Returns names, credentials, specialties, contact info, and education for every provider on a practice's site. Use when user asks to extract, pull, or list doctors, providers, or staff from practice websites. Triggers: "extract doctors from", "pull providers from", "who are the providers at", "build a provider database", "list all doctors at", "scrape the team page", "get practitioner data from". Accepts practice URLs (pasted, CSV, Google Sheet) or discovers practices via Google Maps when given specialty + location. Single sites or 100+ URLs. Do NOT use for filling data gaps — use healthcare-providers-enrich instead. Do NOT use for credential validation — use healthcare-providers-verify instead. Do NOT use for discovering practices — use market-finder or local-places instead. Do NOT use for general extraction — use nimble-web-expert instead.
seo-intel
SEO intelligence toolkit covering the full lifecycle via live web data: keyword research, rank tracking, site audits, content gap analysis, competitor keyword reverse-engineering, AI visibility across five platforms (ChatGPT, Perplexity, Google AI, Gemini, Grok), and GitHub repo SEO. Crawls real sites and SERPs via Nimble CLI — no fabricated metrics. Triggers: "SEO", "keywords", "rank tracker", "site audit", "content gap", "competitor keywords", "AI visibility", "GitHub SEO", "SERP analysis", "keyword research", "technical SEO", "keyword difficulty", "topic clusters", "ranking delta", "on-page SEO", "AI citation audit". Do NOT use for competitor business signals — use `competitor-intel` instead. Do NOT use for competitor messaging — use `competitor-positioning` instead. Do NOT use for general web scraping — use `nimble-web-expert` instead.
meeting-prep
Researches meeting attendees and their companies before any meeting using real-time web data. Surfaces roles, recent activity, company context, and talking points — then maps cross-attendee relationships. Use this skill when the user asks to prepare for a meeting, research someone they're meeting, or wants context on attendees. Common triggers: "prepare me for my meeting", "who am I meeting with", "research this person", "meeting prep", "brief me on [person]", "I have a meeting with [person/company]", "get me ready for my call", "what should I know about [person]", "background on [person] before our meeting", "attendee research". Requires the Nimble CLI (nimble search, nimble extract) for live web data. Do NOT use for multi-company competitor monitoring (use competitor-intel) or single-company deep dives without attendees (use company-deep-dive).
local-places
Discovers, enriches, and scores local businesses in any neighborhood using Nimble Web Search Agents (WSAs) and web data. Returns a structured, ranked list with confidence scores, reviews, social presence, and an interactive map. Use this skill when the user asks about local businesses, places, or neighborhood discovery. Common triggers: "find all coffee shops in", "map every bar in", "local businesses in", "discover gyms near", "what restaurants are in", "neighborhood guide for", "local places in", "find places near", "list all [business type] in [area]", "best [type] near [location]", "build a neighborhood guide", "local place search". Requires the Nimble CLI (nimble agent run, nimble search, nimble extract) for live web data via WSAs and fallback search. Do NOT use for competitor analysis or monitoring (use competitor-intel), company research or deep dives (use company-deep-dive), general web search or extraction (use nimble-web-expert).
competitor-positioning
Tracks how competitors position themselves online — scrapes homepages, features, pricing, and blogs to extract messaging, value props, CTAs, and pricing models. Compares against previous snapshots to surface positioning shifts with before/after tracking. Produces messaging matrices, content gap analysis, white space maps, and battlecard inputs. Use when anyone asks about competitor messaging, positioning, website copy, content strategy, or how competitors present themselves. Triggers: "competitor positioning", "messaging comparison", "content gap", "what changed on their site", "competitor homepage", "landing page teardown", "marketing battlecard", "how do they describe their product", "share of voice", "counter-messaging". Do NOT use for business signals like funding/hiring (use competitor-intel), single-company deep dives (use company-deep-dive), or meeting prep (use meeting-prep).