Web ingestion · scrape · map

Reach what other
crawlers can't.

Tendril runs on a residential Mac, in WebKit — Safari's real engine — behind a real IP. Extraction is deterministic and testable: the same page always yields the same markdown. No cloud fingerprint, no LLM lottery.

3
escalation tiers
0
LLMs in extraction
~50ms
Tier 0 p50
WebKit
real Safari engine
🕸️

Browser fidelity

WebKit on macOS ARM behind a residential IP — not a headless Chromium signature. Sites that block others often don't block Tendril.

📐

Deterministic extraction

JSON-LD, OpenGraph, Readability + density fallback, hand-written Turndown rules. Versioned, golden-file testable output.

🧭

Map without rendering

Merge sitemaps, robots directives, homepage links and /llms.txt into one deduplicated URL list in seconds.

Playground

// live requests against this deployment

Request

Response

Send a request to see the response, rendered markdown, extracted links and ready-to-copy snippets.

Give it to your agent

// hand these to an AI agent so it can drive Tendril
🔌

MCP server

no install

A single-file Model Context Protocol server exposing tendril_scrape, tendril_map and tendril_status. Works in Claude Desktop, Claude Code and any MCP client. Needs only Node ≥ 20.

{
  "mcpServers": {
    "tendril": {
      "command": "node",
      "args": ["/absolute/path/to/tendril-mcp.mjs"],
      "env": { "TENDRIL_BASE_URL": "https://www.ten-dril.com" }
    }
  }
}
claude mcp add tendril -- node /absolute/path/to/tendril-mcp.mjs
📎

Agent Skill

SKILL.md

A Claude Agent Skill that teaches an agent when and how to use Tendril over plain HTTP — endpoints, options, workflow (map → scrape), and error codes. No MCP client required; works with any agent that reads skills or can curl.

unzip tendril-skill.zip -d ~/.claude/skills/
# → ~/.claude/skills/tendril/SKILL.md

The skill points at https://www.ten-dril.com and needs no API key today.

API reference

// base: this origin · Bearer auth coming with accounts

Errors

// §15 taxonomy — one code per failure
ERR_INVALID_URL400Malformed or unsupported scheme
ERR_SSRF_BLOCKED400Resolved to a private/forbidden address
ERR_ROBOTS_DENIED403robots.txt disallows the path
ERR_TARGET_BLOCKED502Tier 0 insufficient; higher tiers unavailable
ERR_UNSUPPORTED_TYPE415Content type not handled
ERR_TIER_TIMEOUT504Render exceeded timeout

Every response carries a requestId and an X-Request-Id header for support.