track_changes
Almacene una instantánea de una página y compare la página en vivo con ella cuando quiera. Obtiene si algo cambió, cuánto, qué líneas se añadieron o eliminaron, y una puntuación de similitud estructural que indica si el marcado en sí fue reconstruido.
Casos de uso
Detecte un scraper a punto de romperse
Una structural_similarity baja significa que el marcado de la página fue reconstruido, que es lo que realmente rompe los selectores: detéctelo antes de que su pipeline de extracción empiece a devolver resultados vacíos.
Vigile páginas de precios de competidores
Limite el alcance a la tabla de precios con selector, compare según su propio calendario y lea las líneas añadidas y eliminadas para ver qué se movió.
Rastree documentos legales y de políticas
Compare términos de servicio, políticas de privacidad o páginas regulatorias y conserve un registro auditable de exactamente qué líneas cambiaron.
Detecte cambios incompatibles en documentación de API
Capture una línea base de la referencia o el changelog de un proveedor y compare antes de cada una de sus versiones.
Verifique que un despliegue cambió solo lo previsto
Capture una línea base antes de publicar, compare después y confirme que la diferencia coincide con el cambio previsto.
Endpoint
/api/v1/tools/track_changesParameters
trackingOptions, monitoringOptions y storageOptions: la API REST alojada acepta esas claves y las ignora, así que enviarlas no cambia nada. Los controles equivalentes existen en el servidor MCP de CrawlForge.| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Required | - | La página que se va a capturar o comparar. Example: https://competitor.com/pricing |
operation | string | Optional | compare | O `"create_baseline"` o `"compare"`. Pasar `"monitor"` devuelve 501: el monitoreo programado es una función del servidor MCP. Cualquier otro valor se rechaza con 400. Example: compare |
selector | string | Optional | - | Selector CSS que limita el rastreo a una parte de la página, por ejemplo `.pricing-table`. Las líneas base se almacenan por par (url, selector), de modo que la misma URL puede rastrearse en varios alcances de forma independiente. Devuelve 422 si el selector no coincide con nada. Example: .pricing-table |
update_baseline | boolean | Optional | false | Solo para `compare`. Después de comparar, sobrescribe la línea base almacenada con el contenido recién obtenido. Úselo para comparación continua, donde cada llamada informa el cambio desde la llamada anterior en lugar de desde la captura original. Example: false |
respect_robots | boolean | Optional | true | Respeta el robots.txt del sitio de destino. Con el valor `true`, una ruta que robots.txt no permita a `CrawlForge` se rechaza con un 403 antes de descargar nada y no se cobran credits. Póngalo en `false` solo para destinos con los que tenga su propio acuerdo: la respuesta incluye entonces una entrada `warnings` y la anulación queda registrada en su API key. Example: true |
Operaciones
Cree una línea base una vez y luego compare con ella tantas veces como quiera.
Cómo leer una comparación
Las dos puntuaciones responden preguntas distintas, y la combinación es más útil que cualquiera por separado.
structural_similarity es null, no 0, cuando la línea base almacenada es anterior a este campo. Cero es una puntuación real que significa que no sobrevivió nada estructural, así que una comparación no medida informa null en su lugar. Vuelva a ejecutar create_baseline, o pase update_baseline una vez, para empezar a puntuarla.Ejemplos de solicitud
# Step 1: capture the baseline (once per url + selector, kept 90 days)
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "create_baseline",
"selector": ".pricing-table"
}'
# Step 2: compare against it, as often as you like
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "compare",
"selector": ".pricing-table"
}'
# Rolling comparison: diff against the previous call, not the original capture
curl -X POST https://crawlforge.dev/api/v1/tools/track_changes \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://competitor.com/pricing",
"operation": "compare",
"selector": ".pricing-table",
"update_baseline": true
}'Ejemplo de respuesta
{ "success": true, "data": { "operation": "compare", "url": "https://competitor.com/pricing", "selector": ".pricing-table", "changed": true, "change_percent": 12.5, "structural_similarity": 0.9713, "added_count": 4, "removed_count": 2, "added_samples": [ "Pro $79 / month", "Includes 50,000 credits", "Enterprise", "Contact sales" ], "removed_samples": [ "Pro $99 / month", "Includes 25,000 credits" ], "baseline_captured_at": "2026-08-01T12:00:00.000Z", "compared_at": "2026-08-26T14:30:00.000Z", "baseline_updated": false }, "credits_used": 3, "credits_remaining": 997, "processing_time": 1180}data.changedVerdadero cuando el hash del contenido difiere del de la línea base: la comprobación más rápida si solo necesita un sí o un no.data.change_percentLíneas añadidas más eliminadas como porcentaje del documento más grande, de 0 a 100.data.structural_similaritySimilitud de marcado de 0 a 1. Null cuando la línea base es anterior a este campo.data.added_samplesHasta 20 líneas añadidas, cada una truncada a 500 caracteres. No es la diferencia completa: use added_count para el total real.data.removed_samplesHasta 20 líneas eliminadas, con los mismos límites que added_samples.data.baseline_updatedSi esta llamada sobrescribió la línea base, reflejando el parámetro update_baseline.credits_used3 credits, cobrados por llamada exitosa. Las llamadas fallidas no se cobran.Manejo de errores
No se encontró línea base (404 BASELINE_NOT_FOUND)
Llamó a compare antes de almacenar una línea base, o la línea base de 90 días expiró. Ejecute create_baseline para ese par exacto (url, selector) primero.
El selector no coincidió con nada (422 SELECTOR_NOT_FOUND)
El selector CSS no devolvió elementos. Verifíquelo contra el marcado en vivo: un selector que funciona en las herramientas de desarrollo después de ejecutarse JavaScript puede no existir en el HTML sin procesar que obtiene este endpoint.
Destino inalcanzable (502 FETCH_FAILED)
La página devolvió un estado distinto de 2xx. Los sitios con protección antibots suelen terminar aquí: obténgalos con stealth_mode en su lugar.
Monitoreo programado no disponible (501 OPERATION_NOT_AVAILABLE)
operation: "monitor" no está implementado en la API REST alojada. Llame a compare según su propio calendario, o use el servidor MCP de CrawlForge.
Parámetros inválidos (400 VALIDATION_ERROR)
URL mal formada, o un operation fuera de create_baseline, compare y monitor. El arreglo details de la respuesta nombra el campo que falla.
Almacenamiento no disponible (503 STORAGE_UNAVAILABLE)
No se pudo acceder al almacenamiento de líneas base. Reintente: no se cobran credits por llamadas fallidas.
Bloqueado por robots.txt (403 Forbidden)
El robots.txt del sitio de destino no permite esta ruta a CrawlForge. Establezca respect_robots: false para anularlo si tiene su propio acuerdo con el destino: la anulación queda registrada en su API key. La anulación no alcanza a un host incluido en la lista de exclusión permanente de CrawlForge, que se rechaza sea cual sea el valor de respect_robots.
selector en lugar de rastrear páginas enteras. Una línea base de página completa recoge navegación, pie de página, banners de cookies y contenido rotativo, que suele ser lo que produce un cambio en cada comparación.Costo en credits
create_baseline como compare cuestan 3 credits. Las llamadas fallidas no se cobran. No hay programador en la API REST, así que la frecuencia de sus comparaciones (y por tanto su costo) está totalmente bajo su control.Desglose de costos:
create_baseline: 3 credits, una vez por par (url, selector), válido 90 días
compare: 3 credits por llamada
Ejemplo de costo de sondeo, por URL:
Cada hora: 24 llamadas/día = 72 credits/día
Cada 6 horas: 4 llamadas/día = 12 credits/día
Diario: 1 llamada/día = 3 credits/día
Recomendaciones por plan:
Plan Free: 1.000 credits de prueba únicos = unas 5 URL comparadas cada 6 horas durante un mes
Plan Hobby: 5.000 credits/mes = unas 13 URL comparadas cada 6 horas ($19/mes)
Plan Professional: 50.000 credits/mes = unas 138 URL comparadas cada 6 horas ($99/mes)