Screenshot.com.ar

Give Claude a real browser for reading the web. screenshot.com.ar opens any public page in Chrome (JavaScript included) and returns what a person would see: the main content as clean markdown, a screenshot, or both from a single page load.

Documentation

Documentación

Le pasás una URL: te devolvemos la imagen (/v1/capture) o el contenido en markdown con la captura opcional (/v1/read). Para agentes de IA hay un servidor MCP.

Captura: /v1/capture

GET https://screenshot.com.ar/v1/capture?url=https://ejemplo.com&key=TU_API_KEY

La respuesta es la imagen directamente (image/png, image/jpeg o image/webp). Los headers X-Cache (HIT o MISS) y X-Quota-Remaining te dicen si salió de cache y cuántas capturas te quedan. Si una página completa era más alta que el máximo, se captura la parte de arriba y la respuesta trae X-Truncated: true y X-Page-Height con el alto real.

La API acepta CORS desde cualquier origen, así que podés llamarla desde el navegador. Ojo: si lo hacés con tu clave, queda visible para quien mire el código de tu página. Para mostrar capturas en una web (un <img>), usá links firmados.

Parámetros

Valen para /v1/capture y /v1/read.

ParámetroDefaultDescripción
urlrequeridoLa página a capturar. Si no ponés http(s), asumimos https.
key—Tu API key. También podés mandarla en el header X-API-Key o como Authorization: Bearer.
width1280Ancho del navegador en píxeles (320 a 1.920).
height800Alto del navegador en píxeles (240 a 1.920).
full_pagefalsetrue para capturar toda la página, no solo lo visible (hasta 10.000 px de alto; en PNG, hasta unos 8 megapíxeles). Si la página es más alta, se corta ahí.
formatpngpng, jpeg (o jpg) o webp.
quality80Calidad de 10 a 100 (solo jpeg y webp).
delay0Milisegundos de espera antes de capturar (máximo 5.000). Útil para animaciones.
darkfalsetrue para pedirle a la página su modo oscuro.
cache_ttl86400Segundos que guardamos la captura (0 a 2.592.000; 0 = sin cache). Las capturas desde cache no cuentan en tu cuota.

Ejemplos

Imagen directa en HTML (con un link firmado, así tu clave no queda a la vista)

<img src="https://screenshot.com.ar/v1/capture?url=https%3A%2F%2Fwww.argentina.gob.ar&key_id=TU_KEY_ID&signature=FIRMA" alt="Captura">

Página completa en WebP

curl "https://screenshot.com.ar/v1/capture?url=https://www.argentina.gob.ar&full_page=true&format=webp" \
  -H "X-API-Key: TU_API_KEY" -o captura.webp

Node.js

const res = await fetch("https://screenshot.com.ar/v1/capture?url=https://www.argentina.gob.ar", {
  headers: { "X-API-Key": process.env.SCREENSHOT_KEY }
});
if (!res.ok) throw new Error((await res.json()).message);
const buffer = Buffer.from(await res.arrayBuffer());

Links firmados: capturas en un <img> sin mostrar tu clave

Un link firmado lleva, en lugar de la API key, tu key_id (público) y una firma hecha con tu clave. Lo podés pegar en WordPress, Tiendanube o cualquier HTML: quien lo vea no puede sacar tu clave ni cambiar la captura (otra URL, otro tamaño), porque la firma deja de coincidir. Solo funciona en /v1/capture.

Sin programar: en Mi cuenta, sección "Links firmados", ponés la URL y te da el <img> listo para pegar.

Desde tu código (en tu servidor: nunca firmes en el navegador, porque ahí tu clave quedaría a la vista):

  1. Armá el query string con los parámetros de la captura y key_id, codificado como lo hace cualquier librería de URLs.
  2. Calculá la firma: HMAC-SHA256, con tu API key como clave, de ese query string tal cual. En hexadecimal.
  3. Agregá &signature= y la firma al final. signature tiene que ser el último parámetro.
ParámetroDescripción
key_idIdentifica tu clave sin revelarla: los primeros 16 caracteres del SHA-256 (hex) de tu API key. También lo ves en Mi cuenta.
expiresOpcional. Fecha en segundos Unix: después de esa fecha el link responde 410 link_expired.
signatureLa firma, siempre al final.

Además valen todos los parámetros de /v1/capture, salvo key. cache_ttl tiene que ser de al menos 3600 (1 hora; por defecto es 1 día): un link firmado es público, y sin cache cada visita a tu página gastaría una captura. Con cache, mostrar la imagen no gasta cuota: solo se cobra cuando se vuelve a sacar la captura. Para imágenes que no cambian seguido, conviene cache_ttl=604800 (7 días).

Si generás una clave nueva, los links firmados con la anterior dejan de funcionar (403 invalid_signature): es la forma de anularlos si hace falta.

Node.js

import { createHash, createHmac } from "node:crypto";

const key = process.env.SCREENSHOT_KEY;
const keyId = createHash("sha256").update(key).digest("hex").slice(0, 16);
const query = new URLSearchParams({ url: "https://tusitio.com", width: "1280", key_id: keyId }).toString();
const signature = createHmac("sha256", key).update(query).digest("hex");
const src = \`https://screenshot.com.ar/v1/capture?${query}&signature=${signature}\`;

Python

import hashlib, hmac, os, urllib.parse

key = os.environ["SCREENSHOT_KEY"]
key_id = hashlib.sha256(key.encode()).hexdigest()[:16]
query = urllib.parse.urlencode({"url": "https://tusitio.com", "width": 1280, "key_id": key_id})
signature = hmac.new(key.encode(), query.encode(), hashlib.sha256).hexdigest()
src = f"https://screenshot.com.ar/v1/capture?{query}&signature={signature}"

PHP (WordPress)

$key = getenv('SCREENSHOT_KEY');
$query = http_build_query(['url' => 'https://tusitio.com', 'width' => 1280, 'key_id' => substr(hash('sha256', $key), 0, 16)]);
$src = 'https://screenshot.com.ar/v1/capture?' . $query . '&signature=' . hash_hmac('sha256', $query, $key);
echo '<img src="' . esc_url($src) . '" alt="Captura" loading="lazy">';

Lectura: /v1/read

Abre la página una sola vez y devuelve JSON con el contenido principal en markdown limpio (sin scripts, menús, pie, publicidad ni banners de cookies) y, si querés, la captura en base64. Ideal para darle una página web a un LLM. Cuenta como 1 captura y usa la misma cache.

GET https://screenshot.com.ar/v1/read?url=https://ejemplo.com&screenshot=false
ParámetroDefaultDescripción
screenshottruefalse para no incluir la captura (respuesta más liviana).
max_chars50.000Largo máximo del markdown (100 a 200.000). Se corta en un final de párrafo.
Y todos los parámetros de captura (para la imagen).
{
  "url": "https://ejemplo.com/",          // URL final, después de redirecciones
  "title": "Ejemplo",
  "description": "Meta description de la página",
  "markdown": "# Ejemplo\n\nTexto de la página…",
  "truncated": false,                     // true si se cortó en max_chars
  "screenshot": { "format": "png", "base64": "iVBORw0…" },   // o null; si se cortó: "truncated": true, "page_height"
  "captured_at": "2026-10-21T15:00:00.000Z"
}

Uso del mes: /v1/usage

Devuelve el plan y cuántas capturas usaste este mes. No gasta cuota: sirve para validar una clave o para avisarte antes de llegar al límite.

curl "https://screenshot.com.ar/v1/usage" -H "X-API-Key: TU_API_KEY"

{ "plan": "free", "month": "2026-11", "monthly_limit": 100, "used": 12, "remaining": 88 }

Servidor MCP para agentes de IA

Conectá tu cliente de IA a https://screenshot.com.ar/mcp (Streamable HTTP). Hay dos formas de autenticarte, y las dos usan tu misma cuota (cada herramienta cuenta como 1 captura, salvo lo que sale de cache):

  • Con tu cuenta (OAuth 2.1): en Claude.ai, ChatGPT y los clientes que soportan inicio de sesión, pegás la URL y tocás Conectar. Entrás con el código por email y autorizás la app. La podés desconectar desde Mi cuenta.
  • Con tu API key: en Authorization: Bearer o X-API-Key. Si tu cliente solo acepta una URL y no soporta inicio de sesión, podés usar https://screenshot.com.ar/mcp?key=TU_API_KEY (cualquiera que tenga esa URL usa tu cuota: no la compartas).
HerramientaQué hace
read_page(url, max_chars?)Devuelve la página en markdown. La más barata para el contexto del modelo.
take_screenshot(url, width?, height?, full_page?, format?, dark?)Devuelve la imagen (JPEG por defecto; la página completa se corta en 8.000 px).
read_page_with_screenshot(url, max_chars?)Markdown y captura de lo visible, abriendo la página una sola vez.

Claude Code · Terminal

claude mcp add --transport http screenshot https://screenshot.com.ar/mcp \
  --header "Authorization: Bearer TU_API_KEY"

Cursor · ~/.cursor/mcp.json

{
  "mcpServers": {
    "screenshot": {
      "url": "https://screenshot.com.ar/mcp",
      "headers": {
        "Authorization": "Bearer TU_API_KEY"
      }
    }
  }
}

VS Code ·.vscode/mcp.json

{
  "servers": {
    "screenshot": {
      "type": "http",
      "url": "https://screenshot.com.ar/mcp",
      "headers": {
        "Authorization": "Bearer TU_API_KEY"
      }
    }
  }
}

Claude Desktop · claude_desktop_config.json (Configuración → Desarrollador → Editar configuración)

{
  "mcpServers": {
    "screenshot": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://screenshot.com.ar/mcp",
        "--header",
        "Authorization:${AUTH}"
      ],
      "env": {
        "AUTH": "Bearer TU_API_KEY"
      }
    }
  }
}

Claude.ai / ChatGPT · Conector personalizado (Claude: Configuración → Conectores · ChatGPT: Configuración → Conectores, modo desarrollador)

https://screenshot.com.ar/mcp

# Pegá esta URL y tocá Conectar. Entrás con el código que te llega por email
# y autorizás la app: no hace falta copiar tu API key.

Para que los agentes nos encuentren

  • /llms.txt: resumen del servicio para modelos de lenguaje (inglés y español).
  • /openapi.json: especificación OpenAPI 3.1 de /v1/capture y /v1/read, para generar clientes o herramientas (GPTs, function calling).

Errores

Los errores vuelven en JSON con error y message en español.

CódigoerrorCuándo pasa
400invalid_paramsFalta url, algún parámetro es inválido o la dirección no está permitida (redes privadas).
401missing_key / invalid_keyNo mandaste la clave o no existe.
403key_revokedLa clave fue dada de baja (por ejemplo, por uso indebido). Escribinos.
403invalid_signatureLink firmado: la firma no coincide (se cambió un parámetro, signature no está al final o se generó una clave nueva).
410link_expiredLink firmado: pasó la fecha de expires.
405method_not_allowedUsá GET.
413too_largeLa captura supera los 10 MB. Probá con jpeg o webp, o sin full_page.
422host_not_foundEl dominio no existe.
422dns_errorNo pudimos verificar el dominio (DNS caído o con errores). Reintentá en unos minutos.
422render_failedLa página no cargó (caída, muy lenta o bloquea navegadores).
429quota_exceededLlegaste al límite de tu plan este mes.
429browser_limitPlan gratis: llegaste al tope diario de tiempo de navegador (2 minutos). Se renueva a las 00:00 UTC.
429(sin JSON)Más de 60 pedidos en 10 segundos desde la misma IP. Esperá 10 segundos.
503busyAlta demanda momentánea. Reintentá en unos segundos.

Límites

Gratis: 100 capturas por mes. Pro: 5.000. Business: 25.000. El contador se reinicia el primer día de cada mes (UTC). Además, para proteger el servicio, se aceptan hasta 60 pedidos cada 10 segundos por IP. ¿Necesitás más? Escribinos a hola@screenshot.com.ar.

Crear API key gratis