Appi · Referencia

Content

Posts para blogs, noticias o páginas, con etiquetas, atributos personalizados y archivos adjuntos.

Un post tiene título, slug, resumen, contenido (markdown, html o texto plano), etiquetas e imagen. Además admite atributos clave-valor libres para modelar campos propios de tu sitio (autor invitado, SEO, orden, etc.).

Los endpoints públicos solo devuelven posts activos y los buscan por slug, ideales para rutas como /blog/:slug.

Posts

GET/content/posts Público

Listar posts publicados

Ordenados del más reciente al más antiguo.

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda por título o descripción.
tagsstring | string[]Filtra posts que tengan todas las etiquetas indicadas (repite el parámetro: ?tags=a&tags=b).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "mi-primer-post",
      "name": "Mi primer post",
      "description": "Resumen corto",
      "tags": ["noticias"],
      "picture": "https://…",
      "content": "# Hola mundo",
      "format": "markdown",
      "active": true,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
      "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
    }
  ]
}
GET/content/posts/:slug Público

Obtener un post por slug

Parámetros de ruta
slugrequeridostringSlug del post.
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "mi-primer-post",
  "name": "Mi primer post",
  "description": "Resumen corto",
  "tags": ["noticias"],
  "picture": "https://…",
  "content": "# Hola mundo",
  "format": "markdown",
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
}

Archivos adjuntos del usuario

Cada usuario puede subir y gestionar sus propios archivos dentro del sitio (avatares, adjuntos de actividades, etc.).

GET/content/attachments Autenticado

Listar mis archivos

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "name": "portada.png",
      "size": 204800,
      "mime": "image/png",
      "url": "https://…/portada.png",
      "createdAt": "2026-01-01T00:00:00.000Z"
    }
  ]
}
POST/content/attachments Autenticado

Subir un archivo

Cuerpo (multipart/form-data)
namerequeridostringNombre visible del archivo.
filerequeridofileMáximo 10 MB. Extensiones: jpg, png, pdf, doc, docx, xls, xlsx, zip, text, markdown.
Ejemplo (curl)
curl -X POST https://appi.droni.co/content/attachments \
  -H "x-site-id: $APPI_SITE_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -F "name=portada.png" \
  -F "file=@./portada.png"
Ejemplo de respuesta
{
  "id": "uuid",
  "name": "portada.png",
  "size": 204800,
  "mime": "image/png",
  "url": "https://…/portada.png",
  "createdAt": "2026-01-01T00:00:00.000Z"
}
  • Usa la propiedad url de la respuesta para mostrar o enlazar el archivo.
DELETE/content/attachments/:id Autenticado

Eliminar un archivo propio

Parámetros de ruta
idrequeridostringID del archivo.
Ejemplo de respuesta
{
  "id": "uuid",
  "name": "portada.png",
  "size": 204800,
  "mime": "image/png",
  "url": "https://…/portada.png",
  "createdAt": "2026-01-01T00:00:00.000Z"
}

Administración de contenido

Solo owner del sitio

Gestión completa de posts y archivos del sitio. Aquí los posts se identifican por id, no por slug, y se incluyen borradores.

Estas rutas solo responden a usuarios con rol owner. Úsalas desde un panel de administración privado, nunca desde el frontend público de tu sitio.
GET/admin/content/posts Owner del sitio

Listar todos los posts (incluye borradores)

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda por título.
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "slug": "mi-primer-post",
      "name": "Mi primer post",
      "description": "Resumen corto",
      "tags": ["noticias"],
      "picture": "https://…",
      "content": "# Hola mundo",
      "format": "markdown",
      "active": true,
      "createdAt": "2026-01-01T00:00:00.000Z",
      "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
      "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
    }
  ]
}
POST/admin/content/posts Owner del sitio

Crear un post

Cuerpo (JSON)
namerequeridostringTítulo. El slug se genera a partir de él.
descriptionrequeridostring | nullResumen.
tagsrequeridostring[] | nullEtiquetas.
picturestring | nullURL de la imagen principal.
contentstring | nullCuerpo del post.
format'markdown' | 'html' | 'plaintext'Formato del contenido.
activebooleanPublicado (true) o borrador (false).
Ejemplo de petición
{
  "name": "Lanzamiento",
  "description": "Ya está disponible",
  "tags": ["noticias"],
  "content": "# ¡Hola!",
  "format": "markdown",
  "active": false
}
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "mi-primer-post",
  "name": "Mi primer post",
  "description": "Resumen corto",
  "tags": ["noticias"],
  "picture": "https://…",
  "content": "# Hola mundo",
  "format": "markdown",
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
}
GET/admin/content/posts/:id Owner del sitio

Obtener un post por id

Parámetros de ruta
idrequeridostringID del post.
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "mi-primer-post",
  "name": "Mi primer post",
  "description": "Resumen corto",
  "tags": ["noticias"],
  "picture": "https://…",
  "content": "# Hola mundo",
  "format": "markdown",
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
}
PUT/admin/content/posts/:id Owner del sitio

Actualizar un post

Todos los campos son opcionales.

Parámetros de ruta
idrequeridostringID del post.
Cuerpo (JSON)
namestringTítulo. El slug se genera a partir de él.
descriptionstring | nullResumen.
tagsstring[] | nullEtiquetas.
picturestring | nullURL de la imagen principal.
contentstring | nullCuerpo del post.
format'markdown' | 'html' | 'plaintext'Formato del contenido.
activebooleanPublicado (true) o borrador (false).
Ejemplo de respuesta
{
  "id": "uuid",
  "slug": "mi-primer-post",
  "name": "Mi primer post",
  "description": "Resumen corto",
  "tags": ["noticias"],
  "picture": "https://…",
  "content": "# Hola mundo",
  "format": "markdown",
  "active": true,
  "createdAt": "2026-01-01T00:00:00.000Z",
  "user": { "id": "uuid", "fullName": "Ada Lovelace", "avatar": "https://…" },
  "attributes": [{ "id": "uuid", "name": "autor_invitado", "type": "string", "value": "Grace" }]
}
DELETE/admin/content/posts/:id Owner del sitio

Eliminar un post

Parámetros de ruta
idrequeridostringID del post.
GET/admin/content/posts/:post_id/attributes Owner del sitio

Listar atributos de un post

Parámetros de ruta
post_idrequeridostringID del post.
POST/admin/content/posts/:post_id/attributes Owner del sitio

Agregar un atributo a un post

Parámetros de ruta
post_idrequeridostringID del post.
Cuerpo (JSON)
namerequeridostringClave del atributo.
valuerequeridostringValor.
typestringTipo libre para que tu frontend sepa cómo interpretarlo.
Ejemplo de petición
{ "name": "autor_invitado", "value": "Grace Hopper" }
DELETE/admin/content/posts/:post_id/attributes/:id Owner del sitio

Eliminar un atributo

Parámetros de ruta
post_idrequeridostringID del post.
idrequeridostringID del atributo.
GET/admin/content/attachments Owner del sitio

Listar todos los archivos del sitio

Query string
pagenumberPágina a consultar (por defecto 1).
per_pagenumberResultados por página (por defecto 10).
qstringBúsqueda por nombre.
Ejemplo de respuesta
{
  "meta": {
    "total": 15,
    "perPage": 10,
    "currentPage": 1,
    "lastPage": 2,
    "firstPage": 1
  },
  "data": [
    {
      "id": "uuid",
      "name": "portada.png",
      "size": 204800,
      "mime": "image/png",
      "url": "https://…/portada.png",
      "createdAt": "2026-01-01T00:00:00.000Z"
    }
  ]
}
POST/admin/content/attachments Owner del sitio

Subir un archivo al sitio

Cuerpo (multipart/form-data)
namerequeridostringNombre visible del archivo.
filerequeridofileMismas reglas que la subida de usuario (10 MB).
Ejemplo de respuesta
{
  "id": "uuid",
  "name": "portada.png",
  "size": 204800,
  "mime": "image/png",
  "url": "https://…/portada.png",
  "createdAt": "2026-01-01T00:00:00.000Z"
}
DELETE/admin/content/attachments/:id Owner del sitio

Eliminar cualquier archivo del sitio

Parámetros de ruta
idrequeridostringID del archivo.