Framejet Screenshot

Capturas PNG/JPEG limpias vía MCP remoto o REST, con navegación multi-paso orientada a objetivos. Elimina banners de cookies y widgets de chat por defecto.

Servidor MCP alojado

npx add-mcp 'https://framejet.dev/mcp'

Se instala en Claude Code, Codex, Cursor y más

Documentación

API de capturas de pantalla

Un solo endpoint. Pasa una URL, recibe una imagen.

Autenticación

Pasa tu clave en el encabezado X-Api-Key o Authorization: Bearer. No se admiten claves en la cadena de consulta. Cuando no puedas enviar un encabezado, como en una etiqueta <img> o una hoja de cálculo, usa una URL firmada. Obtén una gratis en la página de inicio.

Cómo funciona tu clave

Ingresa tu correo electrónico en la página de inicio y confirma el enlace en tu bandeja de entrada. Tu navegador genera una nueva clave de API. Cópiala antes de salir; nunca se envía por correo ni el servidor la devuelve.

Usa el mismo correo al finalizar la compra. El pago actualiza tu plan sin cambiar una clave de API existente. Si aún no tienes una clave, solicita un enlace de verificación desde la página de inicio.

¿Perdiste tu clave? Solicita un enlace de recuperación. La confirmación crea un reemplazo e invalida la clave anterior de inmediato.

GET /v1/take

curl -H "X-Api-Key: YOUR_KEY" -o shot.png "https://framejet.dev/v1/take?url=https://example.com"

Parámetros

ParámetroPredeterminadoDescripción
url—Obligatorio. Página http/https a capturar.
X-Api-Key—Encabezado HTTP. Alternativamente usa Authorization: Bearer.
formatpngpng o jpeg.
full_pagefalseCaptura toda la altura de desplazamiento.
width1280Ancho de la ventana gráfica, 320–3840.
height800Alto de la ventana gráfica, aún validado con full_page=true; el contenido de la página determina la altura final de la captura.
dpr1Relación de píxeles del dispositivo, 1–3. Consulta la guía de API de capturas retina.
cleantrueElimina banners de cookies, barras fijas y widgets de chat.
delay0Espera adicional en ms después de la carga, máximo 10000.
cachetrueEstablece false para forzar una captura nueva.
actions—Pasos a ejecutar antes de capturar, separados por ;, cada uno verb:arg — click:<css>, type:<css>=<text>, waitfor:<css>, wait:<ms>, scroll:<px>. Máximo 10 pasos, 15s de espera total.
goal—Descripción en palabras simples del estado a alcanzar, que termina con cuándo detenerse. Máximo 300 caracteres. Consulta modo objetivo.
values—Cadenas separadas por | que un paso de goal puede escribir. Máximo 10, 200 caracteres cada una. Framejet nunca inventa texto.

Máximo 32 millones de píxeles y 4 MB por imagen. Las capturas costosas pueden rechazarse con pixel_limit o image_too_large. Cada renderizador en caliente permite dos capturas simultáneas; el exceso de trabajo devuelve 429.

Modo objetivo

Usa el modo objetivo cuando la ruta o los controles varíen y no puedas nombrar cada selector de manera confiable de antemano. Describe el estado final de la página y Framejet avanza hacia él, releyendo la página después de cada paso. Si conoces los selectores, actions también puede hacer clic, escribir y esperar controles que aparecen después de pasos anteriores. Consulta la guía de captura después de hacer clic o buscar para ambos enfoques.

GET /v1/take
  ?url=https://en.wikipedia.org/
  &goal=Search for the Colosseum article, open it, then open its
        View history page. Stop when the revision list is visible.
  &values=Colosseum

Cualquier texto escrito proviene de values y de nada más — si ninguno se ajusta a un campo, la captura falla en lugar de adivinar. La navegación se decide mediante un modelo de opciones restringidas que elige entre los controles realmente presentes en la página, por lo que no puede inventar un elemento.

Usa actions siempre que conozcas la página. Los pasos de selector son deterministas y reproducibles. El modo objetivo puede tardar varios segundos, está limitado a 12 pasos y 30 segundos, y no garantiza tomar la misma decisión dos veces. Ambos modos usan un crédito de captura cuando devuelven una imagen nueva. Para pruebas de regresión visual en particular, usa actions — una ruta de captura no determinista convierte tus diferencias en ruido.

Cuando el modo objetivo informa que no puede alcanzar el estado solicitado, devuelve 422 goal_unreached y no consume cuota. Un modelo decide cuándo el objetivo parece completo, así que verifica la imagen devuelta antes de confiar en ella para flujos de trabajo críticos.

URLs firmadas

Una URL firmada permite que una página, un CMS o una herramienta sin código carguen una captura directamente, por ejemplo en <img src>, sin exponer tu clave de API. Obtén tu ID de clave y secreto de firma una vez:

curl -H "X-Api-Key: YOUR_KEY" https://framejet.dev/v1/signing-key # { "key_id": "…", "signing_secret": "…" }

Construye la cadena de consulta con key_id y cualquier parámetro de captura, calcula HMAC-SHA256 de esa cadena exacta con el secreto de firma, y agrega &sig= con el resumen hexadecimal como último parámetro. Firma los bytes que envías: no reordenes ni recodifiques la consulta después. Mantén el secreto de firma en tu servidor.

import { createHmac } from "node:crypto"; const q = new URLSearchParams({ url: "https://example.com", key_id: KEY_ID, width: "1280" }).toString(); const sig = createHmac("sha256", SIGNING_SECRET).update(q).digest("hex"); const src = https://framejet.dev/v1/take?${q}&sig=${sig}\;

import hashlib, hmac from urllib.parse import urlencode q = urlencode({"url": "https://example.com", "key_id": KEY_ID, "width": "1280"}) sig = hmac.new(SIGNING_SECRET.encode(), q.encode(), hashlib.sha256).hexdigest() src = f"https://framejet.dev/v1/take?{q}&sig={sig}"

  • Cambiar cualquier parámetro invalida la firma, por lo que una URL firmada no puede reutilizarse para otra página o configuración.
  • Agrega expires (segundos Unix) antes de firmar para que una URL deje de funcionar después de ese momento.
  • Las solicitudes firmadas siempre usan la caché, y la respuesta es pública durante un día, por lo que las vistas repetidas no gastan cuota. La primera captura de cada URL usa una captura.
  • Reemplazar tu clave de API cambia ambos valores e invalida todas las URLs firmadas creadas con las anteriores.

Respuesta

Las respuestas son privadas/sin almacenamiento, excepto las URLs firmadas (ver arriba). Las imágenes en caché pertenecen a tu cuenta y caducan después de siete días; los aciertos repetidos de caché no gastan cuota.

200 con los bytes de la imagen (image/png o image/jpeg). X-Framejet-Cache es HIT o MISS; X-Framejet-Remaining muestra las capturas restantes este mes.

Errores

JSON { "error": "...", "code": "..." }:

EstadocódigoSignificado
401no_key / invalid_keyClave de API faltante o desconocida.
403bad_signature / url_expiredUna URL firmada fue alterada, firmada con el secreto incorrecto, o superó su tiempo de expires.
402quota_exceededCuota mensual alcanzada. Mejora tu plan en precios.
422bad_url / blocked_target / target_timeoutLa URL de destino es inválida, privada o no cargó.
422target_errorEl destino respondió con HTTP 400 o superior, generalmente protección contra bots (chatgpt.com devuelve 403). Framejet no lo evita. No se usó cuota.
422bad_action / bad_goal / bad_values / action_failedUn paso no pudo analizarse, o un selector en actions no coincidió con nada. No se usó cuota.
422goal_unreached / values_requiredEl estado objetivo no se alcanzó, o un campo necesitaba texto que ningún value proporcionado coincidía. No se usó cuota.
500capture_failedError nuestro — no se usó cuota.

Ejemplos

JavaScript

const res = await fetch("https://framejet.dev/v1/take?url=https://example.com", { headers: { "X-Api-Key": KEY } }); if (!res.ok) throw new Error(await res.text()); fs.writeFileSync("shot.png", Buffer.from(await res.arrayBuffer()));

Python

r = requests.get("https://framejet.dev/v1/take", params={"url": "https://example.com"}, headers={"X-Api-Key": KEY}) r.raise_for_status() open("shot.png", "wb").write(r.content)

Servidor MCP

Framejet también es un servidor remoto de Protocolo de Contexto de Modelo, por lo que puedes darle a un agente de IA (Claude, Cursor, …) la capacidad de tomar capturas de pantalla. Agrega un conector apuntando a:

https://framejet.dev/mcp

Autentica con tu clave de API como token portador (Authorization: Bearer YOUR_KEY), o envíala como X-Api-Key: YOUR_KEY. Expone una herramienta, screenshot, que toma los mismos parámetros que arriba (url, full_page, width, format, clean, goal, values, …) y devuelve la imagen en línea. Las llamadas usan la misma cuota mensual.

Contacto

Preguntas, límites más altos, errores: correo electrónico founder@framejet.dev.