Pulsa / para buscar

Toda la documentación
docs Llamarlo desde tu software Referencia de la API REST

Se ejecuta enWrit CloudDesktopAutoalojado

api ▸ toda la superficie

Referencia API

Toda la superficie, endpoint por endpoint.

Writ responde en dos lugares: writ-agentd, el daemon agente en tu propia máquina en http://127.0.0.1:8131, y Writ Cloud en https://api.usewrit.app. Misma gramática JSON y mismo encabezado Bearer en ambos — familias de tokens distintas, y solo uno de los dos se factura.

Writ se ejecuta en tus propias cuentas, con tus propias credenciales y datos, en sitios que tienes autorización para usar.

superficies ▸ local + cloud

Dos superficies.

El daemon local es el software que la app de escritorio (o el agente autoalojado) mantiene en marcha: solo loopback, gratis. Writ Cloud es la superficie alojada que una clave wt_ desbloquea. Los SDKs descubren el primero y pueden llevar la segunda.

SuperficieURL baseAuth
Agente local (writ-agentd)http://127.0.0.1:8131Bearer wlt_ · wlk_ · wlo_
Writ Cloudhttps://api.usewrit.appBearer wt_ · encabezado X-Writ-Client-Id (sin clave)

Usa 127.0.0.1, no localhost — el daemon comprueba Host y Origin contra DNS rebinding. Un gemelo HTTPS escucha en https://127.0.0.1:8132 con una CA por instalación en ~/.writ/tls/ca.pem, y WRIT_PORT sustituye el puerto.

Un workflow publicado es una puerta aparte: POST /v1/{slug}/{path} en Writ Cloud, autenticado con una consumer key csk_ que acuñas para quienes lo llaman, documentada en los endpoints gestionados. El servidor MCP (JSON-RPC en /mcp) y las entregas webhook firmadas también tienen sus propias páginas: servidor MCP, webhooks.

auth ▸ cinco prefijos

Familias de tokens.

Un solo encabezado en todas partes: Authorization: Bearer …. Lo que cambia es la familia del token — cada prefijo está limitado a su superficie. Rotación y detalle de scopes: autenticación.

TokenSuperficieRol
wlt_LocalToken runtime — toda la superficie. La única familia que puede acuñar claves acotadas.
wlk_LocalClave acotada acuñada vía POST /v1/keys; los scopes son un CSV de read|run|admin.
wlo_LocalToken OAuth 2.1 con el scope run.
wt_CloudClave API para llamadas cloud medidas en api.usewrit.app.
X-Writ-Client-IdCloudNo es un token — un encabezado de id de dispositivo para las rutas sin clave y su asignación fija.

Acuñar una clave wlk_ exige el token runtime wlt_ — así una clave acotada filtrada nunca puede ampliarse a sí misma:

const key = await client.keys.create({ name: "ci-runner", scopes: "read,run" });

errores ▸ códigos estables

Una sola forma de error.

Los errores son objetos JSON pequeños: {"error": "…", "code": "…"} — una frase legible y un código estable. Los códigos:

CódigoHTTPSignificado
bad_request400JSON malformado, un campo ausente o un parámetro fuera de su rango permitido.
unauthorized401Sin token Bearer, o uno que el daemon no reconoce.
captcha_required402La operación encontró un paso de verificación que necesita a un humano.
forbidden403El token es válido pero sus scopes no cubren esta operación.
not_found404No hay ningún recurso con ese id o esa ruta.
device_capacity409El dispositivo está en su límite de capacidad para este recurso.
vault_locked423El vault cifrado está bloqueado; desbloquéalo y reintenta.
too_many_requests429Demasiadas solicitudes en poco tiempo; espácialas y reintenta.
internal500Fallo inesperado dentro del daemon.

Algunas rutas 4xx responden text/plain en lugar de JSON. Al leer cuerpos de error, tolera el no-JSON.

runs ▸ el contrato

Semántica de ejecución.

El contrato que hay que entender antes de cablear nada:

  • Asíncrono por defecto. POST /v1/workflows/{id}/run responde en cuanto la ejecución se despacha, con su id.
  • O bloquea hasta el resultado. Añade ?wait=true — la llamada espera el veredicto. timeout está en segundos, acotado a 1–3600, 120 por defecto.
  • Un run fallido es un resultado, no un error. Recibes la ejecución con status: "failed"; reserva el manejo de errores para transporte y auth.
  • Dos formas de id. El feed de runs devuelve ids compuestos como workflow-3; cada llamada /v1/runs/{id}/* toma el id numérico de fila.

referencia ▸ 98 operaciones

La superficie local.

Cada operación del daemon local, exactamente como la enuncia la descripción OpenAPI — 98 operaciones en 16 grupos, todas bajo /v1 en loopback, todas autenticadas con Bearer.

Cada llamada tiene esta forma — un encabezado Bearer, JSON de entrada, JSON de salida:

monitor.sh

# Local agent daemon — loopback, wlt_/wlk_ token (use 127.0.0.1, not localhost)
curl -X POST http://127.0.0.1:8131/v1/monitors \
  -H "Authorization: Bearer $WRIT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/pricing"}'

Los sobres de lista varían a propósito. La mayoría responde {"data": [...], "count": n}; /v1/runs añade "total"; monitors, selectors, extractors, automations y /v1/changes/recent responden arrays desnudos.

Agente

MétodoRutaResumen
GET/v1/agentEstado ligero del agente
GET/v1/healthSonda de salud profunda

Workflows

La semántica de arriba aplica a POST /v1/workflows/{id}/run. El par session gestiona la sesión del carril HTTP sin navegador que un workflow puede mantener.

MétodoRutaResumen
GET/v1/workflowsListar workflows
POST/v1/workflowsCrear un workflow
GET/v1/workflows/{id}Leer un workflow
PATCH/v1/workflows/{id}Actualizar un workflow
DELETE/v1/workflows/{id}Eliminar un workflow
POST/v1/workflows/{id}/runEjecutar un workflow (asíncrono por defecto, o esperar el resultado)
POST/v1/workflows/{id}/cancelCancelar la ejecución viva más reciente de un workflow
GET/v1/workflows/{id}/sessionEstado de la sesión del carril HTTP sin navegador
DELETE/v1/workflows/{id}/sessionBorrar la sesión persistida

Ejecuciones

GET /v1/runs/{id}/events transmite el progreso en vivo por SSE. Cancelar una ejecución ya resuelta responde 409 — con la propia ejecución como cuerpo.

MétodoRutaResumen
GET/v1/runsListar ejecuciones (feed enriquecido)
GET/v1/runs/{id}Leer una ejecución
GET/v1/runs/{id}/resultsPayload bruto del resultado de una ejecución
GET/v1/runs/{id}/dataDatos extraídos de una ejecución
GET/v1/runs/{id}/eventsStream de eventos de ejecución en vivo (SSE)
POST/v1/runs/{id}/cancelCancelar una ejecución viva por su id

Monitores

MétodoRutaResumen
GET/v1/monitorsListar monitores
POST/v1/monitorsCrear un monitor
GET/v1/monitors/capacityMedidor de capacidad de comprobación del dispositivo
GET/v1/monitors/{id}Leer un monitor
PATCH/v1/monitors/{id}Actualizar un monitor
DELETE/v1/monitors/{id}Eliminar un monitor
POST/v1/monitors/{id}/runLanzar una comprobación ahora
GET/v1/monitors/{id}/changesHistorial de cambios y disponibilidad de un monitor
GET/v1/changes/recentCambios recientes en todos los monitores

Selectores

MétodoRutaResumen
GET/v1/monitors/{id}/selectorsListar los selectores de un monitor
POST/v1/monitors/{id}/selectorsAñadir un selector a un monitor
GET/v1/monitors/{id}/selectors/{selector_id}Leer un selector
PATCH/v1/monitors/{id}/selectors/{selector_id}Actualizar un selector
DELETE/v1/monitors/{id}/selectors/{selector_id}Eliminar un selector
POST/v1/monitors/{id}/selectors/{selector_id}/toggleAlternar el estado activo de un selector
POST/v1/monitors/{id}/selectors/{selector_id}/testSondear un selector contra la página real
POST/v1/monitors/{id}/selectors/{selector_id}/set-baselineCapturar la línea base del selector
POST/v1/monitors/{id}/selectors/{selector_id}/clear-baselineBorrar la línea base guardada

Extractores

Atención al toggle: PATCH, no POST como en los selectores.

MétodoRutaResumen
GET/v1/selectors/{selector_id}/extractorsListar los extractores de un selector
POST/v1/extractorsCrear un extractor
GET/v1/extractors/{extractor_id}Leer un extractor
PATCH/v1/extractors/{extractor_id}Actualizar un extractor
DELETE/v1/extractors/{extractor_id}Eliminar un extractor
PATCH/v1/extractors/{extractor_id}/toggleAlternar el estado activo de un extractor
POST/v1/extractors/{extractor_id}/testProbar un extractor guardado

Automatizaciones

MétodoRutaResumen
GET/v1/automationsListar automatizaciones
POST/v1/automationsCrear una automatización
GET/v1/automations/{id}Leer una automatización
PATCH/v1/automations/{id}Actualizar una automatización
DELETE/v1/automations/{id}Eliminar una automatización
POST/v1/automations/{id}/enableActivar / desactivar una automatización
POST/v1/automations/{id}/runDisparar una automatización ahora

Personas

MétodoRutaResumen
GET/v1/personasListar personas
POST/v1/personasCrear una persona
GET/v1/personas/{id}Leer una persona
PATCH/v1/personas/{id}Actualizar una persona
DELETE/v1/personas/{id}Eliminar una persona
GET/v1/personas/{id}/runsEjecuciones recientes que actuaron como esta persona
POST/v1/personas/validate-totpValidar una semilla TOTP
POST/v1/personas/{id}/test-2faProbar la 2FA de la persona

Secretos

Solo metadatos — ningún endpoint devuelve jamás el valor de un secreto.

MétodoRutaResumen
GET/v1/secretsListar secretos (solo metadatos)
POST/v1/secretsCrear un secreto
GET/v1/secrets/{key}Leer los metadatos de un secreto
DELETE/v1/secrets/{key}Eliminar un secreto

Vault

MétodoRutaResumen
GET/v1/vault/statusEstado del bloqueo de la aplicación
POST/v1/vault/lockBloquear el vault ahora
POST/v1/vault/unlockDesbloquear el vault

Archivos

MétodoRutaResumen
GET/v1/filesListar identificadores de archivo
POST/v1/filesSubir un archivo (multipart)
POST/v1/files/from-dataExportar datos de workflow a un archivo
GET/v1/files/{id}Leer un identificador de archivo
DELETE/v1/files/{id}Eliminar un archivo
GET/v1/files/{id}/contentDescargar los bytes del archivo

Datos

MétodoRutaResumen
GET/v1/dataSelector de workflow del explorador de datos
GET/v1/workflows/{id}/dataTabla agregada de datos extraídos
DELETE/v1/workflows/{id}/dataEliminar filas de datos extraídos
GET/v1/workflows/{id}/data/runsÍndice de instantáneas de datos
GET/v1/workflows/{id}/data/facetsFacetas por columna
GET/v1/workflows/{id}/data/exportExportar la tabla de datos extraídos

Conjuntos de datos

?format=json|csv|markdown|html — cualquier formato no-json responde texto renderizado en lugar de un cuerpo JSON.

MétodoRutaResumen
GET/v1/datasetsEl catálogo unificado de datasets
GET/v1/datasets/searchBúsqueda global de texto completo en todos los datasets
GET/v1/datasets/{id}Metadatos del dataset + esquema inferido
GET/v1/datasets/{id}/recordsPaginar los registros de un dataset
GET/v1/datasets/{id}/exportDescargar todos los registros de un dataset
GET/v1/datasets/{id}/searchBúsqueda de texto completo dentro de un dataset

Crawl

Las definiciones son crawls guardados e invocables. POST /v1/crawl/definitions/{ref}/run acepta max_age — un crawl previo lo bastante reciente se reutiliza en lugar de recargarse.

MétodoRutaResumen
GET/v1/crawlListar crawls
POST/v1/crawlIniciar un crawl
GET/v1/crawl/{id}Leer un crawl
POST/v1/crawl/{id}/cancelSolicitar la cancelación de un crawl
GET/v1/crawl/definitionsListar crawls guardados
POST/v1/crawl/definitionsGuardar una configuración de crawl
GET/v1/crawl/definitions/{ref}Leer un crawl guardado
PATCH/v1/crawl/definitions/{ref}Actualizar un crawl guardado
DELETE/v1/crawl/definitions/{ref}Eliminar un crawl guardado
POST/v1/crawl/definitions/{ref}/runEjecutar un crawl guardado (con reutilización de frescura opcional)
GET/v1/crawl/definitions/{ref}/dataLeer lo que un crawl guardado ya recolectó

Claves

Acuñar exige el token runtime wlt_.

MétodoRutaResumen
GET/v1/keysListar claves API
POST/v1/keysAcuñar una clave API acotada
GET/v1/keys/{id}Leer el registro de una clave
DELETE/v1/keys/{id}Eliminar el registro de una clave

Tickets WebSocket

MétodoRutaResumen
POST/v1/ws-ticketAcuñar un ticket WebSocket de un solo uso

cloud ▸ medido + sin clave

La superficie cloud.

Writ Cloud es la superficie alojada y medida en https://api.usewrit.app. La spec declara ahí cuatro operaciones REST: el Scrape de una página con una clave wt_, más un nivel sin clave identificado solo por un id de dispositivo. Todo lo demás del host cloud — endpoints publicados, MCP, webhooks — se documenta en su propia página.

MétodoRutaResumen
POST/api/v1/website-to-apiConvertir un sitio en API
GET/api/v1/website-to-api/{id}Consultar un build sitio-a-API
POST/api/crawl/scrapeScrape de una página (medido)
POST/api/crawlIniciar un rastreo de sitio completo
GET/api/crawl/{id}Consultar un rastreo
GET/api/targetsListar monitores
POST/api/targetsCrear un monitor
GET/api/targets/{id}Obtener un monitor
PATCH/api/targets/{id}Actualizar un monitor
DELETE/api/targets/{id}Eliminar un monitor
PATCH/api/targets/{id}/togglePausar o reanudar un monitor
POST/api/targets/{id}/runComprobar un monitor ahora
GET/api/targets/{id}/changesHistorial de cambios de un monitor
GET/api/targets/changes/recentCambios recientes en todos los monitores
POST/v1/keyless/crawlRastrear unas páginas (sin clave)
POST/v1/keyless/scrapeScrape de una página (sin clave)
POST/v1/keyless/mapMapear las URLs de un sitio (sin clave)
GET/v1/keyless/quotaAsignación sin clave restante

El sin clave responde 429 keyless_rate_limited cuando la asignación se agota; el medido responde 402 insufficient_credits cuando el fondo de créditos está vacío.

cloud.ts

const cloud = new CloudApi({ apiKey: process.env.WRIT_API_KEY }); // wt_…
const page = await cloud.scrape("https://example.com");
const site = await cloud.map("https://example.com", { search: "pricing", limit: 20 });
console.log(cloud.tier); // "metered" | "keyless"

faq

Preguntas de API, respondidas.

¿Es esta la API que llaman los SDKs?
Sí. Los cuatro SDKs publicados son clientes ligeros sobre exactamente estas operaciones, generados contra la misma descripción OpenAPI (writ-agent.yaml). Todo lo que listan las tablas, los SDKs lo hacen — y un simple curl también.
¿Cómo espero a que termine una ejecución?
POST /v1/workflows/{id}/run responde de inmediato por defecto. Añade ?wait=true para bloquear hasta el veredicto — timeout en segundos, acotado a 1–3600, 120 por defecto. O toma el id y suscríbete a GET /v1/runs/{id}/events (SSE). Un run que falla vuelve como resultado con su estado, no como un error HTTP.
¿Por qué esta lista devolvió un array desnudo?
A propósito. La mayoría de las listas responde {"data": [...], "count": n} y /v1/runs añade "total"; monitors, selectors, extractors, automations y /v1/changes/recent responden arrays desnudos. Cada forma es estable — lee cada lista según su sobre documentado.
¿Qué token va dónde?
Daemon local: un Bearer de las familias wlt_ (runtime), wlk_ (acotada) o wlo_ (OAuth 2.1), enviado a 127.0.0.1. Writ Cloud: una clave Bearer wt_ para llamadas medidas, o el encabezado X-Writ-Client-Id en las rutas sin clave. Los endpoints publicados son una vía aparte, autenticada con consumer keys csk_.
¿Llamar a la API local cuesta algo?
No. El daemon local es tu propia máquina — ejecuciones, monitores, crawls y lecturas de datos no llevan ahí ningún cargo de cómputo. Solo las llamadas a Writ Cloud se miden, desde tu fondo de créditos.

fin ▸ enviar

Apunta algo hacia ella.

El quickstart te lleva de la cuenta a la primera llamada en minutos; los SDKs envuelven toda esta página en clientes tipados.