Seguimiento de cambios El seguimiento de cambios te permite monitorear y detectar modificaciones en el contenido web a lo largo del tiempo. Esta función está disponible tanto en los SDK de JavaScript como de Python.

Descripción general

El seguimiento de cambios te permite:
  • Detectar si una página web ha cambiado desde la última extracción
  • Ver los cambios específicos entre extracciones
  • Obtener datos estructurados sobre lo que ha cambiado
  • Controlar la visibilidad de los cambios
Con el formato changeTracking, puedes monitorear cambios en un sitio web y recibir información sobre:
  • previousScrapeAt: La marca de tiempo de la extracción anterior con la que se compara la página actual (null si no hubo una extracción previa)
  • changeStatus: El resultado de la comparación entre las dos versiones de la página
    • new: Esta página no existía o no se había descubierto antes (suele tener previousScrapeAt en null)
    • same: El contenido de esta página no ha cambiado desde la última extracción
    • changed: El contenido de esta página ha cambiado desde la última extracción
    • removed: Esta página fue eliminada desde la última extracción
  • visibility: La visibilidad de la página/URL actual
    • visible: Esta página es visible, lo que significa que su URL se descubrió por una ruta orgánica (a través de enlaces en otras páginas visibles o del sitemap)
    • hidden: Esta página no es visible, lo que significa que aún está disponible en la web, pero ya no es detectable mediante el sitemap o al rastrear el sitio. Solo podemos identificar enlaces invisibles si previamente fueron visibles y se capturaron durante un rastreo o extracción anteriores

SDKs

Uso básico

Para usar el seguimientoDeCambios, incluye ‘changeTracking’ en los formatos al hacer scraping de una URL:
const firecrawl = new Firecrawl({ apiKey: 'your-api-key' });
const result = await firecrawl.scrape('https://example.com', {
  formats: ['markdown', 'changeTracking']
});

// Accede a los datos de seguimiento de cambios
console.log(result.changeTracking)
Respuesta de ejemplo:
{
  "url": "https://firecrawl.dev",
  "markdown": "# Agentes de IA para ofrecer excelentes experiencias al cliente\n\nChatbots que encantan a tus usuarios...",
  "changeTracking": {
    "previousScrapeAt": "2025-04-10T12:00:00Z",
    "changeStatus": "modificado",
    "visibility": "visible"
  }
}

Opciones avanzadas

Puedes configurar el seguimientoDeCambios pasando un objeto en el arreglo formats:
const result = await firecrawl.scrape('https://example.com', {
  formats: [
    'markdown',
    {
      type: 'changeTracking',
      modes: ['git-diff', 'json'], // Habilita modos específicos de seguimiento de cambios
      schema: {
        type: 'object',
        properties: {
          title: { type: 'string' },
          content: { type: 'string' }
        }
      }, // Esquema para la comparación estructurada en JSON
      prompt: 'Prompt personalizado para la extracción', // Prompt personalizado opcional
      tag: 'production' // Etiqueta opcional para historiales de seguimiento de cambios separados
    }
  ]
});

// Acceder a los cambios en formato git-diff
if (result.changeTracking.diff) {
  console.log(result.changeTracking.diff.text); // Texto de diff al estilo Git
  console.log(result.changeTracking.diff.json); // Datos de diff estructurados
}

// Acceder a los cambios en la comparación JSON
if (result.changeTracking.json) {
  console.log(result.changeTracking.json.title.previous); // Título anterior
  console.log(result.changeTracking.json.title.current); // Título actual
}

Ejemplo de resultados de git diff:

 **13 de abril de 2025**
 
-**05:55:05 p. m.**
+**05:58:57 p. m.**

...

Ejemplo de resultados de comparación en JSON:

{
  "time": { 
    "previous": "2025-04-13T17:54:32Z", 
    "current": "2025-04-13T17:55:05Z" 
  }
}

Modelos de datos

La función de seguimiento de cambios incluye los siguientes modelos de datos:
interface FirecrawlDocument {
  // ... otras propiedades
  changeTracking?: {
    previousScrapeAt: string | null;
    changeStatus: "new" | "same" | "changed" | "removed";
    visibility: "visible" | "hidden";
    diff?: {
      text: string;
      json: {
        files: Array<{
          from: string | null;
          to: string | null;
          chunks: Array<{
            content: string;
            changes: Array<{
              type: string;
              normal?: boolean;
              ln?: number;
              ln1?: number;
              ln2?: number;
              content: string;
            }>;
          }>;
        }>;
      };
    };
    json?: any;
  };
}

interface ChangeTrackingFormat {
  type: 'changeTracking';
  prompt?: string;
  schema?: any;
  modes?: ("json" | "git-diff")[];
  tag?: string | null;
}

interface ScrapeParams {
  // ... otras propiedades
  formats?: Array<'markdown' | 'html' | ChangeTrackingFormat>;
}

Modos de seguimiento de cambios

La función de seguimiento de cambios admite dos modos:

Modo Git-Diff

El modo git-diff ofrece un formato de diferencias tradicional, similar a la salida de Git. Muestra los cambios línea por línea con adiciones y eliminaciones señaladas. Ejemplo de salida:
@@ -1,1 +1,1 @@
-contenido antiguo
+contenido nuevo
La representación JSON estructurada del diff incluye:
  • files: Matriz de archivos modificados (en el contexto web, normalmente solo uno)
  • chunks: Secciones de cambios dentro de un archivo
  • changes: Cambios de línea individuales con tipo (add, delete, normal)

Modo JSON

El modo json ofrece una comparación estructurada de campos específicos extraídos del contenido. Esto es útil para seguir cambios en datos concretos en lugar de en todo el contenido. Salida de ejemplo:
{
  "title": {
    "previous": "Título anterior",
    "current": "Título nuevo"
  },
  "price": {
    "previous": "$19.99",
    "current": "$24.99"
  }
}
Para utilizar el modo JSON, debes proporcionar un esquema que defina los campos que se deben extraer y comparar.

Datos importantes

Estos son algunos detalles importantes que debes conocer al usar la función de seguimiento de cambios:
  • Método de comparación: Las extracciones siempre se comparan mediante su respuesta en markdown.
    • El formato markdown también debe especificarse cuando se utiliza el formato changeTracking. Se pueden incluir otros formatos adicionalmente.
    • El algoritmo de comparación es resistente a cambios en espacios en blanco y en el orden del contenido. Actualmente se ignoran las URL de origen de iframes para mitigar captchas y antibots con URL aleatorias.
  • Coincidencia con extracciones anteriores: Las extracciones previas con las que comparar se identifican actualmente por la URL de origen, el ID del equipo, el formato markdown y el parámetro tag.
    • Para una comparación efectiva, la URL de entrada debe ser exactamente la misma que en la solicitud anterior para el mismo contenido.
    • Rastrear las mismas URL con includePaths/excludePaths diferentes producirá inconsistencias al usar changeTracking.
    • Extraer las mismas URL con includeTags/excludeTags/onlyMainContent diferentes producirá inconsistencias al usar changeTracking.
    • Las páginas comparadas también se contrastarán con extracciones previas que solo tengan el formato markdown sin el formato changeTracking.
    • Las comparaciones se limitan a tu equipo. Si extraes una URL por primera vez con tu clave de API, su changeStatus siempre será new, incluso si otros usuarios de Firecrawl ya la han extraído antes.
  • Estado Beta: Mientras esté en Beta, se recomienda monitorear el campo warning del documento resultante y manejar la posible ausencia del objeto changeTracking en la respuesta.
    • Esto puede ocurrir si la búsqueda en la base de datos para encontrar la extracción anterior con la que comparar excede el tiempo de espera.

Ejemplos

Ejemplo básico de scraping

// Solicitud
{
    "url": "https://firecrawl.dev",
    "formatos": ["markdown", "seguimientoDeCambios"]
}

// Respuesta
{
  "success": true,
  "data": {
    "markdown": "...",
    "metadata": {...},
    "seguimientoDeCambios": {
      "previousScrapeAt": "2025-03-30T15:07:17.543071+00:00",
      "changeStatus": "same",
      "visibility": "visible"
    }
  }
}

Ejemplo de rastreo

// Solicitud
{
    "url": "https://firecrawl.dev",
    "scrapeOptions": {
        "formats": ["markdown", "changeTracking"]
    }
}

Seguimiento de cambios en el precio de productos

const result = await firecrawl.scrape('https://example.com/product', {
  formats: [
    'markdown',
    {
      type: 'changeTracking',
      modes: ['json'],
      schema: {
        type: 'object',
        properties: {
          price: { type: 'string' },
          availability: { type: 'string' }
        }
      }
    }
  ]
});

if (result.changeTracking.changeStatus === 'changed') {
  console.log(`El precio cambió de ${result.changeTracking.json.price.previous} a ${result.changeTracking.json.price.current}`);
}

Monitoreo de cambios de contenido con Git-Diff

const result = await firecrawl.scrape('https://example.com/blog', {
  formats: [
    'markdown',
    { type: 'changeTracking', modes: ['git-diff'] }
  ]
});

if (result.changeTracking.changeStatus === 'changed') {
  console.log('Cambios en el contenido:');
  console.log(result.changeTracking.diff.text);
}

Facturación

La función de seguimientoDeCambios está actualmente en beta. Usar la funcionalidad básica de seguimientoDeCambios y el modo git-diff no tiene costo adicional. Sin embargo, si usas el modo json para la comparación de datos estructurados, el raspado de la página costará 5 créditos por página.