> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# scraping

> Convierte cualquier URL en datos limpios

Firecrawl convierte páginas web en markdown, ideal para aplicaciones con LLM.

* Gestiona la complejidad: proxies, caching, límites de tasa y contenido bloqueado por JS
* Maneja contenido dinámico: sitios web dinámicos, sitios renderizados con JS, PDF e imágenes
* Genera markdown limpio, datos estructurados, capturas de pantalla o html.

Para más detalles, consulta la [referencia de la API del endpoint scraping](https://docs.firecrawl.dev/api-reference/endpoint/scrape).

<Card title="Pruébalo en el Playground" icon="play" href="https://www.firecrawl.dev/playground?endpoint=scrape">
  Prueba el scraping en el playground interactivo, sin necesidad de escribir código.
</Card>

<Note>Si una solicitud falla, consulta [Errores](/es/api-reference/errors) para ver el catálogo completo de códigos de error, causas, soluciones y recomendaciones sobre reintentos.</Note>

<div id="scraping-a-url-with-firecrawl">
  ## Extraer datos de una URL con Firecrawl
</div>

<div id="scrape-endpoint">
  ### punto de conexión /scrape
</div>

Se utiliza para extraer el contenido de una URL.

<div id="installation">
  ### Instalación
</div>

<CodeGroup>
  ```python Python theme={null}
  # pip install firecrawl-py

  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )
  ```

  ```js Node theme={null}
  // npm install firecrawl

  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });
  ```

  ```bash CLI theme={null}
  # Instalar globalmente con npm
  npm install -g firecrawl

  # Autenticar (configuración de una sola vez)
  firecrawl login
  ```
</CodeGroup>

### Uso

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — añade una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  # Extraer datos de un sitio web:
  doc = firecrawl.scrape("https://firecrawl.dev", formats=["markdown", "html"])
  print(doc)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  // Extraer un sitio web:
  const doc = await firecrawl.scrape('https://firecrawl.dev', { formats: ['markdown', 'html'] });
  console.log(doc);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formats": ["markdown", "html"]
    }'
  ```

  ```bash CLI theme={null}
  # Scrape a URL and get markdown
  firecrawl https://firecrawl.dev

  # Con múltiples formatos (devuelve JSON)
  firecrawl https://firecrawl.dev --format markdown,html,links --pretty
  ```
</CodeGroup>

Para más información sobre los parámetros, consulta la [Referencia de la API](https://docs.firecrawl.dev/api-reference/endpoint/scrape).

<Tip>
  **PDF y documentos:** `/scrape` detecta automáticamente archivos PDF, DOCX y otros tipos de documentos a partir de las URL. Pasa la URL de un PDF igual que harías con cualquier página web -- Firecrawl lo procesa y devuelve markdown limpio. Para archivos locales a los que no se puede acceder mediante una URL, usa [`/parse`](/es/features/parse) en su lugar.

  ```python Python theme={null}
  doc = firecrawl.scrape("https://example.com/report.pdf", formats=["markdown"])
  print(doc.markdown)
  ```
</Tip>

<Info>
  Cada scrape consume 1 crédito. Se aplican créditos adicionales para ciertas opciones: el modo JSON cuesta 4 créditos adicionales por página, los formatos de question y highlights cuestan 4 créditos adicionales por página por formato, el proxy mejorado cuesta 4 créditos adicionales por página, la redacción de PII cuesta 4 créditos adicionales por página, el procesamiento de PDF cuesta 1 crédito por página de PDF y la extracción de audio o video cuesta 4 créditos adicionales por página.
</Info>

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

Los SDK devolverán el objeto de datos directamente. cURL devolverá el payload exactamente como se muestra a continuación.

```json theme={null}
{
  "success": true,
  "data" : {
    "markdown": "¡Launch Week I ya está aquí! [Consulta nuestro lanzamiento del Día 2 🚀](https://www.firecrawl.dev/blog/launch-week-i-day-2-doubled-rate-limits)[💥 Obtén 2 meses gratis...",
    "html": "<!DOCTYPE html><html lang=\"en\" class=\"light\" style=\"color-scheme: light;\"><body class=\"__variable_36bd41 __variable_d7dc5d font-inter ...",
    "metadata": {
      "title": "Inicio - Firecrawl",
      "description": "Firecrawl rastrea y convierte cualquier sitio web en Markdown limpio.",
      "language": "en",
      "keywords": "Firecrawl,Markdown,Data,Mendable,Langchain",
      "robots": "seguir, indexar",
      "ogTitle": "Firecrawl",
      "ogDescription": "Convierte cualquier sitio web en datos listos para LLM.",
      "ogUrl": "https://www.firecrawl.dev/",
      "ogImage": "https://www.firecrawl.dev/og.png?123",
      "ogLocaleAlternate": [],
      "ogSiteName": "Firecrawl",
      "sourceURL": "https://firecrawl.dev",
      "statusCode": 200,
      "contentType": "text/html"
    }
  }
}
```

<div id="scrape-formats">
  ## Formatos de scraping
</div>

Ahora puedes elegir en qué formatos quieres el resultado. Puedes especificar múltiples formatos de salida. Los formatos compatibles son:

* Markdown (`markdown`)
* Resumen (`summary`)
* HTML (`html`) - versión limpia del HTML de la página
* HTML sin procesar (`rawHtml`) - HTML sin modificar tal como se recibe de la página
* Captura de pantalla (`screenshot`, con opciones como `fullPage`, `quality`, `viewport`) — las URL de las capturas de pantalla caducan después de 24 horas
* Enlaces (`links`)
* JSON (`json`) - salida estructurada
* Imágenes (`images`) - extrae todas las URL de imágenes de la página
* Branding (`branding`) - extrae la identidad de marca y el sistema de diseño
* Producto (`product`) - extrae un producto estructurado (título, precio, disponibilidad y variantes) de las páginas de producto
* Audio (`audio`) - extrae audio MP3 de URL de vídeo compatibles, p. ej., YouTube (devuelve una URL firmada de GCS, caduca después de 1 hora)
* Vídeo (`video`) - extrae vídeo de la mejor calidad de URL de vídeo compatibles, p. ej., YouTube (devuelve una URL firmada de GCS, caduca después de 1 hora)
* Query (`query`, con `prompt` y `mode` opcional) - haz una pregunta en lenguaje natural sobre la página; la respuesta se devuelve en el campo `answer`

Las claves de salida coincidirán con el formato que elijas.

<div id="extract-structured-data">
  ## Extrae datos estructurados
</div>

<div id="scrape-with-json-endpoint">
  ### punto de conexión /scrape (con json)
</div>

Se usa para extraer datos estructurados de páginas rastreadas.

<Tip>
  ¿Vas a extraer productos? En las páginas de producto, el `format` [`product`](#extract-product-data) devuelve campos de producto estructurados (título, precio, disponibilidad y variantes) de forma determinista, sin llamada al LLM ni `schema` que definir. Usa `json` cuando necesites campos personalizados o páginas que no sean de producto.
</Tip>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl
  from pydantic import BaseModel

  app = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  class CompanyInfo(BaseModel):
      company_mission: str
      supports_sso: bool
      is_open_source: bool
      is_in_yc: bool

  result = app.scrape(
      'https://firecrawl.dev',
      formats=[{
        "type": "json",
        "schema": CompanyInfo.model_json_schema()
      }],
      only_main_content=False,
      timeout=120000
  )

  print(result)
  ```

  ```js Node theme={null}
  import { Firecrawl } from "firecrawl";
  import { z } from "zod";

  const app = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    // apiKey: "fc-YOUR_API_KEY",
  });

  // Definir esquema para extraer el contenido
  const schema = z.object({
    company_mission: z.string(),
    supports_sso: z.boolean(),
    is_open_source: z.boolean(),
    is_in_yc: z.boolean()
  });

  const result = await app.scrape("https://firecrawl.dev", {
    formats: [{
      type: "json",
      schema: schema
    }],
  });

  console.log(result);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — añade -H "Authorization: Bearer YOUR_API_KEY" para límites de tasa más altos:
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -d '{
        "url": "https://firecrawl.dev",
        "formats": [ {
          "type": "json",
          "schema": {
            "type": "object",
            "properties": {
              "company_mission": {
                        "type": "string"
              },
              "supports_sso": {
                        "type": "boolean"
              },
              "is_open_source": {
                        "type": "boolean"
              },
              "is_in_yc": {
                        "type": "boolean"
              }
            },
            "required": [
              "company_mission",
              "supports_sso",
              "is_open_source",
              "is_in_yc"
            ]
          }
        } ]
      }'
  ```
</CodeGroup>

Salida:

```json JSON theme={null}
{
    "success": true,
    "data": {
      "json": {
        "company_mission": "Rastreo y extracción de datos web con IA",
        "supports_sso": true,
        "is_open_source": true,
        "is_in_yc": true
      },
      "metadata": {
        "title": "Firecrawl",
        "description": "Rastreo y extracción de datos web con IA",
        "robots": "seguir, indexar",
        "ogTitle": "Firecrawl",
        "ogDescription": "Rastreo y extracción de datos web con IA",
        "ogUrl": "https://firecrawl.dev/",
        "ogImage": "https://firecrawl.dev/og.png",
        "ogLocaleAlternate": [],
        "ogSiteName": "Firecrawl"
        "sourceURL": "https://firecrawl.dev/"
      },
    }
}
```

<div id="extracting-without-schema">
  ### Extracción sin esquema
</div>

Ahora puedes extraer sin un esquema con solo pasar un `prompt` al punto de conexión. El LLM elige la estructura de los datos.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  app = Firecrawl(
    # No se necesita API key para comenzar — añade una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  result = app.scrape(
      'https://firecrawl.dev',
      formats=[{
        "type": "json",
        "prompt": "Extract the company mission from the page."
      }],
      only_main_content=False,
      timeout=120000
  )

  print(result)
  ```

  ```js Node theme={null}
  import { Firecrawl } from "firecrawl";

  const app = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR_API_KEY",
  });

  const result = await app.scrape("https://firecrawl.dev", {
    formats: [{
      type: "json",
      prompt: "Extract the company mission from the page."
    }]
  });

  console.log(result);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — añade -H "Authorization: Bearer YOUR_API_KEY" para límites de tasa más altos:
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -d '{
        "url": "https://firecrawl.dev",
        "formats": [{
          "type": "json",
          "prompt": "Extract the company mission from the page."
        }]
      }'
  ```
</CodeGroup>

Salida:

```json JSON theme={null}
{
    "success": true,
    "data": {
      "json": {
        "company_mission": "Rastreo web y extracción de datos impulsados por IA",
      },
      "metadata": {
        "title": "Firecrawl",
        "description": "Rastreo web y extracción de datos impulsados por IA",
        "robots": "seguir, indexar",
        "ogTitle": "Firecrawl",
        "ogDescription": "Rastreo web y extracción de datos impulsados por IA",
        "ogUrl": "https://firecrawl.dev/",
        "ogImage": "https://firecrawl.dev/og.png",
        "ogLocaleAlternate": [],
        "ogSiteName": "Firecrawl",
        "sourceURL": "https://firecrawl.dev/"
      },
    }
}
```

<div id="json-format-options">
  ### Opciones del formato JSON
</div>

Al usar el formato `json`, pasa un objeto dentro de `formats` con los siguientes parámetros:

* `schema`: JSON Schema para la salida estructurada.
* `prompt`: Prompt opcional para ayudar a guiar la extracción cuando hay un esquema o cuando prefieras una guía ligera.

<div id="extract-brand-identity">
  ## Extraer la identidad de la marca
</div>

<div id="scrape-with-branding-endpoint">
  ### endpoint /scrape (con branding)
</div>

El formato de branding extrae información completa sobre la identidad de marca de una página web, incluidos colores, fuentes, tipografía, espaciado, componentes de la UI y más. Es útil para analizar sistemas de diseño, monitorear marcas o crear herramientas que necesiten comprender la identidad visual de un sitio web.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key='fc-YOUR_API_KEY',
  )

  result = firecrawl.scrape(
      url='https://firecrawl.dev',
      formats=['branding']
  )

  print(result['branding'])
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const result = await firecrawl.scrape('https://firecrawl.dev', {
      formats: ['branding']
  });

  console.log(result.branding);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formats": ["branding"]
    }'
  ```
</CodeGroup>

### Respuesta

El formato de marca devuelve un objeto `BrandingProfile` completo con la siguiente estructura:

```json Output theme={null}
{
  "success": true,
  "data": {
    "branding": {
      "colorScheme": "dark",
      "logo": "https://firecrawl.dev/logo.svg",
      "colors": {
        "primary": "#FF6B35",
        "secondary": "#004E89",
        "accent": "#F77F00",
        "background": "#1A1A1A",
        "textPrimary": "#FFFFFF",
        "textSecondary": "#B0B0B0"
      },
      "fonts": [
        {
          "family": "Inter"
        },
        {
          "family": "Roboto Mono"
        }
      ],
      "typography": {
        "fontFamilies": {
          "primary": "Inter",
          "heading": "Inter",
          "code": "Roboto Mono"
        },
        "fontSizes": {
          "h1": "48px",
          "h2": "36px",
          "h3": "24px",
          "body": "16px"
        },
        "fontWeights": {
          "regular": 400,
          "medium": 500,
          "bold": 700
        }
      },
      "spacing": {
        "baseUnit": 8,
        "borderRadius": "8px"
      },
      "components": {
        "buttonPrimary": {
          "background": "#FF6B35",
          "textColor": "#FFFFFF",
          "borderRadius": "8px"
        },
        "buttonSecondary": {
          "background": "transparent",
          "textColor": "#FF6B35",
          "borderColor": "#FF6B35",
          "borderRadius": "8px"
        }
      },
      "images": {
        "logo": "https://firecrawl.dev/logo.svg",
        "favicon": "https://firecrawl.dev/favicon.ico",
        "ogImage": "https://firecrawl.dev/og-image.png"
      }
    }
  }
}
```

<div id="branding-profile-structure">
  ### Estructura del perfil de marca
</div>

El objeto `branding` contiene las siguientes propiedades:

* `colorScheme`: El esquema de color detectado ("light" o "dark")
* `logo`: URL del logotipo principal
* `colors`: Objeto que contiene los colores de la marca:
  * `primary`, `secondary`, `accent`: Colores principales de la marca
  * `background`, `textPrimary`, `textSecondary`: Colores de la interfaz
  * `link`, `success`, `warning`, `error`: Colores semánticos
* `fonts`: Lista de familias tipográficas usadas en la página
* `typography`: Información tipográfica detallada:
  * `fontFamilies`: Familias tipográficas principal, de encabezados y de código
  * `fontSizes`: Definiciones de tamaños para encabezados y cuerpo de texto
  * `fontWeights`: Definiciones de grosor (light, regular, medium, bold)
  * `lineHeights`: Valores de interlineado para distintos tipos de texto
* `spacing`: Información de espaciado y maquetación:
  * `baseUnit`: Unidad base de espaciado en píxeles
  * `borderRadius`: Radio de borde predeterminado
  * `padding`, `margins`: Valores de espaciado
* `components`: Estilos de componentes de la interfaz:
  * `buttonPrimary`, `buttonSecondary`: Estilos de botones
  * `input`: Estilos de campos de entrada
* `icons`: Información sobre el estilo de los íconos
* `images`: Imágenes de marca (logo, favicon, og:image)
* `animations`: Configuración de animaciones y transiciones
* `layout`: Configuración de distribución (grid, alturas de encabezado/pie)
* `personality`: Rasgos de personalidad de la marca (tono, energía, público objetivo)

<div id="combining-with-other-formats">
  ### Combinar con otros formatos
</div>

Puedes combinar el formato de branding con otros formatos para obtener datos completos de la página:

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key='fc-YOUR_API_KEY',
  )

  result = firecrawl.scrape(
      url='https://firecrawl.dev',
      formats=['markdown', 'branding', 'screenshot']
  )

  print(result['markdown'])
  print(result['branding'])
  print(result['screenshot'])
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    // apiKey: "fc-TU-CLAVE-API",
  });

  const result = await firecrawl.scrape('https://firecrawl.dev', {
      formats: ['markdown', 'branding', 'screenshot']
  });

  console.log(result.markdown);
  console.log(result.branding);
  console.log(result.screenshot);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formats": ["markdown", "branding", "screenshot"]
    }'
  ```
</CodeGroup>

<div id="extract-product-data">
  ## Extraer datos de productos
</div>

El formato `product` extrae un producto estructurado **de forma determinista**: el mismo tipo de salida estructurada que el [formato `json`](#extract-structured-data), pero sin una llamada a un LLM ni un esquema definido por ti, y diseñado específicamente para páginas de producto. Si has estado extrayendo campos de producto con un esquema `json`, usa `formats: ["product"]` en su lugar: es más rápido y más barato, aunque se limita a productos.

Devuelve un objeto `product` con título, marca, categoría, descripción y variantes, donde cada variante incluye precio, precio original, disponibilidad e imágenes; útil para el seguimiento de precios, la ingesta de catálogos o las herramientas de comparación de precios.

<div id="scrape-with-product-endpoint">
  ### punto de conexión /scrape (con producto)
</div>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para empezar — agrega una para obtener límites de tasa más altos:
    # api_key='fc-YOUR_API_KEY',
  )

  result = firecrawl.scrape(
      url='https://example.com/products/wireless-headphones',
      formats=['product']
  )

  print(result['product'])
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para empezar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const result = await firecrawl.scrape('https://example.com/products/wireless-headphones', {
      formats: ['product']
  });

  console.log(result.product);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — añade -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com/products/wireless-headphones",
      "formats": ["product"]
    }'
  ```
</CodeGroup>

### Respuesta

El formato `product` devuelve un objeto `product` con la siguiente estructura:

```json Output theme={null}
{
  "success": true,
  "data": {
    "product": {
      "title": "Wireless Noise-Cancelling Headphones",
      "brand": "Acme",
      "category": "Electronics > Audio > Headphones",
      "url": "https://example.com/products/wireless-headphones",
      "description": "Over-ear wireless headphones with active noise cancellation, 30-hour battery life, and plush memory-foam ear cushions for all-day comfort.",
      "variants": [
        {
          "id": "wireless-headphones-black",
          "sku": "ACME-WH-BLACK",
          "title": "Wireless Noise-Cancelling Headphones — Black",
          "values": {
            "color": "Black"
          },
          "price": {
            "amount": 199.99,
            "currency": "USD",
            "formatted": "$199.99"
          },
          "sale": {
            "originalPrice": {
              "amount": 249.99,
              "currency": "USD",
              "formatted": "$249.99"
            }
          },
          "availability": {
            "inStock": true,
            "text": "In Stock"
          },
          "images": [
            {
              "url": "https://example.com/images/headphones-black.jpg",
              "alt": "Wireless Noise-Cancelling Headphones — Black"
            }
          ]
        }
      ]
    }
  }
}
```

<div id="product-object-structure">
  ### Estructura del objeto product
</div>

El objeto `product` contiene las siguientes propiedades:

* `title`: El nombre del producto
* `brand`: La marca del producto (opcional)
* `category`: La categoría del producto (opcional)
* `url`: La URL canónica del producto
* `description`: La descripción del producto (opcional)
* `variants`: array de variantes del producto. El precio, la disponibilidad y las imágenes se encuentran en cada variante; un producto con un solo SKU sigue devolviendo exactamente una variante que contiene estos datos. Cada variante tiene:
  * `id`, `sku`, `title`: identificadores y nombre de la variante (todos opcionales)
  * `values`: un mapa del nombre de la opción a su valor, p. ej., `{ "color": "Charcoal" }` (opcional)
  * `price`: el objeto del precio actual (opcional):
    * `amount`: El valor numérico del precio
    * `currency`: El código de moneda, solo se informa cuando la página lo proporciona (opcional)
    * `formatted`: El precio tal como se muestra en la página (opcional)
  * `sale`: presente solo cuando la variante tiene descuento (opcional). Contiene:
    * `originalPrice`: El precio original (antes del descuento), con la misma estructura que `price`
  * `availability`: información de disponibilidad, siempre presente en una variante:
    * `inStock`: Si la variante está en stock
    * `text`: El texto de disponibilidad sin procesar de la página (opcional)
  * `images`: array de imágenes de la variante, cada una con una `url` y texto `alt` opcional (opcional)

<div id="how-product-extraction-works">
  ### Cómo funciona la extracción de productos
</div>

El formato de producto extrae el producto de forma determinista a partir de los datos estructurados de la página; no interviene ningún LLM. Combina varias fuentes por prioridad: **JSON-LD > microdatos de schema.org > RDFa > estado integrado (`__NEXT_DATA__`/Nuxt/Apollo/Redux/Remix) > `runParams` de AliExpress > `dataLayer` de GA4 > OpenGraph/`<meta>`**. La combinación tiene en cuenta la identidad, por lo que nunca se mezclan campos de productos distintos. La moneda solo se informa cuando aparece en las fuentes de la página.

<Note>
  La extracción de productos funciona en modo fail-closed: las páginas ambiguas no devuelven ningún producto, y las fuentes menos fiables, como OpenGraph, solo contribuyen cuando hay un precio presente. En una página sin un producto extraíble, la respuesta omite el objeto `product` y añade una advertencia (`warning`) (por ejemplo, "No product found...").
</Note>

<Note>
  **Alojamiento propio:** el formato `product` depende de un servicio dedicado de extracción de productos. En Firecrawl Cloud funciona de inmediato. Si haces self-hosting, configura `PRODUCT_EXTRACTION_SERVICE_URL` para que apunte a ese servicio; si no está definida, solicitar el formato `product` devuelve una advertencia y ningún producto (el mismo patrón que usan los formatos de audio/video para su servicio).
</Note>

### Combinación con otros formatos

Puedes combinar el formato de producto con otros formatos para obtener datos completos de la página:

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para empezar — agrega una para obtener límites de tasa más altos:
    # api_key='fc-YOUR_API_KEY',
  )

  result = firecrawl.scrape(
      url='https://example.com/products/wireless-headphones',
      formats=['markdown', 'product']
  )

  print(result['markdown'])
  print(result['product'])
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para empezar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const result = await firecrawl.scrape('https://example.com/products/wireless-headphones', {
      formats: ['markdown', 'product']
  });

  console.log(result.markdown);
  console.log(result.product);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com/products/wireless-headphones",
      "formats": ["markdown", "product"]
    }'
  ```
</CodeGroup>

<div id="audio-extraction">
  ## Extracción de audio
</div>

El formato `audio` extrae el audio de sitios web compatibles (p. ej., YouTube) como archivos MP3 y devuelve una URL firmada de Google Cloud Storage. Esto es útil para crear flujos de procesamiento de audio, servicios de transcripción o herramientas para pódcasts.

<Info>
  La extracción de audio cuesta 5 créditos por página (1 base + 4 adicionales).
</Info>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape("https://www.youtube.com/watch?v=dQw4w9WgXcQ", formats=["audio"])
  print(doc.audio)  # URL firmada de GCS para el archivo MP3
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — añade una para límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const doc = await firecrawl.scrape('https://www.youtube.com/watch?v=dQw4w9WgXcQ', {
    formats: ['audio']
  });

  console.log(doc.audio); // URL firmada de GCS para el archivo MP3
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "formats": ["audio"]
    }'
  ```
</CodeGroup>

<div id="video-extraction">
  ## Extracción de video
</div>

El formato `video` extrae el video con la mejor calidad de sitios web compatibles (p. ej., YouTube) y devuelve una URL firmada de Google Cloud Storage. Esto resulta útil para crear pipelines de procesamiento de video, herramientas de moderación o flujos de trabajo de archivado de contenido multimedia.

<Info>
  La extracción de video cuesta 5 créditos por página (1 base + 4 adicionales).
</Info>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape("https://www.youtube.com/watch?v=dQw4w9WgXcQ", formats=["video"])
  print(doc.video)  # URL firmada de GCS del archivo de video
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const doc = await firecrawl.scrape('https://www.youtube.com/watch?v=dQw4w9WgXcQ', {
    formats: ['video']
  });

  console.log(doc.video); // URL firmada de GCS del archivo de video
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "formats": ["video"]
    }'
  ```
</CodeGroup>

<span id="question-format" />

<div id="question-format">
  ## Formato de pregunta
</div>

Usa el formato `question` para hacer una pregunta en lenguaje natural sobre la página. Firecrawl devuelve la respuesta en el campo `answer` de la respuesta.

<Info>
  El formato `question` cuesta 5 créditos por página (1 base + 4 adicionales por la llamada al LLM).
</Info>

Opciones dentro del objeto de formato:

* `question` (obligatorio para `type: "question"`): la pregunta que se debe responder. Máximo: 10.000 caracteres.

Puedes combinar `question` con otros formatos; por ejemplo, solicita `markdown` y `question` a la vez para obtener el contenido de la página y una respuesta en una sola llamada.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape(
      "https://firecrawl.dev",
      formats=[{"type": "question", "question": "What is Firecrawl?"}],
  )
  print(doc.answer)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const doc = await firecrawl.scrape('https://firecrawl.dev', {
    formats: [{ type: 'question', question: 'What is Firecrawl?' }],
  });

  console.log(doc.answer);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formats": [
        { "type": "question", "question": "What is Firecrawl?" }
      ]
    }'
  ```
</CodeGroup>

El formato `question` también está disponible en `/search` mediante `scrapeOptions`, que ejecuta la misma extracción en cada resultado de búsqueda.

<span id="highlights-format" />

<div id="highlights-format">
  ## Formato highlights
</div>

Usa el formato `highlights` para encontrar texto fuente relevante en la página. Firecrawl devuelve el texto seleccionado en el campo `highlights` de la respuesta.

<Info>
  El formato `highlights` cuesta 5 créditos por página (1 base + 4 adicionales por la llamada al LLM).
</Info>

Opciones dentro del objeto de formato:

* `query` (obligatorio para `type: "highlights"`): la solicitud para seleccionar texto fuente. Máximo 10.000 caracteres.

Puedes combinar `highlights` con otros formatos; por ejemplo, solicita `markdown` y `highlights` juntos para obtener el contenido de la página y el texto fuente en una sola llamada.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape(
      "https://firecrawl.dev",
      formats=[{"type": "highlights", "query": "What is Firecrawl?"}],
  )
  print(doc.highlights)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const doc = await firecrawl.scrape('https://firecrawl.dev', {
    formats: [{ type: 'highlights', query: 'What is Firecrawl?' }],
  });

  console.log(doc.highlights);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formats": [
        { "type": "highlights", "query": "What is Firecrawl?" }
      ]
    }'
  ```
</CodeGroup>

El formato `highlights` también está disponible en `/search` mediante `scrapeOptions`, que ejecuta la misma extracción en cada resultado de búsqueda.

<div id="pii-redaction">
  ## Ocultación de PII
</div>

Configura `redactPII: true` para ocultar la información de identificación personal del markdown devuelto. El campo `markdown` contiene el resultado con la información ocultada.

Consulta [Ocultación de PII](/es/features/pii-redaction) para ver ejemplos de SDK, cURL, CLI y MCP.

<div id="interacting-with-the-page-with-actions">
  ## Interacción con la página mediante acciones
</div>

Firecrawl te permite realizar varias acciones en una página web antes de extraer su contenido. Esto es especialmente útil para interactuar con contenido dinámico, navegar entre páginas o acceder a contenido que requiera interacción del usuario.

<Tip>
  **Recomendamos [Interact](/es/features/interact) en lugar de las acciones: nuestra forma más reciente y potente de interactuar con páginas extraídas.**

  Interact se ejecuta como una sesión de navegador con estado que permanece activa entre llamadas, para que puedas controlar una página paso a paso con cualquiera de estas opciones:

  * **Lenguaje natural** para flujos flexibles y no deterministas. Por ejemplo, *“busca ‘wireless headphones’, filtra a 4+ estrellas por menos de \$200 y devuelve los resultados”*.
  * **Código de Playwright o agent-browser** para pasos deterministas. Por ejemplo, `await page.click('#export')`.

  Interact también admite perfiles, sesiones persistentes y una vista del navegador en vivo que se puede integrar (con un modo interactivo en el que los usuarios finales pueden controlar el navegador por sí mismos).
</Tip>

Aquí tienes un ejemplo de cómo usar acciones para ir a google.com, buscar Firecrawl, hacer clic en el primer resultado y tomar una captura de pantalla.

Es importante usar casi siempre la acción `wait` antes y/o después de ejecutar otras acciones para dar tiempo suficiente a que la página cargue.

<div id="example">
  ### Ejemplo
</div>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape(
      url="https://example.com/login",
      formats=["markdown"],
      actions=[
          {"type": "write", "text": "john@example.com"},
          {"type": "press", "key": "Tab"},
          {"type": "write", "text": "secret"},
          {"type": "click", "selector": 'button[type="submit"]'},
          {"type": "wait", "milliseconds": 1500},
          {"type": "screenshot", "full_page": True},
      ],
  )

  print(doc.markdown, doc.screenshot)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — agrega una para obtener límites de tasa más altos:
    // apiKey: "fc-TU-API-KEY",
  });

  const doc = await firecrawl.scrape('https://example.com/login', {
    formats: ['markdown'],
    actions: [
      { type: 'write', text: 'john@example.com' },
      { type: 'press', key: 'Tab' },
      { type: 'write', text: 'secret' },
      { type: 'click', selector: 'button[type="submit"]' },
      { type: 'wait', milliseconds: 1500 },
      { type: 'screenshot', fullPage: true },
    ],
  });

  console.log(doc.markdown, doc.screenshot);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer YOUR_API_KEY" para obtener límites de tasa más altos:
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -d '{
        "url": "https://example.com/login",
        "formats": ["markdown"],
        "actions": [
          { "type": "write", "text": "john@example.com" },
          { "type": "press", "key": "Tab" },
          { "type": "write", "text": "secret" },
          { "type": "click", "selector": "button[type=\"submit\"]" },
          { "type": "wait", "milliseconds": 1500 },
          { "type": "screenshot", "fullPage": true },
        ],
    }'
  ```
</CodeGroup>

<div id="output">
  ### Salida
</div>

<CodeGroup>
  ```json JSON theme={null}
  {
    "success": true,
    "data": {
      "markdown": "¡Nuestra primera Launch Week ha terminado! [Consulta el resumen 🚀](blog/firecrawl-launch-week-1-recap)...",
      "actions": {
        "screenshots": [
          "https://alttmdsdujxrfnakrkyi.supabase.co/storage/v1/object/public/media/screenshot-75ef2d87-31e0-4349-a478-fb432a29e241.png"
        ],
        "scrapes": [
          {
            "url": "https://www.firecrawl.dev/",
            "html": "<html><body><h1>Firecrawl</h1></body></html>"
          }
        ]
      },
      "metadata": {
        "title": "Inicio - Firecrawl",
        "description": "Firecrawl rastrea y convierte cualquier sitio web en Markdown limpio.",
        "language": "en",
        "keywords": "Firecrawl,Markdown,Datos,Mendable,LangChain",
        "robots": "seguir, index",
        "ogTitle": "Firecrawl",
        "ogDescription": "Convierte cualquier sitio web en datos listos para LLM.",
        "ogUrl": "https://www.firecrawl.dev/",
        "ogImage": "https://www.firecrawl.dev/og.png?123",
        "ogLocaleAlternate": [],
        "ogSiteName": "Firecrawl",
        "sourceURL": "http://google.com",
        "statusCode": 200
      }
    }
  }
  ```
</CodeGroup>

Para los flujos de trabajo que requieren un mayor control del navegador después del scraping, como sesiones autenticadas, navegación de varios pasos o una vista en vivo de la página, recomendamos [Interact](/es/features/interact) en lugar de ampliar el array de acciones.

<div id="location-and-language">
  ## Ubicación e idioma
</div>

Especifica el país y los idiomas preferidos para obtener contenido relevante según tu ubicación de destino y tus preferencias de idioma.

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

Cuando especificas la ubicación, Firecrawl usará un proxy adecuado si está disponible y emulará el idioma y la zona horaria correspondientes. De forma predeterminada, la ubicación se establece en "US" si no se indica lo contrario.

<div id="usage">
  ### Uso
</div>

Para usar la configuración de ubicación e idioma, incluye el objeto `location` en el cuerpo de la solicitud con las siguientes propiedades:

* `country`: código de país ISO 3166-1 alfa-2 (p. ej., 'US', 'AU', 'DE', 'JP'). Por defecto: 'US'.
* `languages`: una lista de idiomas y configuraciones regionales preferidas para la solicitud en orden de prioridad. Por defecto, usa el idioma de la ubicación especificada.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(
    # No se necesita API key para comenzar — agrega una para obtener mayores límites de tasa:
    # api_key="fc-YOUR-API-KEY",
  )

  doc = firecrawl.scrape('https://example.com',
      formats=['markdown'],
      location={
          'country': 'US',
          'languages': ['en']
      }
  )

  print(doc)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({
    // No se necesita API key para comenzar — añade una para obtener límites de tasa más altos:
    // apiKey: "fc-YOUR-API-KEY",
  });

  const doc = await firecrawl.scrape('https://example.com', {
    formats: ['markdown'],
    location: { country: 'US', languages: ['en'] },
  });

  console.log(doc.metadata);
  ```

  ```bash cURL theme={null}
  # No se necesita API key para comenzar — agrega -H "Authorization: Bearer $FIRECRAWL_API_KEY" para obtener límites de tasa más altos:
  curl -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com",
      "formats": ["markdown"],
      "location": { "country": "US", "languages": ["en"] }
    }'
  ```
</CodeGroup>

Para más información sobre las ubicaciones compatibles, consulta la [documentación de proxies](/es/features/proxies).

<div id="caching-and-maxage">
  ## Caché y maxAge
</div>

Para acelerar las solicitudes, Firecrawl sirve resultados desde la caché por defecto cuando hay una copia reciente disponible.

* **Ventana de frescura predeterminada**: `maxAge = 172800000` ms (2 días). Si la copia en caché es más reciente que esto, se devuelve al instante; de lo contrario, la página se vuelve a extraer y luego se almacena en caché.
* **Rendimiento**: Esto puede acelerar las extracciones hasta 5× cuando los datos no necesitan estar ultra frescos.
* **Obtener siempre contenido fresco**: Establece `maxAge` en `0`. Ten en cuenta que esto evita el uso de la caché por completo, por lo que cada solicitud recorre todo el pipeline de scraping, lo que significa que la solicitud tardará más en completarse y es más probable que falle. Utiliza un `maxAge` distinto de cero si la frescura en cada solicitud no es crítica.
* **Evitar almacenamiento**: Establece `storeInCache` en `false` si no quieres que Firecrawl almacene/guarde los resultados de esta solicitud en la caché.
* **Consulta solo en caché**: Establece `minAge` para realizar una consulta solo en caché sin activar una nueva extracción. El valor está en milisegundos y especifica la antigüedad mínima que deben tener los datos en caché. Si no se encuentran datos en caché, se devuelve un `404` con el código de error `SCRAPE_NO_CACHED_DATA`. Establece `minAge` en `1` para aceptar cualquier dato en caché independientemente de su antigüedad.
* **Seguimiento de cambios**: Las solicitudes que incluyen `changeTracking` omiten la caché, por lo que se ignora `maxAge`.
* **Créditos**: Los resultados en caché siguen costando 1 crédito por página. El almacenamiento en caché mejora la velocidad, no el consumo de créditos.

Ejemplo (forzar contenido fresco):

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl
  firecrawl = Firecrawl(api_key='fc-YOUR_API_KEY')

  doc = firecrawl.scrape(url='https://example.com', max_age=0, formats=['markdown'])
  print(doc)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({ apiKey: "fc-YOUR-API-KEY" });

  const doc = await firecrawl.scrape('https://example.com', { maxAge: 0, formats: ['markdown'] });
  console.log(doc);
  ```

  ```bash cURL theme={null}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com",
      "maxAge": 0,
      "formats": ["markdown"]
    }'
  ```
</CodeGroup>

Ejemplo (usar una ventana de caché de 10 minutos):

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl
  firecrawl = Firecrawl(api_key='fc-YOUR_API_KEY')

  doc = firecrawl.scrape(url='https://example.com', max_age=600000, formats=['markdown', 'html'])
  print(doc)
  ```

  ```js Node theme={null}

  const firecrawl = new Firecrawl({ apiKey: "fc-YOUR-API-KEY" });

  const doc = await firecrawl.scrape('https://example.com', { maxAge: 600000, formats: ['markdown', 'html'] });
  console.log(doc);
  ```

  ```bash cURL theme={null}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://example.com",
      "maxAge": 600000,
      "formats": ["markdown", "html"]
    }'
  ```
</CodeGroup>

<div id="batch-scraping-multiple-urls">
  ## Raspado por lotes de múltiples URL
</div>

Ahora puedes raspar varias URL en lote al mismo tiempo. Recibe las URL iniciales y parámetros opcionales como argumentos. El argumento params te permite especificar opciones adicionales para el trabajo de raspado por lotes, como los formatos de salida.

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

Es muy similar al funcionamiento del punto de conexión `/crawl`. Envía un trabajo de scraping por lotes y devuelve un ID de trabajo para consultar el estado del scraping por lotes.

El SDK ofrece 2 métodos: sincrónico y asincrónico. El método sincrónico devuelve los resultados del trabajo de scraping por lotes, mientras que el asincrónico devuelve un ID de trabajo que puedes usar para consultar el estado del scraping por lotes.

<div id="usage">
  ### Uso
</div>

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(api_key="fc-TU-CLAVE-DE-API")

  job = firecrawl.batch_scrape([
      "https://firecrawl.dev",
      "https://docs.firecrawl.dev",
  ], formats=["markdown"], poll_interval=2, wait_timeout=120)

  print(job)
  ```

  ```js Node theme={null}
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({ apiKey: "fc-YOUR-API-KEY" });

  const job = await firecrawl.batchScrape([
    'https://firecrawl.dev',
    'https://docs.firecrawl.dev',
  ], { options: { formats: ['markdown'] }, pollInterval: 2, timeout: 120 });

  console.log(job);
  ```

  ```bash cURL theme={null}
  curl -s -X POST "https://api.firecrawl.dev/v2/batch/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "urls": ["https://firecrawl.dev", "https://docs.firecrawl.dev"],
      "formatos": ["markdown"]
    }'
  ```
</CodeGroup>

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

Si usas los métodos síncronos de los SDK, devolverá los resultados del scraping por lotes. De lo contrario, devolverá un ID de tarea que puedes usar para consultar el estado del scraping por lotes.

<div id="synchronous">
  #### Sincronía
</div>

```json Completado theme={null}
{
  "status": "completed",
  "total": 36,
  "completed": 36,
  "creditsUsed": 36,
  "expiresAt": "2024-00-00T00:00:00.000Z",
  "next": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789?skip=26",
  "data": [
    {
      "markdown": "[Página principal de la documentación de Firecrawl![logotipo claro](https://mintlify.s3-us-west-1.amazonaws.com/firecrawl/logo/light.svg)!...",
      "html": "<!DOCTYPE html><html lang=\"en\" class=\"js-focus-visible lg:[--scroll-mt:9.5rem]\" data-js-focus-visible=\"\">...",
      "metadata": {
        "title": "Crea un «chat con el sitio web» usando Groq Llama 3 | Firecrawl",
        "language": "en",
        "sourceURL": "https://docs.firecrawl.dev/learn/rag-llama3",
        "description": "Aprende a usar Firecrawl, Groq Llama 3 y LangChain para crear un bot de «chat con tu sitio web»."
        "ogLocaleAlternate": [],
        "statusCode": 200
      }
    },
    ...
  ]
}
```

<div id="asynchronous">
  #### Asíncrono
</div>

Luego puedes usar el ID del trabajo para consultar el estado del scrape por lotes llamando al punto de conexión `/batch/scrape/{id}`. Este punto de conexión está pensado para usarse mientras el trabajo sigue en ejecución o justo después de que haya finalizado, **ya que los trabajos de scrape por lotes expiran a las 24 horas**.

```json theme={null}
{
  "success": true,
  "id": "123-456-789",
  "url": "https://api.firecrawl.dev/v2/batch/scrape/123-456-789"
}
```

<div id="enhanced-mode">
  ## Modo mejorado
</div>

Para sitios web complejos, Firecrawl ofrece un modo mejorado que proporciona mayores tasas de éxito a la vez que mantiene la privacidad.

Obtén más información sobre el [Modo mejorado](/es/features/enhanced-mode).

<div id="zero-data-retention-zdr">
  ## Retención cero de datos (ZDR)
</div>

Firecrawl admite la Retención cero de datos (ZDR) para equipos con requisitos estrictos de gestión de datos. Cuando está habilitada, Firecrawl no conservará ningún contenido de la página ni datos extraídos más allá de la duración de la solicitud.

Para habilitar ZDR, establece `zeroDataRetention: true` en tu solicitud:

```bash cURL theme={null}
curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer fc-YOUR_API_KEY" \
  -d '{
    "url": "https://example.com",
    "formats": ["markdown"],
    "zeroDataRetention": true
  }'
```

ZDR está disponible en los planes Enterprise y debe estar habilitado para tu equipo. Visita [firecrawl.dev/enterprise](https://www.firecrawl.dev/enterprise) para comenzar.

ZDR añade **1 crédito adicional por página** además del costo base del scrape.

<Note>
  Las capturas de pantalla no están disponibles en el modo ZDR. Como requieren cargarse en almacenamiento persistente, son incompatibles con la garantía de ZDR. Las solicitudes que incluyan tanto `zeroDataRetention: true` como un formato `screenshot` devolverán un error.
</Note>

> ¿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 ver las instrucciones de incorporación automatizada.
