[ HRVST ]
// referencia

API Reference

La API de Hrvst te permite enviar trabajos de scraping, consultar su estado y descargar resultados de forma programática. Todos los endpoints devuelven JSON. Base URL: https://hrvst.donostia.ai

Quick Start

Extrae datos en 4 pasos:

01 Crea una API key en tu cuenta

Ve a /api-keys y genera una nueva clave. Tendrá el formato hv_ + 64 caracteres hex.

02 Envía un trabajo de scraping
curl -X POST https://hrvst.donostia.ai/api/jobs \
  -H "Authorization: Bearer hv_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "scraperSlug": "search",
    "name": "Cafes Barcelona",
    "params": {
      "query": "cafes in Barcelona",
      "limit": 20
    }
  }'
03 Espera a que termine (polling)

Consulta el estado cada pocos segundos hasta que status sea COMPLETED, FAILED o CANCELLED.

# Repeat until status != PENDING and != PROCESSING
curl https://hrvst.donostia.ai/api/jobs/JOB_ID \
  -H "Authorization: Bearer hv_your_api_key"
04 Descarga los resultados

Los resultados están en el campo results del objeto job. También puedes descargarlos como CSV o JSON:

# CSV
curl "https://hrvst.donostia.ai/jobs/JOB_ID/export?format=csv" \
  -H "Authorization: Bearer hv_your_api_key" -o results.csv

# JSON
curl "https://hrvst.donostia.ai/jobs/JOB_ID/export?format=json" \
  -H "Authorization: Bearer hv_your_api_key" -o results.json

Authentication

Todos los endpoints requieren una API key válida. Genera una desde tu cuenta.

Envía la clave en el header Authorization:

Authorization: Bearer hv_your_api_key_here

Las API keys tienen el formato hv_ + 64 caracteres hex. Requieren verificación de email para funcionar.

⚠ Las API keys dan acceso completo a tu cuenta. No las compartas ni las incluyas en código público.

Créditos

Hrvst es de pago por uso. Compras créditos y los gastas en trabajos. Los créditos no caducan.

ActionCostBillingAsync
search1 crper resultno
scrape1 crflatno
crawl1 crper pageyes
map1 crflatno
extract3 crper URLyes
agentdynamical desbloquearyes

You can also use template slugs (e.g. google-maps, amazon-products) which map to these actions with pre-configured params. See Templates.

Las cuentas nuevas reciben 100 créditos gratis. Los primeros 2 desbloqueos de hrvst-agent son siempre gratuitos.

Los créditos se descuentan cuando el trabajo completa, no al crearlo. Los trabajos fallidos no consumen créditos.

Errores

Todos los errores tienen el mismo formato:

{ "error": "error description" }
StatusSignificado
400Bad request — campo faltante o inválido
401Unauthorized — API key faltante o inválida
402Payment required — créditos insuficientes
404Not found — el trabajo no existe o pertenece a otro usuario
500Server error — inténtalo de nuevo

Rate Limits

Los límites se aplican por usuario autenticado (sesión o API key).

LímiteDescripción
50 trabajos / horaMáximo 50 trabajos creados por usuario en los últimos 60 minutos. Los trabajos cancelados no cuentan.
10 logins / minLímite de intentos de inicio de sesión por IP para prevenir ataques de fuerza bruta.

Cuando se supera el límite de trabajos la API devuelve 429 Too Many Requests con el mensaje "Job limit exceeded. Maximum 50 jobs per hour."

POST/api/jobs

Crea y encola un nuevo trabajo de scraping. Responde inmediatamente — consulta el ID del trabajo para ver el progreso.

Campos del body

CampoTipoDescripción
scraperSlugstringRequerido. Uno de los slugs de scrapers listados abajo.
namestringRequerido. Etiqueta para este trabajo (visible en el dashboard).
paramsobjectRequerido. Parámetros específicos del scraper — ver referencia abajo.

Respuesta — 201 Created

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "userId": "user-id",
  "scraperSlug": "search",
  "status": "PENDING",
  "params": { "query": "cafes in Barcelona", "limit": 20 },
  "results": null,
  "creditsUsed": 0,
  "error": null,
  "createdAt": "2026-03-14T10:30:45Z",
  "updatedAt": "2026-03-14T10:30:45Z",
  "completedAt": null,
  "unlockCost": 0,
  "unlockedAt": null,
  "freeUnlock": false
}

GET/api/jobs

Lista todos los trabajos del usuario autenticado, del más reciente al más antiguo.

Query params

ParamDefaultDescripción
page1Número de página (base 1).
limit20Resultados por página. Máximo 100.
{
  "jobs": [ ...job objects... ],
  "total": 42,
  "page": 1,
  "limit": 20,
  "total_returned": 20
}

GET/api/jobs/:id

Recupera un trabajo concreto. Usa este endpoint para hacer polling hasta que finalice.

curl https://hrvst.donostia.ai/api/jobs/550e8400-... \
  -H "Authorization: Bearer hv_your_api_key"

Transición de estado: PENDING → PROCESSING → COMPLETED | FAILED | CANCELLED

Para hrvst-agent: el campo resultsPreview contiene 5 registros enmascarados. Llama a POST /api/jobs/:id/unlock para obtener resultsFull.

DELETE/api/jobs/:id

Cancela y elimina un trabajo. Los trabajos en curso se marcan como cancelados antes de eliminarse.

{ "status": "deleted" }

GET/jobs/:id/export

Descarga los resultados de un trabajo completado como CSV o JSON. Solo funciona con trabajos en estado COMPLETED.

Query params

ParamValoresDescripción
formatcsv · jsonFormato de descarga. Default: json
# Download as CSV
curl "https://hrvst.donostia.ai/jobs/JOB_ID/export?format=csv" \
  -H "Authorization: Bearer hv_your_api_key" \
  -o results.csv

# Download as JSON
curl "https://hrvst.donostia.ai/jobs/JOB_ID/export?format=json" \
  -H "Authorization: Bearer hv_your_api_key" \
  -o results.json

POST/api/jobs/:id/unlock

Desbloquea los resultados completos de un trabajo hrvst-agent. Los primeros 2 desbloqueos por cuenta son gratuitos. Solo funciona con trabajos COMPLETED.

curl -X POST https://hrvst.donostia.ai/api/jobs/JOB_ID/unlock \
  -H "Authorization: Bearer hv_your_api_key"

# Response
{ "resultsFullURL": "/jobs/JOB_ID/export?format=json" }

Después de desbloquear, el campo resultsFull en GET /api/jobs/:id contiene los datos completos sin enmascarar.

GET/api/scrapers

Devuelve todos los scrapers disponibles con sus slugs, créditos y campos de salida.

curl https://hrvst.donostia.ai/api/scrapers \
  -H "Authorization: Bearer hv_your_api_key"

GET/api/user/me

Devuelve el perfil y saldo de créditos del usuario autenticado.

{
  "id": "user-id",
  "email": "you@email.com",
  "name": "Your Name",
  "credits": 500,
  "freeSearchesUsed": 1
}

Actions

Each action maps to a specific data extraction method. Use the action slug as scraperSlug when creating jobs.

scrape 1 cr / flat

Scrape a single URL with optional AI-powered extraction. Supports custom prompts and JSON schemas for structured output.

Params

CampoRequeridoDescripción
urlURL to scrape
promptnoNatural language instruction for AI extraction
schemanoJSON Schema for structured output
formatsnoOutput formats array (default: ["json"])
crawl 1 cr / page async

Crawl an entire website. Follows internal links and extracts content from every page. Returns markdown, metadata, and URLs.

Params

CampoRequeridoDescripción
urlStarting URL to crawl
limitnoMax pages to crawl (default 100)
maxDepthnoMax link depth from starting URL (default 3)
allowExternalLinksnoFollow links to other domains (default false)
excludePathsnoURL paths to skip (comma-separated)
includePathsnoOnly crawl these paths (comma-separated)

Output

url, markdown, metadata (per page)

map 1 cr / flat

Discover all URLs on a website. Returns a sitemap-like list of links found on the domain.

Params

CampoRequeridoDescripción
urlWebsite URL to map
searchnoFilter URLs containing this substring

Output

url (per discovered link)

extract 3 cr / URL async

Extract structured data from one or more URLs using AI-powered schemas. Supports validation and web search enrichment.

Params

CampoRequeridoDescripción
urlsURLs to extract from (newline-separated string or array)
promptnoNatural language instruction for extraction
schemanoJSON Schema for structured output
validatenoEnable schema validation (default false)
enableWebSearchnoEnrich extraction with web search (default false)
agent coste variable al desbloquear async

Agente IA que acepta un prompt en lenguaje natural y determina qué extraer y cómo. Los resultados están enmascarados hasta desbloquear. Los primeros 2 desbloqueos son gratuitos.

CampoRequeridoDescripción
promptDescripción en lenguaje natural de lo que quieres extraer
modelnoModelo IA: spark-1-mini (default) · spark-1-pro
maxCreditsnoLímite máximo de créditos a consumir. Default: saldo disponible

Ejemplo completo con hrvst-agent

# 1. Create agent job
curl -X POST https://hrvst.donostia.ai/api/jobs \
  -H "Authorization: Bearer hv_..." \
  -H "Content-Type: application/json" \
  -d '{"scraperSlug":"agent","name":"Hotels Berlin","params":{"prompt":"Top 30 hotels in Berlin with price, email and website"}}'

# 2. Wait for completion (polling)
curl https://hrvst.donostia.ai/api/jobs/JOB_ID \
  -H "Authorization: Bearer hv_..."
# → "status": "COMPLETED", "resultsPreview": [5 masked records]

# 3. Unlock full results
curl -X POST https://hrvst.donostia.ai/api/jobs/JOB_ID/unlock \
  -H "Authorization: Bearer hv_..."

# 4. Download results
curl "https://hrvst.donostia.ai/jobs/JOB_ID/export?format=csv" \
  -H "Authorization: Bearer hv_..." -o hotels_berlin.csv

Templates

Templates are pre-configured actions with default prompts, schemas, and parameters. Use a template slug as scraperSlug for common use cases without configuring params manually.

TemplateActionDescription
google-mapsscrapeExtract Google Maps business listings with contact info, ratings, hours
google-searchsearchScrape Google Search results with titles, URLs, descriptions
google-maps-reviewsscrapeExtract customer reviews from Google Maps businesses
amazon-productssearchScrape Amazon product listings with prices, ratings, sellers
amazon-reviewsscrapeExtract Amazon product reviews with ratings and verified status
emails-contactscrawlExtract emails, phones, and social profiles from any website

Template slugs resolve to their underlying action with pre-filled defaults. Any additional params you send override the template defaults.

# Using a template - same as using the "search" action with preconfigured params
curl -X POST https://hrvst.donostia.ai/api/jobs \
  -H "Authorization: Bearer hv_..." \
  -H "Content-Type: application/json" \
  -d '{"scraperSlug": "amazon-products", "name": "Headphones", "params": {"query": "wireless headphones"}}'
// listo para empezar

500 créditos gratis cada mes. Sin tarjeta de crédito.

crear cuenta gratis →