Skim

Transforme qualquer URL em Markdown limpo para agentes de IA — uma ferramenta read(url), hospedada, sem cadastro, sem chave de API.

Documentação

Documentação do Skim

O Skim lê uma URL e retorna seu conteúdo principal como Markdown limpo. Gratuito, sem cadastro, sem chave. Duas formas de usar.

1. MCP (recomendado para agentes)

Endpoint MCP Streamable-HTTP — adicione como servidor remoto:

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

Ferramenta: 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
})

Retorna { 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}

Opções de query/body: format=markdown|text|data|jobs (markdown padrão; text também remove marcação de links; data = JSON estruturado; jobs = array normalizado de ATS/vagas, veja abaixo), links=0, max_chars=N.

Dados estruturados (format=data) — para agregadores

Em vez do corpo legível, obtenha os dados legíveis por máquina que a página já incorpora — sem parsing de HTML do seu lado:

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

Retorna { title, description, canonical, jsonld:[…], opengraph:{…}, twitter:{…}, meta:{…}, counts:{…} }. jsonld são os blocos schema.org da página (Product, Offer, JobPosting, Review, Article, BreadcrumbList…) analisados de cada <script type="application/ld+json"> (incluindo @graph), para que um agregador de preço/especificação/vaga/produto possa ler campos estruturados direto da fonte. Funciona com render=js para páginas SPA. Sites sem dados incorporados retornam arrays vazios (ainda assim JSON válido).

3. Leia você mesmo (leitor limpo)

Não é um agente? Cole qualquer URL no leitor limpo para remover anúncios, pop-ups e poluição e obter uma página legível e compartilhável: https://skim.perch-app.workers.dev/r?url=<page>.

Construindo um agregador de vagas ou leitor de feeds

O Skim funciona bem como uma camada de busca + extração no servidor: seu agregador ou agente chama o Skim, o Skim busca o upstream e devolve conteúdo limpo, para que você nunca precise enviar um navegador ou uma stack de scraper. Dois padrões:

Vagas normalizadas (format=jobs) — um schema para cada ATS. Adicione &format=jobs e o Skim mapeia feeds do Greenhouse, Lever, Ashby, Workable, SmartRecruiters e Recruitee (além de qualquer página de carreiras com JSON-LD JobPosting, e um fallback genérico de array) em um único array unificado — assim você escreve seu agregador uma vez em vez de um parser por provedor:

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 }, … ] }

A mesma chamada funciona via MCP (read(url, format:"jobs")) e para um board renderizado em JS (adicione render=js). Prefere o feed bruto? Omita format e o Skim retorna o JSON do provedor verbatim:

APIs JSON de ATS (bruto) — o Skim retorna o JSON verbatim (o corpo inteiro, até 5 MB), para que você possa analisá-lo diretamente:

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

Boards de vagas renderizados no cliente (SPA) — adicione render=js para que o Skim execute a página em um navegador headless real antes de extrair, e então retorne Markdown limpo:

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

O Skim repassa o status HTTP do upstream diretamente — um 404 significa que aquela empresa/board não existe naquele ATS (não é um erro do Skim), e um 403 significa que o site bloqueou a busca. Corpos grandes são retornados inteiros até 5 MB; passe max_chars=N apenas se quiser limitar o comprimento você mesmo.

Leituras em lote — fazendo polling de vários boards de uma vez? Envie até 10 URLs em uma única chamada e receba um array de volta (cada resultado carrega seu próprio url / status / content ou 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":[...]}

Chame direto do navegador — todo endpoint envia Access-Control-Allow-Origin: *, então um dashboard ou agregador no lado do cliente pode fetch() o Skim diretamente sem backend e sem erros de CORS (o Skim faz a busca upstream no servidor por você):

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

O que ele processa

HTML (→ Markdown, com conteúdo principal extraído), texto puro, JSON e XML (retornados como estão). PDFs e binários ainda não são suportados. Endereços privados/internos são bloqueados. Limite de taxa: 40 leituras/minuto por IP.

Notas

O Skim se identifica como SkimBot/1.0 e segue redirecionamentos. É um leitor, não uma fazenda de scrapers — seja respeitoso com os sites que você lê.