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

# scraping

> Convierte cualquier URL en datos limpios

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

* Gestiona las complejidades: proxies, caché, límites de velocidad, contenido bloqueado por JS
* Maneja contenido dinámico: sitios dinámicos, sitios renderizados con JS, PDF, 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.evocrawl.com/api-reference/endpoint/scrape).

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

<div id="scraping-a-url-with-evocrawl">
  ## Extraer datos de una URL con Evocrawl
</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 evocrawl-py

  from evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-TU-API-KEY")
  ```

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

  import Evocrawl from '@mendable/evocrawl-js';

  const evocrawl = new Evocrawl({ apiKey: "fc-YOUR-API-KEY" });
  ```

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

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

### Uso

<CodeGroup>
  ```python Python theme={null}
  from evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-YOUR-API-KEY")

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

  ```js Node theme={null}
  import Evocrawl from '@mendable/evocrawl-js';

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

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

  ```bash cURL theme={null}
  curl -s -X POST "https://api.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://evocrawl.com",
      "formats": ["markdown", "html"]
    }'
  ```

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

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

Para más información sobre los parámetros, consulta la [Referencia de la API](https://docs.evocrawl.com/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, 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 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.evocrawl.com/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 - Evocrawl",
      "description": "Evocrawl rastrea y convierte cualquier sitio web en Markdown limpio.",
      "language": "en",
      "keywords": "Evocrawl,Markdown,Data,Mendable,Langchain",
      "robots": "seguir, indexar",
      "ogTitle": "Evocrawl",
      "ogDescription": "Convierte cualquier sitio web en datos listos para LLM.",
      "ogUrl": "https://www.evocrawl.com/",
      "ogImage": "https://www.evocrawl.com/og.png?123",
      "ogLocaleAlternate": [],
      "ogSiteName": "Evocrawl",
      "sourceURL": "https://evocrawl.com",
      "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)

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 evocrawl import Evocrawl
  from pydantic import BaseModel

  app = Evocrawl(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://evocrawl.com',
      formats=[{
        "type": "json",
        "schema": CompanyInfo.model_json_schema()
      }],
      only_main_content=False,
      timeout=120000
  )

  print(result)
  ```

  ```js Node theme={null}
  import Evocrawl from "@mendable/evocrawl-js";
  import { z } from "zod";

  const app = new Evocrawl({
    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://evocrawl.com", {
    formats: [{
      type: "json",
      schema: schema
    }],
  });

  console.log(result);
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.evocrawl.com/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
        "url": "https://evocrawl.com",
        "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": "Evocrawl",
        "description": "Rastreo y extracción de datos web con IA",
        "robots": "seguir, indexar",
        "ogTitle": "Evocrawl",
        "ogDescription": "Rastreo y extracción de datos web con IA",
        "ogUrl": "https://evocrawl.com/",
        "ogImage": "https://evocrawl.com/og.png",
        "ogLocaleAlternate": [],
        "ogSiteName": "Evocrawl"
        "sourceURL": "https://evocrawl.com/"
      },
    }
}
```

<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 evocrawl import Evocrawl

  app = Evocrawl(api_key="fc-YOUR-API-KEY")

  result = app.scrape(
      'https://evocrawl.com',
      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 Evocrawl from "@mendable/evocrawl-js";

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

  const result = await app.scrape("https://evocrawl.com", {
    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.evocrawl.com/v2/scrape \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
        "url": "https://evocrawl.com",
        "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": "Evocrawl",
        "description": "Rastreo web y extracción de datos impulsados por IA",
        "robots": "seguir, indexar",
        "ogTitle": "Evocrawl",
        "ogDescription": "Rastreo web y extracción de datos impulsados por IA",
        "ogUrl": "https://evocrawl.com/",
        "ogImage": "https://evocrawl.com/og.png",
        "ogLocaleAlternate": [],
        "ogSiteName": "Evocrawl",
        "sourceURL": "https://evocrawl.com/"
      },
    }
}
```

<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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key='fc-YOUR_API_KEY')

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

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

  ```js Node theme={null}
  import Evocrawl from '@mendable/evocrawl-js';

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

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

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

  ```bash cURL theme={null}
  curl -s -X POST "https://api.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://evocrawl.com",
      "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://evocrawl.com/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://evocrawl.com/logo.svg",
        "favicon": "https://evocrawl.com/favicon.ico",
        "ogImage": "https://evocrawl.com/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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key='fc-YOUR_API_KEY')

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

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

  ```js Node theme={null}
  import Evocrawl from '@mendable/evocrawl-js';

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

  const result = await evocrawl.scrape('https://evocrawl.com', {
      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.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://evocrawl.com",
      "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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-YOUR-API-KEY")

  doc = evocrawl.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 Evocrawl from '@mendable/evocrawl-js';

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

  const doc = await evocrawl.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.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "formats": ["audio"]
    }'
  ```
</CodeGroup>

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

Evocrawl 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.

Aquí tienes un ejemplo de cómo usar acciones para ir a google.com, buscar Evocrawl, 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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-YOUR-API-KEY")

  doc = evocrawl.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 Evocrawl from '@mendable/evocrawl-js';

  const evocrawl = new Evocrawl({ apiKey: "fc-TU-API-KEY" });

  const doc = await evocrawl.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.evocrawl.com/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/evocrawl-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.evocrawl.com/",
            "html": "<html><body><h1>Evocrawl</h1></body></html>"
          }
        ]
      },
      "metadata": {
        "title": "Inicio - Evocrawl",
        "description": "Evocrawl rastrea y convierte cualquier sitio web en Markdown limpio.",
        "language": "en",
        "keywords": "Evocrawl,Markdown,Datos,Mendable,LangChain",
        "robots": "seguir, index",
        "ogTitle": "Evocrawl",
        "ogDescription": "Convierte cualquier sitio web en datos listos para LLM.",
        "ogUrl": "https://www.evocrawl.com/",
        "ogImage": "https://www.evocrawl.com/og.png?123",
        "ogLocaleAlternate": [],
        "ogSiteName": "Evocrawl",
        "sourceURL": "http://google.com",
        "statusCode": 200
      }
    }
  }
  ```
</CodeGroup>

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

<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, Evocrawl 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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-YOUR-API-KEY")

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

  print(doc)
  ```

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

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

  const doc = await evocrawl.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.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_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, Evocrawl 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 Evocrawl 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 evocrawl import Evocrawl
  evocrawl = Evocrawl(api_key='fc-YOUR_API_KEY')

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

  ```js Node theme={null}
  import Evocrawl from '@mendable/evocrawl-js';

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

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

  ```bash cURL theme={null}
  curl -s -X POST "https://api.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_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 evocrawl import Evocrawl
  evocrawl = Evocrawl(api_key='fc-YOUR_API_KEY')

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

  ```js Node theme={null}

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

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

  ```bash cURL theme={null}
  curl -s -X POST "https://api.evocrawl.com/v2/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_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 evocrawl import Evocrawl

  evocrawl = Evocrawl(api_key="fc-TU-CLAVE-DE-API")

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

  print(job)
  ```

  ```js Node theme={null}
  import Evocrawl from '@mendable/evocrawl-js';

  const evocrawl = new Evocrawl({ apiKey: "fc-TU-API-KEY" });

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

  console.log(job);
  ```

  ```bash cURL theme={null}
  curl -s -X POST "https://api.evocrawl.com/v2/batch/scrape" \
    -H "Authorization: Bearer $EVOCRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "urls": ["https://evocrawl.com", "https://docs.evocrawl.com"],
      "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.evocrawl.com/v2/batch/scrape/123-456-789?skip=26",
  "data": [
    {
      "markdown": "[Página principal de la documentación de Evocrawl![logotipo claro](https://mintlify.s3-us-west-1.amazonaws.com/evocrawl/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 | Evocrawl",
        "language": "en",
        "sourceURL": "https://docs.evocrawl.com/learn/rag-llama3",
        "description": "Aprende a usar Evocrawl, 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.evocrawl.com/v2/batch/scrape/123-456-789"
}
```

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

Para sitios web complejos, Evocrawl 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>

Evocrawl admite la Retención cero de datos (ZDR) para equipos con requisitos estrictos de gestión de datos. Cuando está habilitada, Evocrawl 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.evocrawl.com/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 [evocrawl.dev/enterprise](https://www.evocrawl.com/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 Evocrawl? Consulta [evocrawl.dev/agent-onboarding/SKILL.md](https://www.evocrawl.com/agent-onboarding/SKILL.md) para ver las instrucciones de incorporación automatizada.
