# API del blog > Lee los artículos, categorías y etiquetas de tu blog en Jazui para mostrarlos en tu web. Página original: https://docs.jazui.com/api/blog/es Escribes en el blog desde el panel de Jazui y lo muestras en tu web con esta API, con tu propio diseño. Cada artículo trae su HTML, su versión en Markdown, el `` completo para SEO (título, descripción, canonical, hreflang, Open Graph y datos estructurados), el índice, las traducciones y los enlaces para compartir. Usa el **PUBLIC Token**: es de solo lectura y se puede poner en el navegador. La API admite peticiones desde cualquier dominio (CORS), solo de lectura. ## Direcciones | Ruta | Parámetros | Devuelve | |---|---|---| | `GET /v2/blog/articles` | `site`, `lang`, `category`, `tag`, `q`, `page` (1), `pageSize` (10, máx. 50) | Página de resúmenes, del más reciente al más antiguo. | | `GET /v2/blog/articles/{slug}` | `site`, `lang`, `format` | Un artículo completo. | | `GET /v2/blog/articles/by-id/{id}` | `format` | Un artículo por su identificador. | | `GET /v2/blog/articles/{slug}/related` | `site`, `lang`, `count` (4, máx. 12) | Artículos relacionados. | | `GET /v2/blog/categories` | `site`, `lang` | Categorías, también las que aún no tienen artículos. | | `GET /v2/blog/tags` | `site` | Etiquetas con artículos. | | `GET /v2/blog/feed/{site}/rss` | `lang` | RSS 2.0, sin token. | | `GET /v2/blog/feed/{site}/atom` | `lang` | Atom 1.0, sin token. | `site` es el dominio del sitio (`misitio.com`; se aceptan también `https://`, mayúsculas y rutas, que se quitan). Si gestionas varios sitios, ponlo siempre: así cada web solo ve sus artículos. Solo se devuelven artículos **publicados** o programados cuya fecha ya ha pasado. ## Listado `category` incluye también las subcategorías; `q` busca en el título, el resumen, las etiquetas y el contenido. ```bash curl -H "Authorization: Bearer $JAZUI_PUBLIC_TOKEN" \ "https://api.jazui.com/v2/blog/articles?site=misitio.com&lang=es&category=guias&page=1&pageSize=10" ``` ```json { "items": [ { "id": "7c1d0e2f-…", "slug": "como-funciona-el-prerender", "url": "https://misitio.com/blog/como-funciona-el-prerender", "site": "misitio.com", "language": "es", "title": "Cómo funciona el prerender", "summary": "Qué ven los bots de una SPA y cómo servirles el HTML completo.", "author": "Ana Pérez", "coverUrl": "https://api.jazui.com/Upload/Blog/…/portada.webp", "publishedDate": "2026-11-02T10:00:00Z", "updatedDate": "2026-11-03T08:15:00Z", "readingMinutes": 6, "categories": [{ "slug": "guias", "name": "Guías" }], "tags": [{ "slug": "seo", "name": "SEO" }] } ], "page": 1, "pageSize": 10, "totalItems": 24, "totalPages": 3 } ``` ## Un artículo `format` decide qué contenido viene: `html` (por defecto), `md` (solo Markdown) o `both`. `markdownUrl` viene siempre: es la versión Markdown pública del artículo, pensada para la IA. ```bash curl -H "Authorization: Bearer $JAZUI_PUBLIC_TOKEN" \ "https://api.jazui.com/v2/blog/articles/como-funciona-el-prerender?site=misitio.com&lang=es&format=both" ``` ```json { "id": "7c1d0e2f-…", "slug": "como-funciona-el-prerender", "url": "https://misitio.com/blog/como-funciona-el-prerender", "title": "Cómo funciona el prerender", "html": "

Qué ven los bots

…

", "markdown": "## Qué ven los bots\n\n…", "markdownUrl": "https://api.jazui.com/v2/sites/misitio.com/articles/es/como-funciona-el-prerender.md", "head": "Cómo funciona el prerender", "wordCount": 1240, "tableOfContents": [{ "level": 2, "id": "que-ven-los-bots", "text": "Qué ven los bots" }], "translations": [{ "language": "en", "slug": "how-prerendering-works", "url": "https://misitio.com/blog/how-prerendering-works" }], "metaTitle": "Cómo funciona el prerender | Mi sitio", "metaDescription": "Qué ven los bots de una SPA y cómo servirles el HTML completo.", "canonical": "https://misitio.com/blog/como-funciona-el-prerender", "socialImage": "https://api.jazui.com/Upload/Blog/…/portada.webp", "noIndex": false, "share": [{ "network": "linkedin", "name": "LinkedIn", "url": "https://www.linkedin.com/sharing/share-offsite/?url=…" }], "shareHtml": "
…
" } ``` - `head` trae las etiquetas para el `` de tu página del artículo: inclúyelas tal cual para que buscadores, redes e IA lo entiendan. - `tableOfContents` son los títulos `h2` y `h3` con su `id`, para un índice con enlaces. - `translations` lleva el mismo artículo en otros idiomas. - Si tu plan lleva la insignia en los artículos, el HTML termina con «Publicado con Jazui». ## Categorías y etiquetas Las categorías vienen ordenadas por su orden y su nombre, con `parentSlug` para las subcategorías y `articleCount`. Las etiquetas solo aparecen si tienen artículos. `GET /v2/blog/categories`: ```json [ { "slug": "guias", "name": "Guías", "description": "Paso a paso para sacar partido a tu web.", "icon": null, "language": "es", "site": "misitio.com", "order": 1, "parentSlug": null, "articleCount": 12 } ] ``` ## RSS y Atom Los 20 artículos más recientes de un sitio verificado, con el contenido completo. No necesitan token. ```bash # Sin token: para lectores de RSS y agregadores curl https://api.jazui.com/v2/blog/feed/misitio.com/rss?lang=es curl https://api.jazui.com/v2/blog/feed/misitio.com/atom?lang=es ``` ## Desde el navegador Un ejemplo mínimo con `fetch`. Si tu web es una SPA, recuerda que los bots ven el blog gracias a tu integración de Jazui: `blog.js`: ```javascript const API = 'https://api.jazui.com/v2/blog'; const TOKEN = 'TU_PUBLIC_TOKEN'; // solo lectura: se puede usar en el navegador async function articulos(pagina = 1) { const url = `${API}/articles?site=misitio.com&lang=es&page=${pagina}&pageSize=9`; const response = await fetch(url, { headers: { Authorization: `Bearer ${TOKEN}` } }); if (!response.ok) throw new Error(`Blog: ${response.status}`); return response.json(); // { items, page, pageSize, totalItems, totalPages } } async function articulo(slug) { const url = `${API}/articles/${encodeURIComponent(slug)}?site=misitio.com&lang=es`; const response = await fetch(url, { headers: { Authorization: `Bearer ${TOKEN}` } }); if (response.status === 404) return null; const data = await response.json(); document.head.insertAdjacentHTML('beforeend', data.head); // título, metas y JSON-LD return data; } ``` ## Caché Cada respuesta lleva un `ETag`. Envíalo en `If-None-Match` y recibirás `304` sin cuerpo si nada ha cambiado. Los feeds se pueden guardar 15 minutos. ## Errores - `404 not_found`: el artículo no existe o no está publicado. - `400 ambiguous`: hay artículos con ese `slug` en varios sitios; añade `?site=`.