Saltar al contenido
Extracción1 credit

scrape_template

20 extractores predefinidos: sitios populares, seis bolsas de empleo ATS leídas a través de la API pública documentada de cada plataforma, y APIs gubernamentales sin clave. Sin esquema, sin selectores, sin LLM: pase un nombre de plantilla con una URL o con params. 1 credit por llamada, sin importar cuántos registros vuelvan.

Casos de uso

Datos rápidos de comercio electrónico

Obtenga el precio, la calificación y el stock de un producto de Amazon sin escribir un solo selector.

Agregación de perfiles de desarrolladores

Combine repositorios de GitHub, paquetes de npm y actividad de Stack Overflow en una sola vista de desarrollador.

Monitoreo de redes sociales

Rastree lanzamientos de Product Hunt y Hacker News con un único endpoint por fuente; para Reddit, lea un post con reddit-thread y su árbol de comentarios con reddit_search.

Bolsas de empleo enteras en una sola llamada

Lea todas las vacantes publicadas de la bolsa de Greenhouse, Lever, Ashby, Workable, Recruitee o Teamtailor de una empresa: valores exactos desde la propia API de la plataforma, no extraídos de una página de empleo.

Endpoint

POST/api/v1/tools/scrape_template
Auth Required
1 req/s en el plan Free
1 credit

Parameters

NameTypeRequiredDefaultDescription
template
stringRequired-
Nombre de la plantilla: una de las 20 plantillas admitidas. Envíe `"auto"` para que la plantilla se elija a partir de la `url`; la respuesta informa el identificador elegido, nunca el literal `"auto"`. Envíe `"list"` para descubrirlas mediante programación. Con `"list"`, cada conector que admite `params` los enumera como `params: [{ name, required, description }]`.
Example: github-repo
url
stringOptional-
URL a scrapear. Obligatoria salvo que `template` sea `"list"`, o que esté invocando un conector mediante `params`.
Example: https://github.com/mysleekdesigns/crawlforge-mcp
params
objectOptional-
Entradas para un conector que lee una API de plataforma en lugar de una página: el identificador de la bolsa para una bolsa de empleo (`company`), `store` y `collection` para `shopify-collection`, `vin` para `nhtsa-vin`, los propios campos de búsqueda del registro para `npi-provider`. Los extras específicos de cada conector también van aquí: `content: true` de Greenhouse, `details: true` de Workable, `skip`/`limit` de Lever, `per_page`/`offset` de Teamtailor. Si falta una entrada obligatoria, la solicitud se rechaza nombrando el parámetro.
Example: { "company": "stripe" }
timeout
numberOptional15000
Tiempo de espera de la solicitud en milisegundos (5000–60000).
Example: 15000
respect_robots
booleanOptionaltrue
Respeta el robots.txt del sitio de destino. Con el valor `true`, una ruta que robots.txt no permita a `CrawlForge` se rechaza con un 403 antes de descargar nada y no se cobran credits. Póngalo en `false` solo para destinos con los que tenga su propio acuerdo: la respuesta incluye entonces una entrada `warnings` y la anulación queda registrada en su API key.
Example: true
max_inline_chars
numberOptional40000
Tamaño máximo del resultado que se devuelve en línea, en caracteres de su JSON (de 1.000 a 10.000.000). Por encima, la respuesta incluye `preview` (los primeros `max_inline_chars` caracteres del JSON formateado), `result_handle`, `total_chars`, `truncated: true` y `expires_at`, y [read_result](/docs/api-reference/tools/read-result) lee el resto por 1 credit por llamada. Los resultados almacenados se conservan 1 hora.
Example: 40000

Plantillas: páginas y productos

20 plantillas en tres grupos. Cada una devuelve una forma JSON normalizada y ajustada a su fuente.

amazon-product
Título del producto, precio, calificación, reseñas, estado del stock
shopify-product
Precio exacto, precio comparativo, stock y opciones por variante — leídos del propio JSON de la tienda, de modo que los precios no pueden malinterpretarse ni inventarse. Funciona en cualquier tienda Shopify, incluidos los dominios personalizados. Cuando una tienda rechaza su endpoint JSON (401, 403, 404 o 410), el registro se lee del JSON-LD schema.org de la propia página del producto, marcado source: json-ld y con un aviso; el stock por variante, los precios de comparación y los nombres de las opciones no están en JSON-LD, así que esos campos son null
shopify-collection
Todos los productos de una colección desde el propio products.json de la tienda, con el mismo precio y stock autorizados que shopify-product devuelve para un artículo. 30 por página de forma predeterminada, 250 como máximo
github-repo
Recuentos exactos de estrellas, forks, watchers e issues abiertos como enteros (null cuando la página no trae la cifra exacta, nunca un «32.4k» redondeado), descripción, topics, licencia, página web y readme_summary, el primer párrafo del README. language y last_updated son null en la página que GitHub sirve a un visitante sin sesión iniciada, que es la que lee esta plantilla. Un enlace /tree/<branch>/… lee la página principal del repositorio
youtube-video
Título, canal, visualizaciones, me gusta, duración, fecha de publicación. Un enlace para compartir youtu.be/<id> se lee como su página de reproducción, y auto lo reconoce
reddit-thread
El registro del post desde el archivo Arctic Shift — id, título, subreddit, autor, puntuación, proporción de votos positivos, número de comentarios, cuerpo, flair, estado de eliminación (reddit.com bloquea el scraping directo). Pase el id a reddit_search con mode "thread" para obtener el árbol de comentarios. Una URL que nombra un subreddit equivocado devuelve igualmente el post que indica su id, con una entrada en warnings que da su subreddit real
hacker-news-front-page
Historias destacadas, puntos y número de comentarios
producthunt-launch
Nombre del producto, lema, categorías, sitio web, número de seguidores y reseñas
stackoverflow-question
Pregunta, votos, respuestas, etiquetas, aceptación
npm-package
Versión, descargas semanales, licencia, dependencias

Plantillas: bolsas de empleo

Seis sistemas de seguimiento de candidatos, leídos cada uno a través del endpoint que esa plataforma documenta para uso público y sin autenticación. Los seis se normalizan sobre una única forma de empleo, así que dos bolsas se unen sin mapeo por fuente — la guía de APIs de bolsas de empleo cubre la forma y el razonamiento.

greenhouse-jobs
La Job Board API. Todas las vacantes publicadas en una solicitud; descripciones opcionales mediante content: true
lever-postings
La Postings API, con equipo, tipo de dedicación y modalidad de trabajo ya separados. Paginación con skip/limit
ashby-jobs
La Public Job Posting API. Departamento, equipo, tipo de contrato y modalidad de trabajo; descripciones opcionales con descriptions: true
workable-jobs
El endpoint público de cuentas. Componentes de la ubicación e indicador de teletrabajo; descripciones opcionales mediante details: true
recruitee-offers
La Careers Site API. Departamento, ubicación, código de tipo de contrato y banda salarial
teamtailor-jobs
El feed RSS documentado del sitio de empleo, leído conservando su espacio de nombres tt:. 100 vacantes salvo que per_page indique otra cosa

Plantillas: APIs gubernamentales

APIs federales de EE. UU. gratuitas y sin clave, documentadas por las agencias que las publican.

nhtsa-vin
Decodificación de VIN a través de la API vPIC de la NHTSA — marca, modelo, año, acabado, carrocería, motor, planta, con el conjunto completo de campos bajo raw. Se aceptan VIN parciales; los códigos de error de vPIC se exponen en lugar de silenciarse
npi-provider
El registro NPPES de los CMS de proveedores sanitarios de EE. UU., consultable por número, nombre, taxonomía o ubicación. Un registro por NPI, sin nada más añadido

Los conectores de lista devuelven muchos registros en una sola llamada

Un conector que lee un endpoint de listado devuelve items y count dentro de data en lugar de un único registro. shopify-collection y los seis conectores de bolsas de empleo funcionan así.

  • Cada registro de empleo lleva los mismos doce campos — id, title, url, location, department, team, employment_type, remote, published_at, updated_at, description, source — y un campo que la plataforma no publica es null, nunca una suposición.
  • Pase el identificador de la bolsa en params, o pase una URL de bolsa y el conector resolverá por sí mismo el endpoint de la API.
  • Greenhouse, Workable y Ashby hacen opcionales las descripciones porque dominan la carga útil: una bolsa grande de Greenhouse pasa de 349 KB a 4,2 MB con content: true, y la bolsa Ashby de 767 vacantes de OpenAI ocupa 5,9 MB con descriptions: true.
  • El costo es de 1 credit fijo por llamada, sin importar cuántos registros vuelvan.

Deliberadamente no publicado

Ejemplos de solicitud

cURL — github-repo

terminalBash
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template": "github-repo",
    "url": "https://github.com/mysleekdesigns/crawlforge-mcp"
  }'

TypeScript — amazon-product

scrapeTemplate.tsTypescript
// npm install crawlforge-sdk
import { CrawlForge } from 'crawlforge-sdk';

const client = new CrawlForge({ apiKey: process.env.CRAWLFORGE_API_KEY });

const result = await client.scrapeTemplate({
  template: 'amazon-product',
  url: 'https://www.amazon.com/dp/B08XYZ1234',
  timeout: 20000,
});

// result.data is untyped in crawlforge-sdk 0.1 — its shape is the Response Example below.
const { data: product } = result.data as { data: { title: string; price: string | null; rating: number | null } };
console.log(product.title, product.price, product.rating);

Python — amazon-product

scrape_template.pyPython
# pip install crawlforge
from crawlforge import CrawlForge

client = CrawlForge()  # reads CRAWLFORGE_API_KEY

result = client.scrape_template(
    template='amazon-product',
    url='https://www.amazon.com/dp/B08XYZ1234',
    timeout=20000,
)

# result.data is a plain dict — its shape is the Response Example below.
product = result.data['data']
print(product['title'], product['price'], product['rating'])

cURL — descubrir plantillas

terminalBash
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "template": "list" }'

cURL — greenhouse-jobs mediante params

terminalBash
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
  -H "X-API-Key: cf_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template": "greenhouse-jobs",
    "params": { "company": "stripe" }
  }'

Ejemplo de respuesta

200 OK0.8s
{
"success": true,
"data": {
"template": "greenhouse-jobs",
"params": {
"company": "stripe"
},
"data": {
"items": [
{
"id": "4012345",
"title": "Staff Software Engineer",
"url": "https://job-boards.greenhouse.io/stripe/jobs/4012345",
"location": "Seattle, Washington, United States",
"department": null,
"team": null,
"employment_type": null,
"remote": null,
"published_at": "2026-08-04T17:12:03.000Z",
"updated_at": "2026-08-21T09:44:51.000Z",
"description": null,
"source": "greenhouse-jobs",
"raw_extra": {
"internal_job_id": "4098765",
"requisition_id": "REQ-1234",
"offices": null
}
}
],
"count": 571,
"company": "Stripe"
},
"template_name": "Greenhouse Job Board",
"extracted_at": "2026-08-28T12:00:00.000Z",
"fetched_url": "https://boards-api.greenhouse.io/v1/boards/stripe/jobs"
},
"credits_used": 1,
"credits_remaining": 999,
"processing_time": 812
}
Field Descriptions
data.data.itemsUn registro por vacante publicada, con la forma de doce campos que comparten todos los conectores de bolsas de empleo
data.data.items[0].departmentGreenhouse solo envía los departamentos con `content: true`, así que un registro resumido informa null en lugar de un departamento deducido del título
data.data.countRegistros en esta respuesta; una fuente que declara un total mayor informa además `total_available`
data.template_nameNombre legible de la plantilla que se ejecutó
data.fetched_urlEl endpoint realmente leído: aparece siempre que difiere de lo que usted pasó, lo que incluye toda llamada hecha solo con `params`
credits_used1 credit fijo por llamada, independientemente de la plantilla o del número de registros

Manejo de errores

El conector no pudo construir una solicitud (400 Bad Request)

Un problema de parámetros, rechazado antes de descargar nada y nunca facturado. INVALID_TEMPLATE_PARAMS transmite el mensaje del propio conector nombrando el parámetro que esperaba: el token de la bolsa en job-boards.greenhouse.io/<token>, el subdominio en <company>.recruitee.com. MISSING_URL significa que envió params a una plantilla que lee una página y no tiene forma con params. NO_TEMPLATE_MATCH significa que template: "auto" no reconoció nada en la URL: nombre usted mismo la plantilla o compruébela con template: "list".

Bloqueado por robots.txt (403 Forbidden)

El robots.txt del sitio de destino no permite esta ruta a CrawlForge. Establezca respect_robots: false para anularlo si tiene su propio acuerdo con el destino: la anulación queda registrada en su API key. La anulación no alcanza a un host incluido en la lista de exclusión permanente de CrawlForge, que se rechaza sea cual sea el valor de respect_robots. La comprobación se realiza sobre la URL que la plantilla descarga realmente, que en shopify-product y npm-package es un endpoint legible por máquina del mismo host, no la URL que usted envió.

Costo en credits

1 credit
1 credit por solicitud
1 credit fijo por llamada. La forma más económica de obtener datos estructurados de un sitio admitido.

Consejo: ¿Necesita un sitio que no es compatible? Use scrape_structured para selectores personalizados (2 credits) o extract_with_llm para extracción con LLM.

Herramientas relacionadas