# Raspado en lote

> Raspar múltiples URL en un solo trabajo por lotes

import BatchScrapePython from '/snippets/es/v2/batch-scrape/base/python.mdx';
import BatchScrapeNode from '/snippets/es/v2/batch-scrape/base/js.mdx';
import BatchScrapeCURL from '/snippets/es/v2/batch-scrape/base/curl.mdx';
import BatchScrapeOutput from '/snippets/es/v2/batch-scrape/base/output.mdx';
import BatchScrapeAsyncOutput from '/snippets/es/v2/batch-scrape/base/async-output.mdx';
import BatchScrapeExtractPython from '/snippets/es/v2/batch-scrape/json/python.mdx';
import BatchScrapeExtractNode from '/snippets/es/v2/batch-scrape/json/js.mdx';
import BatchScrapeExtractCURL from '/snippets/es/v2/batch-scrape/json/curl.mdx';
import BatchScrapeExtractOutput from '/snippets/es/v2/batch-scrape/json/output.mdx';
import BatchScrapeExtractAsyncOutput from '/snippets/es/v2/batch-scrape/json/async-output.mdx';
import BatchScrapeWebhookCURL from '/snippets/es/v1/batch-scrape-webhook/base/curl.mdx';

El raspado en lote permite raspar múltiples URL en un solo trabajo. Pasa una lista de URL y parámetros opcionales, y Firecrawl las procesa de forma concurrente y devuelve todos los resultados de una sola vez.

* Funciona como `/crawl` pero para una lista explícita de URL
* Modos síncrono y asíncrono
* Compatible con todas las opciones de raspado, incluida la extracción estructurada
* Concurrencia configurable por trabajo

<div id="operations">
  ## Operaciones
</div>

| Tarea                                | Referencia de la API                                                         | Vocabulario del SDK                                                       |
| ------------------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| Iniciar un lote                      | [`batch-scrape`](/es/api-reference/endpoint/batch-scrape)                       | `batchScrape` / `batch_scrape`, `startBatchScrape` / `start_batch_scrape` |
| Consultar el estado y los resultados | [`batch-scrape-get`](/es/api-reference/endpoint/batch-scrape-get)               | `getBatchScrapeStatus` / `get_batch_scrape_status`                        |
| Cancelar un lote en ejecución        | [`batch-scrape-delete`](/es/api-reference/endpoint/batch-scrape-delete)         | Cancelar o eliminar el trabajo del lote por ID                            |
| Revisar errores                      | [`batch-scrape-get-errors`](/es/api-reference/endpoint/batch-scrape-get-errors) | Helper de error/estado para URL fallidas                                  |

<div id="how-it-works">
  ## Cómo funciona
</div>

Puedes ejecutar un scrape por lotes de dos maneras:

| Modo      | Método del SDK (JS / Python)              | Comportamiento                                                           |
| --------- | ----------------------------------------- | ------------------------------------------------------------------------ |
| Síncrono  | `batchScrape` / `batch_scrape`            | Inicia el lote y espera a que finalice, devolviendo todos los resultados |
| Asíncrono | `startBatchScrape` / `start_batch_scrape` | Inicia el lote y devuelve un ID de trabajo para polling o webhooks       |

<div id="basic-usage">
  ## Uso básico
</div>

<CodeGroup>
  <BatchScrapePython />

  <BatchScrapeNode />

  <BatchScrapeCURL />
</CodeGroup>

<div id="response">
  ### Respuesta
</div>

Invocar `batchScrape` / `batch_scrape` devuelve los resultados completos cuando el lote finaliza.

<BatchScrapeOutput />

Invocar `startBatchScrape` / `start_batch_scrape` devuelve un ID de tarea que puedes monitorear mediante `getBatchScrapeStatus` / `get_batch_scrape_status`, el endpoint de la API `/batch/scrape/{id}` o webhooks. Los resultados de la tarea están disponibles a través de la API durante 24 horas después de su finalización. Después de este período, aún puedes ver el historial y los resultados de tus ejecuciones de batch scrape en los [activity logs](https://www.firecrawl.dev/app/logs).

<BatchScrapeAsyncOutput />

<div id="concurrency">
  ## Concurrencia
</div>

De forma predeterminada, un trabajo de extracción por lotes usa todo el límite de navegadores concurrentes de tu equipo (consulta [Rate Limits](/es/rate-limits)). Puedes reducir este valor por trabajo con el parámetro `maxConcurrency`.

Por ejemplo, `maxConcurrency: 50` limita ese trabajo a 50 extracciones simultáneas. Establecer este valor demasiado bajo en lotes grandes ralentizará significativamente el procesamiento, así que solo redúcelo si necesitas dejar capacidad para otros trabajos concurrentes.

<div id="structured-extraction">
  ## Extracción estructurada
</div>

Puedes usar el raspado por lotes para extraer datos estructurados de cada página del lote. Esto es útil si quieres aplicar el mismo esquema a una lista de URL.

<CodeGroup>
  <BatchScrapeExtractPython />

  <BatchScrapeExtractNode />

  <BatchScrapeExtractCURL />
</CodeGroup>

<div id="response-2">
  ### Respuesta
</div>

`batchScrape` / `batch_scrape` devuelve resultados completos:

<BatchScrapeExtractOutput />

`startBatchScrape` / `start_batch_scrape` devuelve un ID de tarea:

<BatchScrapeExtractAsyncOutput />

<div id="webhooks">
  ## Webhooks
</div>

Puedes configurar webhooks para recibir notificaciones en tiempo real a medida que se rastrea cada URL de tu lote. Esto te permite procesar los resultados de inmediato en lugar de esperar a que finalice todo el lote.

<BatchScrapeWebhookCURL />

<div id="event-types">
  ### Tipos de eventos
</div>

| Evento                   | Descripción                                        |
| ------------------------ | -------------------------------------------------- |
| `batch_scrape.started`   | El proceso de scraping por lotes ha comenzado      |
| `batch_scrape.page`      | Se ha hecho scraping correctamente de una sola URL |
| `batch_scrape.completed` | Se han procesado todas las URL                     |
| `batch_scrape.failed`    | Se produjo un error durante el scraping por lotes  |

<div id="payload">
  ### Carga útil
</div>

Cada entrega de webhook incluye un cuerpo JSON con la siguiente estructura:

```json
{
  "success": true,
  "type": "batch_scrape.page",
  "id": "batch-job-id",
  "data": [...],
  "metadata": {},
  "error": null
}
```

<div id="verifying-webhook-signatures">
  ### Verificación de firmas de webhooks
</div>

Cada solicitud de webhook de Firecrawl incluye un encabezado `X-Firecrawl-Signature` que contiene una firma HMAC-SHA256. Verifica siempre esta firma para asegurarte de que el webhook sea auténtico y no haya sido manipulado.

1. Obtén tu secreto de webhook en la [pestaña Advanced](https://www.firecrawl.dev/app/settings?tab=advanced) de la configuración de tu cuenta
2. Extrae la firma del encabezado `X-Firecrawl-Signature`
3. Calcula el HMAC-SHA256 del cuerpo sin procesar de la solicitud usando tu secreto
4. Compáralo con el encabezado de firma utilizando una función segura frente a ataques de temporización

<Warning>
  Nunca proceses un webhook sin verificar primero su firma. El encabezado `X-Firecrawl-Signature` contiene la firma en el formato: `sha256=abc123def456...`
</Warning>

Para ejemplos completos de implementación en JavaScript y Python, consulta la [documentación de seguridad de webhooks](/es/webhooks/security).

Para obtener una documentación completa sobre webhooks, incluidas cargas útiles de eventos detalladas, configuración avanzada y solución de problemas, consulta la [documentación de webhooks](/es/webhooks/overview).

> ¿Eres un agente de IA que necesita una clave de API de Firecrawl? Consulta [firecrawl.dev/agent-onboarding/SKILL.md](https://www.firecrawl.dev/agent-onboarding/SKILL.md) para obtener instrucciones de incorporación automatizada.
