API del blog

Lee los artículos, categorías y etiquetas de tu blog en Jazui para mostrarlos en tu web.

Markdown

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 <head> 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

RutaParámetrosDevuelve
GET /v2/blog/articlessite, 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, formatUn artículo completo.
GET /v2/blog/articles/by-id/{id}formatUn artículo por su identificador.
GET /v2/blog/articles/{slug}/relatedsite, lang, count (4, máx. 12)Artículos relacionados.
GET /v2/blog/categoriessite, langCategorías, también las que aún no tienen artículos.
GET /v2/blog/tagssiteEtiquetas con artículos.
GET /v2/blog/feed/{site}/rsslangRSS 2.0, sin token.
GET /v2/blog/feed/{site}/atomlangAtom 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.

Terminal
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.

Terminal
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": "<h2 id=\"que-ven-los-bots\">Qué ven los bots</h2><p>…</p>",
  "markdown": "## Qué ven los bots\n\n…",
  "markdownUrl": "https://api.jazui.com/v2/sites/misitio.com/articles/es/como-funciona-el-prerender.md",
  "head": "<title>Cómo funciona el prerender</title><meta name=\"description\" …><script type=\"application/ld+json\">…</script>",
  "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": "<div class=\"jazui-share\">…</div>"
}
  • head trae las etiquetas para el <head> 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
[
  {
    "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.

Terminal
# 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
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=.