Convierte un sitio entero
en datos limpios.
Apunta Writ a una URL. Mapea el sitio, reparte el rastreo por toda tu flota (best-first, en paralelo), y te devuelve cada página como Markdown limpio o JSON estructurado. Rastrea una página o un millón.
Una página entra, Markdown limpio sale.
Writ retira el cromo (navegación, banners de cookies, anuncios, boilerplate) y conserva el contenido, para que un LLM lea la página, no el maquetado. Pulsa Scrape:
Cada URL descubrible, en segundos.
Map fusiona el sitemap con los enlaces que Writ descubre en vivo, así ves toda la superficie antes de gastar un solo rastreo de página. Elige tus seeds y rastrea solo lo que importa.
Un rastreo, toda tu flota.
Un rastreo no es una sola máquina moliendo una cola. Writ comparte una única frontera entre todos los agents (best-first, para que las páginas más relevantes vuelvan primero) y escala linealmente a medida que añades workers. Añade agents:
La frontera depende de quién ha iniciado sesión.
Un crawler público se detiene en el muro de login. Adjunta una persona y la misma URL semilla se abre a las páginas que solo tu cuenta puede ver - historial de pedidos, facturas, páginas de miembros que no aparecen en ningún sitemap - y el propio mapa crece. Cambia la sesión:
Sin sesión la frontera termina en /login. Todo lo que hay más allá es indescubrible — no lento de alcanzar, indescubrible: esas URL no están en ningún sitemap y nada del sitio público enlaza a ellas.
Topología ilustrativa. Un Harvest real corre dentro del alcance que fijas — inclusiones, exclusiones y topes de ritmo — y respeta robots.txt.
Rastrea lo que quieres, no todo.
Describe la intención y Writ puntúa cada URL según ella, siguiendo las que coinciden y saltando el resto. Pagas por las páginas que querías, no por todo el sitio. Elige un objetivo:
HTML, JS, PDF, imágenes: todo legible.
Writ enruta cada recurso por la vía más barata que funcione: HTTP directo para páginas estáticas, un navegador real para apps JS, doc-extract para PDF y archivos de oficina, OCR sin conexión para imágenes. Obtienes texto de cualquier modo.
Markdown, JSON o un conjunto de datos consultable.
Toma Markdown limpio, o dale a Writ un esquema y obtén JSON estructurado por página. Cada rastreo aterriza en un conjunto de datos que puedes consultar, sin re-rastrear para responder la siguiente pregunta.
Un veinteavo de céntimo por página. Gratis para empezar.
Los crawls se ejecutan en la flota de Writ: una cuenta gratuita basta para empezar, sin tarjeta. Las páginas se facturan desde tu pool, y las vías de navegador y OCR pesan más porque cuestan más de ejecutar. Si autoalojas el open-core, tus propios agentes rastrean sin ningún cargo por nuestra parte. Arrastra tus páginas mensuales:
Inicia un rastreo en una sola llamada.
Inicia un rastreo, consulta su estado, transmite resultados por REST, una herramienta MCP o el SDK. Elige una:
Un rastreo de sitio completo es un solo POST con una clave. Writ reparte la semilla por la flota y entrega el resultado como un dataset invocable.
# No account, no key — a few same-domain pages, one level deep.
curl -X POST https://api.usewrit.app/v1/keyless/crawl \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "limit": 3}'
# With a key: the whole site, as a job you poll.
curl -X POST https://api.usewrit.app/api/crawl \
-H "Authorization: Bearer $WRIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "max_depth": 3, "page_budget": 500}'
curl https://api.usewrit.app/api/crawl/8125 -H "Authorization: Bearer $WRIT_API_KEY" Sin cuenta para probarlo: el nivel sin clave rastrea unas pocas páginas del mismo dominio, un nivel de profundidad, con una asignación diaria. El alcance completo, los logins y un dataset invocable necesitan clave.
Apunta tu asistente a Writ y podrá rastrear un sitio directamente y luego leer las filas sin que escribas un parser.
claude mcp add writ-cloud \
-e WRIT_API_KEY=wt_your_api_key \
-- npx -y writ-mcp
# then, one line in the session:
writ_crawl_site({ url: "https://example.com",
intent: "product pages with specs",
page_budget: 500, save_as: "example-catalog" })
writ_crawl_status({ crawl_id: 8125 }) Clientes con archivo de config — Claude Desktop · Cursor · Windsurf
Con save_as el rastreo queda re-ejecutable e invocable: las siguientes ejecuciones reutilizan datos recientes en vez de volver a rastrear.
npm install github:usewrit/writ-sdks --workspace typescript
import { CloudApi } from "@usewrit/agent-sdk";
const cloud = new CloudApi({ apiKey: process.env.WRIT_API_KEY });
const job = await cloud.crawl({ url: "https://example.com", max_depth: 3, page_budget: 500 });
const status = await cloud.crawlStatus(job.id);
console.log(status.pages_done, "/", status.pages_discovered); pip install "git+https://github.com/usewrit/writ-sdks#subdirectory=python"
from writ_agent import Cloud
cloud = Cloud(api_key=os.environ["WRIT_API_KEY"])
job = cloud.crawl("https://example.com", max_depth=3, page_budget=500)
status = cloud.crawl_status(job["id"])
print(status["pages_done"], "/", status["pages_discovered"]) go get github.com/usewrit/writ-sdks/go
client := writ.New(writ.WithAPIKey(os.Getenv("WRIT_API_KEY")))
job, err := client.Cloud.Crawl(ctx, writ.CrawlStartParams{
URL: "https://example.com",
MaxDepth: writ.Ptr(int64(3)),
PageBudget: writ.Ptr(int64(500)),
})
status, _ := client.Cloud.CrawlStatus(ctx, job.ID) cargo add writ-client --git https://github.com/usewrit/writ-sdks
use writ_client::{CloudClient, CrawlStartParams};
let cloud = CloudClient::from_env()?;
let job = cloud.crawl(&CrawlStartParams {
url: "https://example.com".into(),
max_depth: Some(3),
page_budget: Some(500),
..Default::default()
}).await?;
let status = cloud.crawl_status(job.id).await?;