> ## Documentation Index
> Fetch the complete documentation index at: https://firecrawl-noaa-mar-900-create-self-partnership-provisioning.mintlify.site/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(api_key="fc-TU-API-KEY")
  ```

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

  import Firecrawl from '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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).

<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 preguntas y destacados cuestan 4 créditos adicionales por página por formato, el proxy mejorado 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
* 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 o TikTok (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.

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

  app = Firecrawl(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 "@mendable/firecrawl-js";
  import { z } from "zod";

  const app = new Firecrawl({
    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}
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
        "url": "https://firecrawl.dev",
        "formatos": [ {
          "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(api_key="fc-YOUR-API-KEY")

  result = app.scrape(
      'https://firecrawl.dev',
      formats=[{
        "type": "json",
        "prompt": "Extrae la misión de la empresa de la página."
      }],
      only_main_content=False,
      timeout=120000
  )

  print(result)
  ```

  ```js Node theme={null}
  import Firecrawl from "@mendable/firecrawl-js";

  const app = new Firecrawl({
    apiKey: "fc-TU_API_KEY"
  });

  const result = await app.scrape("https://firecrawl.dev", {
    formats: [{
      type: "json",
      prompt: "Extrae la misión de la empresa de la página."
    }]
  });

  console.log(result);
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
        "url": "https://firecrawl.dev",
        "formats": [{
          "type": "json",
          "prompt": "Extrae la misión de la empresa de la página."
        }]
      }'
  ```
</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(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 '@mendable/firecrawl-js';

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

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

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

  ```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://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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://firecrawl.dev",
      "formatos": ["markdown", "branding", "screenshot"]
    }'
  ```
</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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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 TikTok) 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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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(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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -s -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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="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(api_key="fc-YOUR-API-KEY")

  doc = firecrawl.scrape(
      url="https://example.com/login",
      formatos=["markdown"],
      acciones=[
          {"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.js theme={null}
  import Firecrawl from '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ 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}
  curl -X POST https://api.firecrawl.dev/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -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(api_key="fc-YOUR-API-KEY")

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

  print(doc)
  ```

  ```js Node.js theme={null}
  import Firecrawl from '@mendable/firecrawl-js';

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

  const doc = await firecrawl.scrape('https://example.com', {
    formatos: ['markdown'],
    ubicación: { país: 'US', idiomas: ['en'] },
  });

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

  ```bash cURL theme={null}
  curl -X POST "https://api.firecrawl.dev/v2/scrape" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -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 '@mendable/firecrawl-js';

  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 '@mendable/firecrawl-js';

  const firecrawl = new Firecrawl({ apiKey: "fc-TU-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.
