Skill
Community

nimble-extract-reference

Install
1
Install the plugin
$
npx claudepluginhub anthropics/claude-plugins-official --plugin nimble

Want just this skill?

Then install: npx claudepluginhub u/[userId]/[slug]

Description

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.

Tool Access

This skill uses the workspace's default tool permissions.

Supporting Assets
View in Repository
browser-actions.md
browser-investigation.md
network-capture.md
parsing-schema.md
Skill Content

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

ParameterCLI flagTypeDefaultDescription
url--urlstringTarget URL (required)
render--renderboolfalseEnable headless browser (JS rendering)
driver--driverstringvx6Engine: vx6 · vx8 · vx8-pro · vx10 · vx10-pro — see Drivers table
formats--formatarray["html"]Output format(s): "html", "markdown". CLI: string (--format markdown). SDK: array (formats=["markdown"]).
parse--parseboolfalseEnable parser (use with parser)
parser--parserJSONExtraction schema — see parsing-schema.md
browser_actions--browser-actionJSONBrowser actions sequence — see browser-actions.md
network_capture--network-captureJSONXHR intercept rules — see network-capture.md
is_xhr--is-xhrboolfalseDirect API call — no browser, no render
country--countrystringISO Alpha-2 geo proxy (e.g. US, GB)
state--statestringState-level geo targeting
city--citystringCity-level geo targeting
locale--localestringLCID locale (e.g. en-US, fr-FR) — pair with country
method--methodstringGETHTTP method: GET, POST, PUT, PATCH, DELETE
tag--tagstringRequest tag for analytics

Drivers

DriverDescriptionRenderBest for
vx6Fast HTTP (no JS)NoStatic HTML, APIs, high volume
vx8Headless browserYesDynamic sites, SPAs
vx8-proHeadful browserYesComplex interactions
vx10Stealth headlessYesBot-protected sites
vx10-proStealth headfulYesMost protected sites

CLI

# 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

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

TierCLIWhen
1extract --url "..."Static pages, docs, news, GitHub, Wikipedia, HN
2extract --url "..." --renderSPAs, dynamic content, JS-rendered pages
2b--render --render-options '{"render_type":"idle2","timeout":60000}'Slow SPAs, wait for network idle
3--render --driver vx10-proE-commerce, social, job boards — max stealth
# 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
# 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 for all action types and params.

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
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 for filter syntax and --is-xhr mode.

# 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
# 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 for selector types, extractors, and post-processors.

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"}}
    }
  }'
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

# 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
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:

ParameterCLI flagTypeDescription
storage_type--storage-typestringCloud provider: s3 or gs
storage_url--storage-urlstringDestination (e.g. s3://my-bucket/path/)
compress--compressboolGZIP compress results before storing
custom_name--custom-namestringCustom filename (default: task ID)
callback_url--callback-urlstringWebhook URL — called on completion

Task states: pendingrunningsuccess / failed

# 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>
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())

Parallelization

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

FieldTypeDescription
data.htmlstringExtracted HTML content
data.markdownstringContent as markdown (if format=markdown)
data.parsingobjectStructured data (if parse=True)
data.network_capturearrayCaptured network requests (if network_capture set)
status_codenumberHTTP status code from target
task_idstringUnique request identifier
metadata.driverstringDriver used (e.g. vx6, vx10-pro)
metadata.query_durationnumberExtraction time in ms
Stats
Stars13
Forks1
Last CommitMar 10, 2026

Similar Skills