Sync

Última actualización: 22 de junio de 2026

Sync es el endpoint de CDA que sincroniza los recursos publicados de un Space de forma incremental (delta). En lugar de volver a recibir cada vez la totalidad del Content, el Media y el Content Type publicados, el cliente recibe el conjunto completo una vez y lo almacena en caché localmente; a partir de ahí solo recibe lo que ha cambiado y lo que se ha eliminado desde la última sincronización para actualizar esa caché. Se usa para reducir el volumen de transferencia en aplicaciones que necesitan tener todo el material publicado a mano (caché sin conexión, índices de búsqueda, compilaciones de sitios estáticos, etc.).

La sincronización funciona en dos fases. Primero se recibe la totalidad con la sincronización inicial y se guarda el nextSyncUrl que viene en la respuesta. A partir de entonces se llama a la sincronización delta con el sync-token contenido en esa URL para recibir solo lo modificado y lo eliminado; la respuesta devuelve de nuevo un nuevo nextSyncUrl, así que se guarda ese valor y se repite el proceso.

Flujo de sincronización

  1. Sincronización inicial: llame con ?initial=true&type=All para recibir la totalidad del material publicado. Al final de la respuesta viene el nextSyncUrl.
  2. Guardar el nextSyncUrl: guarde tal cual el valor nextSyncUrl recibido. Dentro de esta URL está el sync-token que se usará en la siguiente llamada.
  3. Sincronización delta: vuelva a llamar con el sync-token del nextSyncUrl que guardó. La respuesta solo contiene lo que ha cambiado y lo que se ha eliminado desde la última sincronización, y al final viene un nuevo nextSyncUrl.
  4. Repetir: guarde el nuevo nextSyncUrl recibido y repita el paso 3 cada vez que necesite sincronizar.

El sync-token no es un valor que usted construya, sino un cursor opaco. No interprete su formato ni lo arme a mano; pase a la siguiente llamada, tal cual, el valor que recibió en el nextSyncUrl de la respuesta anterior.

Estructura de la respuesta

A continuación se muestra la respuesta de la sincronización inicial (type=All) de un Space de demostración. En items vienen mezcladas las entidades publicadas y los marcadores de eliminación, y al final viene el nextSyncUrl que se usará en la siguiente sincronización delta.

{
  "sys": { "type": "PageResponse" },
  "limit": 15,
  "items": [
    {
      "sys": {
        "id": "3trmXRM3RqbgSnifyg7OGhwhlqvAvq",
        "type": "Content",
        "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
        "contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
        "createdAt": "2026-06-15T15:16:12.151Z",
        "updatedAt": "2026-06-16T14:31:20.073Z",
        "revision": 3
      },
      "fields": {
        "price": { "ko-KR": 18000 },
        "description": { "ko-KR": "이중 진공 단열로 보온·보냉이 오래갑니다. 500ml 대용량." },
        "photo": {},
        "productName": { "ko-KR": "스테인리스 텀블러 500ml" }
      }
    },
    {
      "sys": {
        "id": "3trmXRM3RqbgSnifyg7O7vFALWs1GJ",
        "type": "DeletedContent",
        "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
        "contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
        "createdAt": "2026-06-15T07:34:41.522Z",
        "updatedAt": "2026-06-15T07:41:57.198Z",
        "revision": 1
      }
    }
  ],
  "links": {},
  "nextSyncUrl": "/v1/spaces/HnQ32YiH/sync?sync-token=165rWhDiuLNoYOwjVQQAYXMA7makztXnhAV3qamYU75jFldqtvaEhMnr29PqsKTAbcoy6xs0iKpafM0KsKfZ2OHtA6pmbpx2pgx5jJ6bFzrkrBvoSvXF8tYZPkbw4X7B2EpCr95lgkQv4UJVCu1SSZIeH2ewzF"
}

Claves principales:

  • sys.type: el tipo de envoltorio que envuelve la respuesta de sincronización; siempre es "PageResponse".
  • limit: el número de elementos incluidos por entrega.
  • items: el array en el que vienen mezcladas las entidades publicadas y los marcadores de eliminación. El primer elemento del ejemplo anterior es un Content vivo (con su cuerpo) y el segundo es un marcador de eliminación (DeletedContent) que viene solo con sys, sin cuerpo. Los tipos de elemento se tratan en Tipos de elemento más abajo.
  • links: el objeto de enlaces de paginación. Como Sync encadena la siguiente página y el siguiente delta mediante nextSyncUrl, este objeto puede estar vacío.
  • nextSyncUrl: la ruta que se llamará en la siguiente sincronización delta. El sync-token de esta URL se usa tal cual en la siguiente llamada.

Los fields de items vienen como un mapa de Locales sin filtrar por un único idioma. Tal como el productName del ejemplo anterior es { "ko-KR": "스테인리스 텀블러 500ml" }, el valor de cada campo viene como un mapa que contiene los valores por Locale. A diferencia de las consultas de CDA Content y CDA Media, que con el parámetro locale seleccionan el valor como un único valor, Sync no filtra por un solo idioma y baja el mapa completo tal cual. El cliente recibe este mapa, lo almacena en caché localmente y selecciona el valor del idioma que quiera cuando lo necesite. Por eso Sync no tiene parámetro locale.

Que el photo del ejemplo anterior sea {} (mapa vacío) se debe a que el Media vinculado no existe en ningún Locale.

Tipos de elemento

En items vienen mezclados elementos con distinto sys.type. A grandes rasgos hay dos vertientes: entidades vivas y marcadores de eliminación.

sys.typeCuerpo (fields)Significado
ContentPresenteContent publicado vivo. Viene con el cuerpo completo.
MediaPresenteMedia publicado vivo. Viene con el cuerpo completo.
ContentTypePresenteContent Type publicado vivo. Viene con el cuerpo completo.
DeletedContentAusenteMarcador de un Content eliminado. Viene solo con sys, sin cuerpo.
DeletedMediaAusenteMarcador de un Media eliminado. Viene solo con sys, sin cuerpo.

Un marcador de eliminación es la señal de que ese recurso ya no está en el material publicado. El cliente, al ver el sys.id del marcador, borra el elemento correspondiente de su caché local.

En la sincronización inicial, el parámetro type selecciona qué se recibe.

typeLo que se recibe
AllLos Content, Media y Content Type vivos y todos los marcadores de eliminación
ContentLos Content vivos (junto con Content Type y Media)
MediaLos Media vivos (junto con Content y Content Type)
DeletionTodos los marcadores de eliminación (DeletedContent y DeletedMedia)
DeletedContentLos marcadores de Content eliminados
DeletedMediaLos marcadores de Media eliminados

Cuando type es Content o DeletedContent, con el parámetro content-type puede limitar a solo los elementos que pertenecen a un Content Type concreto.

API

La URL base de los dos endpoints siguientes es https://cda.weegloo.com/v1, y se requiere un token Bearer que autentique en CDA en la cabecera Authorization. Ambos comparten la misma ruta GET /spaces/{spaceId}/sync y distinguen la sincronización inicial de la delta mediante parámetros de consulta. A diferencia de las consultas de Content y Media, Sync no tiene parámetro locale. Los valores vienen como un mapa de Locales tal cual.

Un items vacío significa que no ha habido cambios desde la última sincronización. También en ese caso viene un nuevo nextSyncUrl, así que guarde ese valor y úselo tal cual en la siguiente sincronización.

  • Resumen de CDA: CDA en su conjunto y el comportamiento de entrega común.
  • CDA Content: Content publicado recibido seleccionando el valor de un solo idioma mediante consulta individual.
  • CDA Locale: la lista de Locales que se usa al seleccionar valores del mapa de Locales recibido por sincronización.
  • Multilingüe (concepto): selección de valores por Locale y fallback.