Skim

Convierte cualquier URL en Markdown limpio para agentes de IA — una herramienta read(url), alojada, sin registro, sin clave API.

Documentación

Documentación de Skim

Skim lee una URL y devuelve su contenido principal como Markdown limpio. Gratuito, sin registro, sin clave. Dos formas de usarlo.

1. MCP (recomendado para agentes)

Endpoint MCP Streamable-HTTP — añádelo como servidor remoto:

https://skim.perch-app.workers.dev/mcp

Herramienta: read

read({
  url: "https://example.com/post",   // required, absolute http(s)
  links: true,        // optional, keep [text](url); default true
  max_chars: 8000     // optional, truncate long content
})

Devuelve { url, title, description, format, content, word_count, bytes, ms }.

2. HTTP

GET  https://skim.perch-app.workers.dev/api/read?url=https%3A%2F%2Fexample.com%2F
POST https://skim.perch-app.workers.dev/api/read   {"url":"https://example.com/","links":true,"max_chars":8000}

Opciones de consulta/cuerpo: format=markdown|text|data|jobs (markdown por defecto; text también elimina el marcado de enlaces; data = JSON estructurado; jobs = array normalizado de ATS/ofertas de empleo, ver más abajo), links=0, max_chars=N.

Datos estructurados (format=data) — para agregadores

En lugar del cuerpo legible, obtén los datos legibles por máquina que la página ya incorpora — sin análisis de HTML por tu parte:

GET https://skim.perch-app.workers.dev/api/read?url=<page>&format=data

Devuelve { title, description, canonical, jsonld:[…], opengraph:{…}, twitter:{…}, meta:{…}, counts:{…} }. jsonld son los bloques schema.org de la página (Product, Offer, JobPosting, Review, Article, BreadcrumbList…) analizados de cada <script type="application/ld+json"> (incluyendo @graph), de modo que un agregador de precios/especificaciones/ofertas/productos puede leer campos estructurados directamente desde la fuente. Funciona con render=js para páginas SPA. Los sitios sin datos incorporados devuelven arrays vacíos (sigue siendo JSON válido).

3. Léelo tú mismo (lector limpio)

¿No eres un agente? Pega cualquier URL en el lector limpio para eliminar anuncios, ventanas emergentes y desorden, y obtener una página legible y compartible: https://skim.perch-app.workers.dev/r?url=<page>.

Cómo crear un agregador de ofertas o un lector de feeds

Skim funciona bien como capa de extracción y obtención del lado del servidor: tu agregador o agente llama a Skim, Skim obtiene el contenido de la fuente y te devuelve contenido limpio, de modo que nunca necesitas un navegador ni una pila de scraping. Dos patrones:

Ofertas normalizadas (format=jobs) — un esquema para cada ATS. Añade &format=jobs y Skim mapea los feeds de Greenhouse, Lever, Ashby, Workable, SmartRecruiters y Recruitee (además de cualquier página de empleo con JSON-LD JobPosting, y un fallback genérico de array) en un único array unificado — así escribes tu agregador una sola vez en lugar de un analizador por proveedor:

GET https://skim.perch-app.workers.dev/api/read?url=https%3A%2F%2Fboards-api.greenhouse.io%2Fv1%2Fboards%2Fgitlab%2Fjobs&format=jobs
→ { "url": "...", "status": 200, "format": "jobs", "source": "greenhouse", "count": 196,
    "jobs": [ { "title": "Account Executive", "url": "https://.../jobs/123",
               "location": "Remote, Italy", "department": "Sales", "employment_type": "FullTime",
               "updated_at": "2026-08-10T16:52:46-04:00", "remote": true }, … ] }

La misma llamada funciona a través de MCP (read(url, format:"jobs")) y para un tablero renderizado con JS (añade render=js). ¿Prefieres el feed crudo? Omite format y Skim devuelve el JSON del proveedor tal cual:

APIs JSON de ATS (crudas) — Skim devuelve el JSON tal cual (todo el cuerpo, hasta 5 MB), para que puedas analizarlo directamente:

GET https://skim.perch-app.workers.dev/api/read?url=https%3A%2F%2Fboards-api.greenhouse.io%2Fv1%2Fboards%2F<company>%2Fjobs
# Greenhouse: https://boards-api.greenhouse.io/v1/boards/{company}/jobs
# Ashby:      https://api.ashbyhq.com/posting-api/job-board/{company}
# Lever:      https://api.lever.co/v0/postings/{company}?mode=json

Tableros de empleo renderizados en el cliente (SPA) — añade render=js para que Skim ejecute la página en un navegador headless real antes de extraer, y luego devuelva Markdown limpio:

GET https://skim.perch-app.workers.dev/api/read?url=<board-url>&render=js

Skim transmite el estado HTTP de la fuente directamente — un 404 significa que esa empresa/tablero no existe en ese ATS (no es un error de Skim), y un 403 significa que el sitio bloqueó la obtención. Los cuerpos grandes se devuelven completos hasta 5 MB; pasa max_chars=N solo si quieres limitar la longitud tú mismo.

Lecturas por lotes — ¿consultando varios tableros a la vez? Envía hasta 10 URLs en una sola llamada y recibe un array (cada resultado lleva su propio url / status / content o error):

POST https://skim.perch-app.workers.dev/api/read-batch   {"urls":["https://boards-api.greenhouse.io/v1/boards/a/jobs","https://api.lever.co/v0/postings/b?mode=json"]}
# or: GET https://skim.perch-app.workers.dev/api/read-batch?urls=<url1>,<url2>  → {"count":N,"results":[...]}

Llámalo directamente desde el navegador — cada endpoint envía Access-Control-Allow-Origin: *, de modo que un panel o agregador del lado del cliente puede fetch() Skim directamente sin backend y sin errores CORS (Skim realiza la obtención de la fuente del lado del servidor por ti):

const r = await fetch("https://skim.perch-app.workers.dev/api/read?url=" + encodeURIComponent(u) + "&format=data");
const data = await r.json();  // JSON-LD / OpenGraph / meta, from your frontend

Qué maneja

HTML (→ Markdown, con el contenido principal extraído), texto plano, JSON y XML (devueltos tal cual). Los PDF y binarios aún no son compatibles. Las direcciones privadas/internas están bloqueadas. Límite de velocidad: 40 lecturas/minuto por IP.

Notas

Skim se identifica como SkimBot/1.0 y sigue redirecciones. Es un lector, no una granja de scraping — sé considerado con los sitios que lees.