extract_structured
Dele al extractor un JSON Schema y un prompt en lenguaje natural. El LLM lee la página y devuelve datos que coinciden con su esquema. Cuando no hay un proveedor de LLM configurado, recurre a la extracción con selectores CSS usando sus indicaciones.
Casos de uso
Extracción de productos basada en esquema
Defina los campos que desea una sola vez; el LLM asigna cualquier sitio de comercio electrónico a su esquema.
Análisis de currículos y documentos
Extraiga nombres de candidatos, habilidades e historial laboral directamente en un objeto tipado.
Carga inicial de grafos de conocimiento
Extraiga entidades y relaciones de los artículos en JSON estructurado para cargadores de grafos.
Endpoint
/api/v1/tools/extract_structuredParameters
llmConfig para usar la extracción impulsada por LLM. Sin ella, la herramienta usa selectorHints para una extracción CSS determinista — más económica y sin necesidad de API key de LLM.| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Required | - | URL de la que extraer datos Example: https://example.com/product/123 |
schema | object | Required | - | JSON Schema que describe los datos a extraer Example: {"type":"object","properties":{"title":{"type":"string"},"price":{"type":"number"}},"required":["title"]} |
prompt | string | Optional | - | Instrucciones en lenguaje natural que guían la extracción con LLM Example: Extract the product name, current price, and whether it is in stock |
llmConfig | object | Optional | - | Configuración opcional del proveedor de LLM (provider, apiKey). Omítala para usar el respaldo de selectores CSS. Example: {"provider": "openai", "apiKey": "sk-..."} |
selectorHints | object | Optional | - | Indicaciones de selectores CSS para guiar la extracción (también usadas por el respaldo de selectores) Example: {"title": "h1.product-title", "price": ".price"} |
fallbackToSelectors | boolean | Optional | true | Recurrir a la extracción con selectores CSS cuando el LLM no esté disponible Example: true |
respect_robots | boolean | Optional | true | 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 |
Ejemplos de solicitud
cURL — extracción con LLM
curl -X POST https://crawlforge.dev/api/v1/tools/extract_structured \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/product/123",
"schema": {
"type": "object",
"properties": {
"title": { "type": "string" },
"price": { "type": "number" },
"in_stock": { "type": "boolean" }
},
"required": ["title", "price"]
},
"prompt": "Extract the product name, price in USD, and availability",
"llmConfig": { "provider": "openai", "apiKey": "sk-..." }
}'TypeScript — respaldo de selectores
const response = await fetch('https://crawlforge.dev/api/v1/tools/extract_structured', {
method: 'POST',
headers: {
'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://example.com/product/123',
schema: {
type: 'object',
properties: {
title: { type: 'string' },
price: { type: 'number' },
},
required: ['title'],
},
selectorHints: {
title: 'h1.product-title',
price: '.price-value',
},
fallbackToSelectors: true,
}),
});
const data = await response.json();
if (data.success) {
console.log(data.data.extracted.title, data.data.extracted.price);
}Python
import requests, os
response = requests.post(
'https://crawlforge.dev/api/v1/tools/extract_structured',
headers={
'X-API-Key': os.environ['CRAWLFORGE_API_KEY'],
'Content-Type': 'application/json',
},
json={
'url': 'https://example.com/article/42',
'schema': {
'type': 'object',
'properties': {
'headline': {'type': 'string'},
'author': {'type': 'string'},
'published_at': {'type': 'string'},
'tags': {'type': 'array'},
},
'required': ['headline'],
},
'prompt': 'Extract headline, author, publish date (ISO 8601), and tags',
},
)
data = response.json()
if data['success']:
print(data['data']['extracted'])Ejemplo de respuesta
{ "success": true, "data": { "url": "https://example.com/product/123", "data": { "title": "Premium Wireless Headphones", "price": 299.99, "in_stock": true }, "extraction": { "method_by_field": { "title": "selector", "price": "json-ld", "in_stock": "meta" }, "llm_used": false, "note": "Selector/structured-data extraction; LLM-guided extraction is available via the CrawlForge MCP server" }, "extracted_at": "2026-08-26T14:30:00.000Z" }, "credits_used": 3, "credits_remaining": 997, "processing_time": 1240}data.dataUna clave por cada propiedad de su esquema, convertida al tipo declarado. Un campo que no se pudo encontrar es null.data.extraction.method_by_fieldCómo se obtuvo cada campo: `selector` desde una entrada de selectorHints, `json-ld` desde datos estructurados, `meta` desde una metaetiqueta, o `none` cuando nada coincidió.data.extraction.llm_usedSiempre false en la API REST alojada: la extracción se basa en selectores y datos estructurados, nunca es generativa.data.extraction.noteRecuerda dónde está disponible la extracción guiada por LLM.data.extracted_atMarca de tiempo ISO 8601 de la extracción.Manejo de errores
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.
Costo en credits
Consejo: Combínela con scrape_structured (2 credits, solo CSS) cuando ya tenga selectores estables y no necesite la flexibilidad de un LLM.