API de entrega headless
Esta es una referencia para desarrolladores. Si estás configurando un espacio headless por primera vez, comienza con Crear un espacio headless.
Cada espacio headless sirve sus entradas publicadas desde una API de lectura pública, cacheable en CDN. No requiere autenticación ni clave de API — la API devuelve solo entradas publicadas (los borradores y las entradas programadas nunca aparecen), y un blog es público por definición.
La URL base de tu espacio — incluidos los identificadores de workspace y sitio — se muestra en la página Delivery API del sitio en el portal de cliente, junto con URLs de feed listas para usar por idioma. Todas las rutas que se indican a continuación son relativas a esa base.
Endpoints
| Ruta | Devuelve |
|---|---|
GET /posts | Entradas publicadas, las más recientes primero (solo campos de resumen) |
GET /posts/{slug} | Una entrada publicada, contrato completo (ver más abajo) |
GET /terms | Categorías y etiquetas con recuento de entradas |
Parámetros de consulta (/posts)
| Parámetro | Descripción |
|---|---|
language | Entradas en un idioma (p. ej. de). Cada idioma es un blog separado — una campaña por idioma. |
category | Filtrar por slug de categoría. Mutuamente exclusivo con tag. |
tag | Filtrar por slug de etiqueta. Mutuamente exclusivo con category. |
cursor | Página siguiente (más antigua) — pasa el nextCursor de la respuesta anterior. |
before | Página anterior (más reciente) — pasa el prevCursor de la respuesta. |
limit | Elementos por página; valor predeterminado y máximo 50. |
language se combina con category o tag:
/posts?language=de&category=news es el archivo “News” del blog en alemán.
/terms?language=de aplica el mismo ámbito a la taxonomía.
Paginación
Las respuestas de lista son bidireccionales: cada una devuelve nextCursor
(hacia entradas más antiguas) y prevCursor (hacia entradas más recientes).
Un cursor null significa que no hay más páginas en esa dirección — renderiza
cada página únicamente a partir de su token de URL, sin necesidad de mantener
un historial de cursores.
Contrato de respuesta de entrada individual
GET /posts/{slug} devuelve { post } con:
id,slug,title,excerpt— identidad y texto de resumen.html— el contenido renderizado y saneado. Los enlaces relativos a la raíz se convierten en absolutos tomando como referencia la URL pública de tu sitio. Se puede inyectar tal cual: lista de etiquetas permitidas estricta, sin atributos<script>/<style>/on*.blocks— el array de bloques estructurado, si prefieres renderizar en lugar de inyectarhtml.metaTitle,metaDescription,keyphrase,categories,tags.featuredImage,bodyImage—{ url, width, height, alt?, caption? }.og—{ title, description, image }, listo para etiquetas Open Graph.schema— un array de objetos JSON-LD de schema.org (HowTo,FAQPage) cuando la entrada contiene esas secciones;[]en caso contrario. Se entrega fuera de banda porque el saneador del contenido elimina<script>— emite un<script type="application/ld+json">por entrada en el<head>de tu página para ser elegible para resultados enriquecidos. Las secciones correspondientes del contenido llevan las clasesstructura-howto/structura-faqpara el estilo.publishedAt,updatedAt— ISO 8601.updatedAtes tu señal de revalidación.
La respuesta de lista devuelve solo el subconjunto de resumen — sin html,
blocks ni schema.
Consumo desde un framework
Realiza la solicitud en el momento de la compilación o la revalidación y trata la API como tu CMS: