¿Qué es Valkoru Scraper?
Valkoru Scraper es una herramienta de extracción de datos que usa inteligencia artificial para obtener información estructurada de cualquier sitio web, sin necesidad de escribir código ni configurar selectores CSS.
A diferencia del web scraping tradicional, Valkoru Scraper entiende la estructura visual de una página como lo haría un humano, lo que significa que no se rompe cuando el sitio cambia.
Casos de uso típicos
- Comparar precios en e-commerce (MercadoLibre, Falabella, Ripley)
- Monitorear listados inmobiliarios (Portal Inmobiliario, Yapo)
- Agregar ofertas de empleo de múltiples portales
- Recopilar datos para investigación o análisis de mercado
Inicio rápido
Para empezar a extraer datos en menos de un minuto:
- Crea una cuenta gratuita en /app/register
- Ve a /app/extractor
- Pega la URL del sitio que quieres scrapear
- Haz clic en Extraer Datos
- Descarga los resultados en CSV o JSON
Primera extracción
Al abrir el extractor verás una barra de URL. Pega la dirección del listado que quieres extraer. Por ejemplo:
https://www.mercadolibre.cl/laptops
Valkoru Scraper detectará automáticamente qué tipo de datos hay en la página. Si quieres más control, abre las Opciones avanzadas.
Tipos de URL que funcionan bien
- Listados de productos (
/categoria,/busqueda) - Resultados de búsqueda de propiedades
- Listados de empleos con múltiples ofertas por página
- Directorios y catálogos públicos
Opciones avanzadas
Despliega las opciones avanzadas para personalizar la extracción:
Categoría
Ayuda al modelo a entender qué tipo de datos buscar. Las opciones son:
Auto-detectar— el modelo infiere la categoría (recomendado)E-commerce— productos, precios, ratings, stockInmobiliarias— propiedades, precios, m², ubicacionesEmpleos— cargos, empresas, salarios, modalidadGeneral— para cualquier otro tipo de contenido
Instrucciones
Campo de texto libre donde puedes indicarle al modelo qué extraer con precisión:
"Solo extrae productos con precio menor a $50.000" "Extrae solo propiedades de 3 dormitorios o más" "Ignora los avisos destacados, solo empleos orgánicos"
Extracción multi-página
Por defecto Valkoru Scraper extrae solo la primera página. Con el campo Páginas puedes indicar cuántas páginas de paginación quieres recorrer automáticamente.
El sistema detecta el botón "Siguiente" o el link de paginación y lo navega automáticamente hasta completar el número de páginas indicado o hasta que no haya más páginas.
Límites por plan
Plan gratuito: 1 página por extracción. Básico: hasta 5 páginas. Pro: hasta 10 páginas.
Descargar datos
Al terminar la extracción puedes descargar los resultados en dos formatos:
- JSON — útil para procesar con Python, Node.js o cualquier lenguaje de programación
- CSV — abre directamente en Excel, Google Sheets o Numbers
También puedes descargar extracciones anteriores desde Mi Cuenta.
Categorías disponibles
| Categoría | Campos típicos extraídos | Sitios de ejemplo |
|---|---|---|
ecommerce |
nombre, precio, marca, rating, stock, imagen | MercadoLibre, Falabella, Ripley |
real_estate |
título, precio, m², dormitorios, baños, ubicación | Portal Inmobiliario, Yapo |
jobs |
cargo, empresa, salario, modalidad, ubicación | Laborum, Trabajando, Bumeran |
general |
Inferido por el modelo según el contenido | Cualquier sitio público |
Límites por plan
| Plan | Extracciones/mes | Páginas máx. | Precio |
|---|---|---|---|
| Gratuito | 10 | 1 | $0 |
| Básico | 75 | 5 | $12/mes |
| Pro | 300 | 10 | $29/mes |
| Enterprise | Ilimitadas | Sin límite | Contactar |
¿Necesitas más extracciones? Ver planes.
Visión general
La API REST de Valkoru Scraper te permite ejecutar extracciones directamente desde tu código, sin necesidad de usar el extractor web. Está disponible en los planes Pro y Enterprise.
Base URL de todos los endpoints:
https://tu-dominio/api
Todas las respuestas usan Content-Type: application/json y codificación UTF-8.
Endpoints disponibles
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/scrape |
Ejecutar una extracción |
| GET | /api/jobs |
Listar extracciones anteriores |
| GET | /api/jobs/{id} |
Obtener datos de una extracción |
| GET | /api/auth/me |
Verificar credenciales y ver plan |
| GET | /api/account/stats |
Estadísticas de uso del mes |
Autenticación
La API acepta dos métodos de autenticación. Usa el que más se adapte a tu integración:
1. API Key (recomendado para integraciones)
Genera tu clave desde /app/api-key (requiere plan Pro o Enterprise). Incluye la clave en el header X-API-Key:
# Todas las peticiones deben incluir este header
X-API-Key: sk-tu-clave-aqui
Ejemplo con curl:
curl -X POST https://tu-dominio/api/scrape \
-H "Content-Type: application/json" \
-H "X-API-Key: sk-tu-clave-aqui" \
-d '{"url": "https://ejemplo.com", "category": "ecommerce"}'
2. Bearer Token (JWT)
Obtén un token con POST /api/auth/login y úsalo en el header Authorization:
# Paso 1: Obtener token curl -X POST https://tu-dominio/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email": "tu@email.com", "password": "tucontraseña"}' # Respuesta: { "access_token": "eyJhbGc...", "token_type": "bearer", "user": {"id": 1, "email": "tu@email.com", "plan": "pro"} } # Paso 2: Usar el token curl -X POST https://tu-dominio/api/scrape \ -H "Content-Type: application/json" \ -H "Authorization: Bearer eyJhbGc..." \ -d '{"url": "https://ejemplo.com"}'
Seguridad
Nunca expongas tu API key en código cliente (JavaScript del navegador, apps móviles). Úsala solo en servidores o scripts de backend. Si se ve comprometida, regénérala desde tu cuenta.
POST /api/scrape
Endpoint principal. Recibe una URL, ejecuta la extracción con IA y retorna los datos estructurados.
Body (JSON)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
url |
string (URL) | Sí | URL del sitio a extraer. Debe comenzar con http:// o https://. |
category |
string | No | Tipo de datos: ecommerce, real_estate, jobs, general. Por defecto auto-detectado. |
instructions |
string | No | Instrucciones en lenguaje natural para filtrar o personalizar la extracción. |
max_pages |
integer | No | Número de páginas a recorrer (1–20 según plan). Por defecto: 1. |
Respuesta exitosa (200)
{
"success": true,
"data": [
{
"titulo": "MacBook Pro 14\"",
"precio": "$1.299.990",
"marca": "Apple",
"rating": "4.8"
}
],
"metadata": {
"job_id": 42,
"url": "https://www.mercadolibre.cl/laptops",
"pages_scraped": 3,
"total_items": 48,
"method": "hard_gpt",
"cost": 0.0142,
"extraction_time": 8.3
}
}
Ejemplo en Python
import requests
API_KEY = "sk-tu-clave-aqui"
BASE_URL = "https://tu-dominio"
response = requests.post(
f"{BASE_URL}/api/scrape",
headers={"X-API-Key": API_KEY},
json={
"url": "https://www.mercadolibre.cl/laptops",
"category": "ecommerce",
"max_pages": 5,
"instructions": "Solo productos con precio menor a $500.000"
}
)
result = response.json()
print(f"Extraídos: {len(result['data'])} items")
print(f"Páginas: {result['metadata']['pages_scraped']}")
print(f"Costo: ${result['metadata']['cost']:.4f} USD")
Ejemplo en Node.js
const response = await fetch("https://tu-dominio/api/scrape", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": "sk-tu-clave-aqui"
},
body: JSON.stringify({
url: "https://www.portalinmobiliario.com/arriendo/departamento/las-condes",
category: "real_estate",
max_pages: 3
})
});
const { data, metadata } = await response.json();
console.log(`${data.length} propiedades extraídas de ${metadata.pages_scraped} páginas`);
GET /api/jobs
Lista todas las extracciones del usuario autenticado, ordenadas de más reciente a más antigua.
Parámetros de query
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page |
integer | 1 | Número de página |
limit |
integer | 20 | Items por página (máximo 100) |
# Listar las últimas 20 extracciones curl https://tu-dominio/api/jobs \ -H "X-API-Key: sk-tu-clave-aqui" # Respuesta: { "total": 87, "page": 1, "limit": 20, "jobs": [ { "id": 42, "url": "https://www.mercadolibre.cl/laptops", "category": "ecommerce", "pages_scraped": 3, "total_items": 48, "cost": 0.0142, "status": "done", "created_at": "2025-06-10T14:32:00" } ] }
GET /api/jobs/{id}
Obtiene los datos completos de una extracción específica. Los datos se almacenan comprimidos en el servidor durante el ciclo de vida de tu cuenta.
# Obtener datos del job 42 curl https://tu-dominio/api/jobs/42 \ -H "X-API-Key: sk-tu-clave-aqui" # Respuesta: { "data": [ {"titulo": "MacBook Pro 14\"", "precio": "$1.299.990", ...}, ... ], "metadata": { "job_id": 42, "url": "https://www.mercadolibre.cl/laptops", "total_items": 48, "pages_scraped": 3, "cost": 0.0142, "created_at": "2025-06-10T14:32:00" } }
Script de descarga automática en Python
import requests, json
API_KEY = "sk-tu-clave-aqui"
BASE_URL = "https://tu-dominio"
headers = {"X-API-Key": API_KEY}
# 1. Listar todos los jobs
jobs_resp = requests.get(f"{BASE_URL}/api/jobs?limit=100", headers=headers)
jobs = jobs_resp.json()["jobs"]
# 2. Descargar datos de cada job
for job in jobs:
data_resp = requests.get(f"{BASE_URL}/api/jobs/{job['id']}", headers=headers)
data = data_resp.json()["data"]
filename = f"job_{job['id']}.json"
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"✅ {filename} — {len(data)} items")
Errores
Todos los errores siguen el formato estándar de FastAPI:
{
"detail": "Descripción del error"
}
| Código | Causa | Solución |
|---|---|---|
| 400 | URL inválida o parámetros incorrectos | Verifica que la URL incluya https:// |
| 401 | Sin credenciales o token expirado | Incluye el header X-API-Key o renueva el token JWT |
| 403 | Plan insuficiente para usar la API | Actualiza a plan Pro o Enterprise |
| 404 | Job no encontrado o sin datos | Verifica que el ID existe y pertenece a tu cuenta |
| 429 | Límite mensual de extracciones alcanzado | Espera al próximo mes o actualiza tu plan |
| 500 | Error interno durante el scraping | El sitio puede estar caído o bloqueado. Intenta con otra URL. |
Acceso a la API por plan
| Plan | API Key | max_pages vía API | Cuota compartida |
|---|---|---|---|
| Gratuito | No | — | — |
| Básico | No | — | — |
| Pro | Sí | Hasta 10 | Sí — misma cuota de 300/mes |
| Enterprise | Sí | Hasta 20 | Ilimitadas |
Las extracciones vía API descuentan del mismo cupo mensual que el extractor web.