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: unReferque apunta al Content Type que sigue este Content.fields: los valores de cada campo. La clave es elapiNamedel 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 formaRefer<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 contenidos | apiName | type | localized | required |
|---|---|---|---|---|
| Nombre del producto | productName | ShortText | true | true |
| Precio | price | Long | false | false |
| Descripción | description | RichText | true | false |
| Foto | photo | Refer<Media> | false | false |
| Marca | brand | Refer | false | false |
El valor de cada campo es un mapa por Locale. La forma del valor depende de localized.
- Un campo con
localized: truepuede 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 esen-US, el precio tiene una sola claveen-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> }.latitudeva de -90 a 90 ylongitudede -180 a 180, y ambas claves son obligatorias. No admite claves distintas de las definidas, por lo que se rechazan abreviaturas comolat,lngolon.Refer: el valor es un objetoReferque apunta al destino; no se pone solo la cadena del id, sino el objetosyscompleto. Si apunta a otro Content, sutargetTypeesContent; si apunta a un Media, esMedia. La forma deReferen 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 sonRefer(Content o Media), es un arreglo de objetosRefer. 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" } }).
| Propiedad | Tipo | Descripción |
|---|---|---|
id | string | Identificador único del recurso. |
type | string | Tipo de recurso. Para Content siempre es "Content". |
space | Refer<Space> | El Space al que pertenece este Content. |
contentType | Refer<ContentType> | El Content Type que sigue este Content. |
publish | object | Puntero al estado de publicación. Véanse las claves más abajo. |
archive | object | Información de archivado. Existe solo cuando está archivado; en caso contrario la clave no aparece. Véanse las claves más abajo. |
createdBy | Refer<User> | El usuario que lo creó. |
createdAt | string (date-time) | Momento de creación. |
updatedBy | Refer<User> | El último usuario que lo modificó. |
updatedAt | string (date-time) | Momento de la última modificación. |
version | integer (≥1) | Versión del recurso. Aumenta en 1 con cada cambio: creación, modificación, publicación, anulación de publicación, archivado, etc. |
status | string (enum) | Estado de publicación. Uno de los 4 valores siguientes. |
status es uno de los 4 valores siguientes.
status | Significado |
|---|---|
Draft | En edición y aún no publicado. |
Changed | Ha sido publicado alguna vez, pero después se modificó y tiene cambios aún sin publicar. |
Published | Está publicado y no tiene cambios sin publicar. |
Archived | Está archivado. |
El objeto publish es un puntero que indica el estado de publicación. Cuando está publicado tiene todas las claves siguientes.
| Clave | Tipo | Descripción |
|---|---|---|
version | integer | El sys.version en el momento de la publicación. |
at | string (date-time) | Momento de la última publicación. |
firstAt | string (date-time) | Momento de la primera publicación. Se conserva aunque se anule la publicación. |
counter | integer | Número acumulado de publicaciones. |
by | Refer<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
statusesDraft. UnContentno 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
statuspasa aPublished. - Si se modifica tras publicarlo, su
statuspasa aChanged. Significa que hay cambios sin publicar. - Al anular la publicación, su
statusvuelve aDraft. - 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.
Documentos relacionados
- 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.
