Verificación del rastreador CrawlForge
Una solicitud en sus registros dice ser CrawlForge. Esta página explica cómo comprobar que realmente lo es, cómo bloquearla si prefiere que no le descarguemos páginas y a quién escribir.
CrawlForge es estable. La versión que va detrás cambia en cada publicación y no es la misma en nuestras dos superficies, así que una regla escrita contra un User-Agent completo dejará de coincidir. Compare el token; y si quiere una prueba en lugar de una afirmación, verifique la firma.Cómo se identifica CrawlForge
Cada página que descarga CrawlForge se descarga con un único User-Agent honesto: el token de producto CrawlForge, una versión y una URL de contacto. No hay una segunda identidad, ni rotación, ni un valor predeterminado que imite a un navegador; en las reglas de funcionamiento del rastreador se explica por qué eso es una regla y no una preferencia.
CrawlForge funciona en dos superficies y ambas envían este token: la API REST alojada y el paquete crawlforge-mcp-server que los clientes ejecutan por su cuenta. Cada una envía la versión de su propio paquete, de modo que el segmento de versión varía según la superficie y la publicación, mientras que el token no.
El patrón del User-Agent
Esto es lo que conviene comparar. Solo varía el segmento de versión.
CrawlForge/<version> (+https://crawlforge.dev)Lo que envía hoy la API alojada
Se genera a partir de la misma constante que envía el rastreador, así que esta página no puede desincronizarse del encabezado. Se muestra como ejemplo, no como una cadena con la que comparar: la próxima publicación la cambia. El servidor MCP envía la misma forma con la versión de su propio paquete.
User-Agent: CrawlForge/1.0.0 (+https://crawlforge.dev)Cómo reconocernos en sus registros
Una comparación por prefijo con el token sobrevive a todas las publicaciones que hagamos.
# Match the product token. Anchored, and stopping at the slash, so the
# version cannot break the match on our next release.
^CrawlForge/El token retirado CrawlForge-Bot
Algunas de nuestras herramientas se identificaban antes como CrawlForge-Bot. Ya nada envía ese token: todo envía CrawlForge.
Aun así se sigue respetando como origen de un disallow. Unificar el token habría desbloqueado en silencio a todos los propietarios de sitios que ya habían escrito el nombre antiguo en su robots.txt, y esa fue una decisión que tomaron sobre nosotros y que un cambio de nombre no tiene por qué descartar. Se consultan los dos tokens y un disallow de cualquiera de ellos prevalece.
Si su robots.txt ya nombra el token retirado, no necesita cambiar nada.
# Already in your file? Leave it — it still blocks us.
User-agent: CrawlForge-Bot
Disallow: /Verificación criptográfica (Web Bot Auth)
Un User-Agent es una afirmación, y cualquiera puede enviar el nuestro. Por eso CrawlForge firma sus solicitudes salientes con Web Bot Auth: firmas de mensajes HTTP (RFC 9421) con una clave Ed25519 cuya mitad pública publicamos. Usted puede verificar una solicitud sin contactarnos y sin listas de permitidos.
Las dos superficies firman. Cada solicitud firmada lleva Signature-Input (los componentes cubiertos y los parámetros de la firma), Signature (la firma Ed25519, en base64) y Signature-Agent (la URL del directorio que publica nuestra clave).
La firma cubre la autoridad a la que se envió la solicitud, más el valor de Signature-Agent cuando se anuncia. Demuestra que la solicitud proviene de quien posee nuestra clave privada. No cubre la ruta, el cuerpo ni el User-Agent, así que tómela como prueba de *quién*, no de *qué se pidió*.
Nuestro directorio de firmas
Un conjunto de claves JSON, servido como application/http-message-signatures-directory+json y almacenable en caché durante un día. Fíjese en el plural de signatures.
curl -sS https://www.crawlforge.dev/.well-known/http-message-signatures-directoryLos encabezados que enviamos
La lista de parámetros la serializa la misma función que firma nuestras solicitudes. Los valores entre paréntesis angulares cambian en cada solicitud. Resuelva el `keyid` contra el directorio en lugar de fijarlo: es una huella de la clave y cambia cuando la rotamos.
Signature-Input: sig1=("@authority" "signature-agent");created=1787788800;keyid="<keyid — look it up in the directory>";alg="ed25519";expires=1787789100;nonce="<64 random bytes, base64>";tag="web-bot-auth"
Signature: sig1=:<base64 Ed25519 signature>:
Signature-Agent: "https://www.crawlforge.dev"Cómo verificar una solicitud
Reconstruya la base de la firma a partir de la solicitud que recibió y compruébela contra la clave publicada. El módulo crypto de Node basta; cualquier verificador de RFC 9421 hace lo mismo.
import { createPublicKey, verify } from 'node:crypto';
// `request` is the request you received; `signatureInput` and `signature`
// are its Signature-Input and Signature header values.
// 1. Fetch the directory and index the published keys by their thumbprint.
const { keys } = await fetch(
'https://www.crawlforge.dev/.well-known/http-message-signatures-directory'
).then((r) => r.json());
// 2. Read the parameters off Signature-Input, dropping the "sig1=" label.
const params = signatureInput.replace(/^[^=]+=/, '');
const keyid = /keyid="([^"]+)"/.exec(params)?.[1];
const published = keys.find((k) => k.kid === keyid);
if (!published) throw new Error('keyid is not in the directory — not us');
// 3. Rebuild the signature base from the request you received. The covered
// components are listed in the parentheses at the start of params.
const covered = /^\(([^)]*)\)/.exec(params)[1];
const lines = [`"@authority": ${request.headers.host}`];
if (covered.includes('"signature-agent"')) {
lines.push(`"signature-agent": ${request.headers['signature-agent']}`);
}
lines.push(`"@signature-params": ${params}`);
// 4. Verify the Ed25519 signature (base64, between the colons).
const key = createPublicKey({
key: { kty: 'OKP', crv: 'Ed25519', x: published.x },
format: 'jwk',
});
const bytes = Buffer.from(
signature.replace(/^[^=]+=:/, '').replace(/:$/, ''),
'base64'
);
const ok = verify(null, Buffer.from(lines.join('\n'), 'utf8'), key, bytes);
// 5. Finally, reject a stale signature: params carries created= and expires=,
// and we sign with a five-minute window.Cómo bloquear a CrawlForge
Una sola regla de robots.txt lo cubre todo. El nombre del grupo es el token de producto, que ambas superficies utilizan para la comparación, así que esto bloquea todas las herramientas de CrawlForge en las dos.
Añada esto a su robots.txt. Surte efecto en la siguiente descarga: leemos el archivo una vez por origen al comienzo de cada rastreo.
User-agent: CrawlForge
Disallow: /Lo que no le vamos a ocultar
robots.txt se respeta de forma predeterminada en todas las herramientas de descarga. Un cliente también puede pasar respect_robots: false en una solicitud concreta: esa excepción existe, está documentada y es deliberada, porque algunos clientes tienen su propio acuerdo con el sitio que descargan y empujar esa decisión a la clandestinidad la volvería invisible, no rara.
No es silenciosa. La excepción se aplica a una sola solicitud, nunca a una cuenta ni al producto. La respuesta incluye una advertencia de que se usó, y la solicitud se registra en el servidor como una entrada robots_override con la URL, la herramienta y el identificador interno de la clave de API que la pidió —nunca la clave en sí—, de modo que una descarga en disputa pueda rastrearse hasta el cliente que la eligió.
Por debajo de todo esto hay una exclusión a nivel de plataforma a la que no llega ningún parámetro. Si una regla de robots.txt no le basta, use la vía de exclusión.
Direcciones IP de salida
Hoy no publicamos una lista de direcciones IP de salida. Nuestra API alojada y nuestro backend de navegador funcionan sobre infraestructura de terceros y, hasta que podamos comprometernos con un rango que siga siendo exacto el mes que viene, publicar uno sería peor que no publicar nada: una lista de permitidos construida sobre un rango obsoleto se cierra ante el tráfico real y se abre ante todo lo demás. Cuando tengamos una lista que podamos sostener, aparecerá en esta sección.
En cualquier caso, la verificación de la firma es la comprobación más sólida. Un rango de direcciones solo demuestra de dónde salió un paquete, y quien pueda alquilar una dirección dentro de ese rango hereda la afirmación; el remedio habitual —una búsqueda de DNS inverso encima— demuestra el control de un nombre de host, no el de la solicitud. Una firma Ed25519 demuestra la posesión de la clave privada cuya mitad pública está en nuestro directorio, sobrevive a que cambiemos de proveedor y no puede reproducirse contra otra autoridad.
Si una firma no le basta para un acuerdo comercial por su parte, escriba a support@crawlforge.dev e indique qué necesita.
Exclusiones y retiradas de contenido
Para quedar excluido a nivel de plataforma —de forma permanente, en todas las herramientas, todas las claves de API y todos los planes, sin que ningún parámetro de cliente pueda anularlo— escriba a support@crawlforge.dev indicando el dominio y las páginas afectadas. La misma dirección atiende las solicitudes de retirada de contenido y cualquier duda sobre tráfico que crea que procede de nosotros.