Content

Última actualización: 3 de julio de 2026

Un Content es un único dato real generado a partir de un Content Type (la plantilla). Tomando como ejemplo una tienda de ropa en línea, el Content Type "Producto" define la composición de campos como el nombre del producto, el precio y la descripción detallada, y un único "스테인리스 텀블러 500ml" es un Content que sigue esa plantilla.

Un Content se compone de dos partes. En fields están los valores reales de cada campo, y en sys está el estado: publicación, versión, archivado, etc. En CMA, Content es un recurso secundario de Space; las rutas de consulta y eliminación se basan en /spaces/{spaceId}/contents, y las de creación y modificación, en /spaces/{spaceId}/content-types/{contentTypeId}/contents, que está bajo el Content Type. Las operaciones de gestión se realizan en CMA, y la instantánea publicada se entrega a través de CDA.

Estructura del recurso

A continuación se muestra la respuesta de consulta individual del Content publicado "스테인리스 텀블러 500ml". Junto con sys (propiedades del sistema), tiene fields (valores de los campos) y metadata (información adicional como las etiquetas).

{
  "sys": {
    "id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP",
    "type": "Content",
    "space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
    "contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
    "publish": {
      "version": 1,
      "at": "2026-06-18T09:51:44.128Z",
      "firstAt": "2026-06-18T09:51:44.128Z",
      "counter": 1,
      "by": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } }
    },
    "createdBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
    "createdAt": "2026-06-18T09:51:14.597Z",
    "updatedBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
    "updatedAt": "2026-06-18T09:51:44.128Z",
    "version": 2,
    "status": "Published"
  },
  "fields": {
    "price": { "en-US": 18000 },
    "productName": { "en-US": "Stainless Tumbler 500ml", "ko-KR": "스테인리스 텀블러 500ml" }
  },
  "metadata": { "tags": [] }
}

Claves principales:

  • sys.id: identificador único del Content. Se inserta en el {contentId} de las rutas de consulta individual, modificación, eliminación y publicación.
  • sys.contentType: un Refer que apunta al Content Type que sigue este Content.
  • fields: los valores de cada campo. La clave es el apiName del campo y el valor es un mapa por Locale. Se explica más abajo en La clave de fields es apiName.
  • metadata.tags: la lista de Tag asignados a este Content. Cada elemento tiene la forma Refer<Tag>, pero si no hay etiquetas es un array vacío [].

La clave de fields es apiName

Las claves del objeto fields son el apiName de cada campo. No son el id interno del Content Type ni el nombre del campo que aparece en el estudio de contenidos (por ejemplo, Nombre del producto). Por lo tanto, al crear o leer un Content hay que usar como clave el apiName definido en el Content Type.

La correspondencia entre los campos del Content Type de demostración "Producto" y su apiName es la siguiente.

Nombre en estudio de contenidosapiNametypelocalizedrequired
Nombre del productoproductNameShortTexttruetrue
PreciopriceLongfalsefalse
DescripcióndescriptionRichTexttruefalse
FotophotoRefer<Media>falsefalse
MarcabrandReferfalsefalse

El valor de cada campo es un mapa por Locale. La forma del valor depende de localized.

  • Un campo con localized: true puede tener varios valores por Locale, con la forma { "<locale>": valor }. Por ejemplo: "productName": { "en-US": "Stainless Tumbler 500ml", "ko-KR": "스테인리스 텀블러 500ml" }.
  • Un campo con localized: false (campo no dependiente del Locale) admite un valor solo bajo una clave: la del Locale predeterminado del Space. No se pueden añadir otras claves de Locale. Como el Locale predeterminado del Space de demostración es en-US, el precio tiene una sola clave en-US, como en "price": { "en-US": 18000 }.

Cuál es el Locale predeterminado, hasta qué Locale hay que rellenar un campo required y las reglas de fallback cuando no hay valor se tratan en Multilingüe (concepto).

Forma del valor según el tipo

La forma del valor que va dentro de la clave de Locale depende del type del campo. La mayoría de los tipos contienen directamente el valor de ese tipo (los tipos de texto, una cadena; Number y Long, un número; Boolean, true/false). Los tipos cuya forma de objeto o de arreglo se presta más a confusión son los siguientes.

  • Location: es un objeto { "latitude": <número>, "longitude": <número> }. latitude va de -90 a 90 y longitude de -180 a 180, y ambas claves son obligatorias. No admite claves distintas de las definidas, por lo que se rechazan abreviaturas como lat, lng o lon.
  • Refer: el valor es un objeto Refer que apunta al destino; no se pone solo la cadena del id, sino el objeto sys completo. Si apunta a otro Content, su targetType es Content; si apunta a un Media, es Media. La forma de Refer en sí se define en la forma Refer de las propiedades del sistema (sys).
  • Array: es un arreglo JSON que contiene valores del tipo de sus elementos. Si los elementos son texto, es un arreglo de cadenas; si los elementos son Refer (Content o Media), es un arreglo de objetos Refer. No es un arreglo de cadenas de id.

A continuación se muestran ejemplos de los valores que van dentro de fields (cuando el Locale predeterminado del Space es en-US).

{
  "location": { "en-US": { "latitude": 37.5662, "longitude": 126.9910 } },
  "tags": { "en-US": ["Novedad", "Edición limitada"] },
  "photo": { "en-US": { "sys": { "type": "Refer", "id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP", "targetType": "Media" } } },
  "photos": { "en-US": [ { "sys": { "type": "Refer", "id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP", "targetType": "Media" } } ] }
}

Propiedades del sistema (sys)

Todo Content incluye las propiedades comunes del sistema en el objeto sys. space, contentType, createdBy y updatedBy se incluyen con la forma Refer ({ "sys": { "id", "type": "Refer", "targetType" } }).

PropiedadTipoDescripción
idstringIdentificador único del recurso.
typestringTipo de recurso. Para Content siempre es "Content".
spaceRefer<Space>El Space al que pertenece este Content.
contentTypeRefer<ContentType>El Content Type que sigue este Content.
publishobjectPuntero al estado de publicación. Véanse las claves más abajo.
archiveobjectInformación de archivado. Existe solo cuando está archivado; en caso contrario la clave no aparece. Véanse las claves más abajo.
createdByRefer<User>El usuario que lo creó.
createdAtstring (date-time)Momento de creación.
updatedByRefer<User>El último usuario que lo modificó.
updatedAtstring (date-time)Momento de la última modificación.
versioninteger (≥1)Versión del recurso. Aumenta en 1 con cada cambio: creación, modificación, publicación, anulación de publicación, archivado, etc.
statusstring (enum)Estado de publicación. Uno de los 4 valores siguientes.

status es uno de los 4 valores siguientes.

statusSignificado
DraftEn edición y aún no publicado.
ChangedHa sido publicado alguna vez, pero después se modificó y tiene cambios aún sin publicar.
PublishedEstá publicado y no tiene cambios sin publicar.
ArchivedEstá archivado.

El objeto publish es un puntero que indica el estado de publicación. Cuando está publicado tiene todas las claves siguientes.

ClaveTipoDescripción
versionintegerEl sys.version en el momento de la publicación.
atstring (date-time)Momento de la última publicación.
firstAtstring (date-time)Momento de la primera publicación. Se conserva aunque se anule la publicación.
counterintegerNúmero acumulado de publicaciones.
byRefer<User>El último usuario que lo publicó.

Al anular la publicación, de publish desaparecen version, at y by, y solo quedan firstAt y counter. Si nunca se ha publicado, publish es { "counter": 0 }.

El objeto archive existe solo cuando está archivado. Si está archivado tiene version (el sys.version en el momento del archivado), at (momento del archivado) y by (el usuario que lo archivó); si no está archivado, la propia clave archive no aparece.

El sys.version y todos los valores de fecha y hora del ejemplo de abajo son los del momento real de la llamada, y cambian en cada llamada.

Publicación, versión y concurrencia

El ciclo de vida de un Content es el siguiente.

  • Al crearlo, su status es Draft. Un Content no se publica automáticamente al crearse. En esto se diferencia del Content Type. El Content Type se publica automáticamente al crearse, pero un Content necesita una llamada de publicación aparte para entrar en la ruta de entrega.
  • Al publicarlo, su status pasa a Published.
  • Si se modifica tras publicarlo, su status pasa a Changed. Significa que hay cambios sin publicar.
  • Al anular la publicación, su status vuelve a Draft.
  • Para archivarlo, primero hay que anular la publicación. Un Content en estado publicado no se puede archivar directamente.

sys.version aumenta en 1 con cada cambio.

Las solicitudes de modificación, modificación parcial, publicación, anulación de publicación, archivado y desarchivado deben incluir en la cabecera x-weegloo-version el sys.version actual. Si este valor falta o no coincide con la versión actual, se considera un conflicto de modificación concurrente y la solicitud se rechaza. Las solicitudes de creación y eliminación no llevan esta cabecera. Las transiciones de estado como publicación, anulación de publicación, archivado y desarchivado no tienen cuerpo de solicitud.

API

La URL base de todos los endpoints siguientes es https://cma.weegloo.com/v1, y en la cabecera Authorization se necesita un token Bearer que autentique en CMA. Las operaciones de modificación, modificación parcial, publicación, anulación de publicación, archivado y desarchivado deben enviar además la cabecera X-Weegloo-Version (el sys.version actual del recurso) para el control optimista de concurrencia.

Cuando filtras u ordenas la lista plana (GET /spaces/{spaceId}/contents) por fields.*, hay que indicar también el Content Type con sys.contentType.sys.id={contentTypeId}. La forma contentType={contentTypeId} no lo sustituye. La ruta /content-types/{contentTypeId}/contents lleva el Content Type indicado en la ruta, así que no hace falta indicarlo aparte.

  • Content Type: la plantilla de este Content (definición de campos y apiName).
  • CDA Content: entrega (lectura) del Content publicado a los visitantes.
  • Tag: etiquetas de clasificación que se asignan en metadata.tags.
  • Multilingüe (concepto): Locale predeterminado, rellenado obligatorio y fallback.