Documentación completa

Cómo integrarlo a tu proyecto

Referencia completa de Blog Listo: auth, kit embed, endpoints, JSON de respuesta, campos, errores y ejemplos por lenguaje. Todo en esta página, con el mismo diseño de la web informativa.

Inicio rápido

De cero a /blog

  1. 01

    Crea tu cuenta

    Regístrate gratis como empresa o escritor y copia tu API key en el panel.

  2. 02

    Elige API o embed

    Embed: pegas CSS + JS. API: pides JSON y lo renders con tu diseño.

  3. 03

    Publica contenido

    Crea categorías y posts. Solo los publicados aparecen en la API.

  4. 04

    Prueba /blog

    Llama a GET /posts con tu key. Si ves data[], la conexión está bien.

Autenticación

Tu API key

La API es de solo lectura. En cada petición envía la key de tu empresa:

  • Header recomendado: X-Site-Key: TU_SITE_KEY
  • Query alternativa: ?site_key=TU_SITE_KEY
  • Base actual: https://platform-mi-blog-listo.tinguar.com/api/v1

La key la obtienes al crear tu cuenta o empresa en el panel. En los ejemplos usa TU_SITE_KEY hasta copiar la tuya.

Por lenguaje

Ejemplos listos para pegar

Elige tu stack. El código cambia al instante: HTML, JS, PHP, Python, WordPress, Astro, Laravel o React/Next.

blog.html html

Embed en cualquier HTML

Lo más rápido: pegas CSS + JS en tu página /blog. No importa si el sitio es PHP, WordPress o estático.

<link rel="stylesheet" href="https://platform-mi-blog-listo.tinguar.com/embed/blog-templates.css" />
<div id="blog-root"></div>
<script src="https://platform-mi-blog-listo.tinguar.com/embed/blog-client.js"></script>
<script>
  BlogPlatform.create({
    apiBase: 'https://platform-mi-blog-listo.tinguar.com/api/v1',
    siteKey: 'TU_SITE_KEY',
    listEl: '#blog-root',
  }).bootFromQuery();
</script>

Kit embed

BlogPlatform.create

Archivos públicos del panel: https://platform-mi-blog-listo.tinguar.com/embed/blog-templates.css y https://platform-mi-blog-listo.tinguar.com/embed/blog-client.js. Ideal si quieres listado + detalle sin armar el front desde cero.

Opciones de create()

Opción¿Obligatoria?Descripción
apiBaseBase de la API, ej. https://platform-mi-blog-listo.tinguar.com/api/v1
siteKeyTu API key del panel
listElSelector o nodo del listado, ej. #blog-root
detailElnoSelector o nodo del detalle; si no hay, usa listEl

El kit embed muestra un spinner de carga mientras pide la API. Si integras solo con JSON (sin el kit), tú decides el loading en tu front. Las lecturas del detalle se acumulan en view_count y se ven en el panel de posts.

Métodos que devuelve

MétodoQué hace
bootFromQuery()Si la URL tiene ?slug=mi-post muestra detalle; si no, el listado. Muestra spinner de carga mientras pide la API.
renderList()Pinta el listado (con filtro Todos / Destacados). Incluye estado de carga con spinner.
renderPost(slug)Pinta el detalle de un slug. Al cargar el detalle se cuenta 1 visualización.
api(path)Fetch interno a la API con tu site key.

Detalle con query: /blog?slug=mi-primer-postbootFromQuery() carga el artículo. Demo: https://platform-mi-blog-listo.tinguar.com/embed/example.html

API

Endpoints

Lectura pública por site key. Úsalo con fetch, axios, curl, Guzzle, requests… lo que ya uses.

GET /api/v1/site

Datos del sitio y plantilla activa.

Parámetros: Ninguno (solo auth).

Respuesta: data { name, slug, domain, template }

GET /api/v1/posts

Listado paginado de posts publicados.

Parámetros: page (número), per_page (1–50, default 12), category (slug), featured (1|true)

Respuesta: data[], meta { paginación + stats }, template

GET /api/v1/posts/{slug}

Detalle de un artículo publicado. Cada lectura suma 1 a view_count (visible en el panel).

Parámetros: slug en la URL.

Respuesta: data (listado + content, meta_title, meta_description, view_count), template

GET /api/v1/categories

Categorías del sitio con conteo de posts.

Parámetros: Ninguno (solo auth).

Respuesta: data[] { name, slug, posts_count }

Auth: X-Site-Key o ?site_key= · Basehttps://platform-mi-blog-listo.tinguar.com/api/v1

EndpointQué trae
GET /api/v1/siteSitio + plantilla
GET /api/v1/postsListado paginado
GET /api/v1/posts/{slug}Artículo publicado
GET /api/v1/categoriesCategorías
Embed HTML
<link rel="stylesheet" href="https://platform-mi-blog-listo.tinguar.com/embed/blog-templates.css" />
<div id="blog-root"></div>
<script src="https://platform-mi-blog-listo.tinguar.com/embed/blog-client.js"></script>
<script>
  BlogPlatform.create({
    apiBase: 'https://platform-mi-blog-listo.tinguar.com/api/v1',
    siteKey: 'TU_SITE_KEY',
    listEl: '#blog-root',
  }).bootFromQuery();
</script>
Fetch / cualquier lenguaje
// Cualquier front con fetch
const res = await fetch('https://platform-mi-blog-listo.tinguar.com/api/v1/posts', {
  headers: { 'X-Site-Key': 'TU_SITE_KEY' },
});

const data = await res.json();
console.log(data);
cURL
curl -H "X-Site-Key: TU_SITE_KEY" \
  "https://platform-mi-blog-listo.tinguar.com/api/v1/posts"

Demo embed:https://platform-mi-blog-listo.tinguar.com/embed/example.html

Contrato JSON

Ejemplos de respuesta

Forma típica de GET /posts y GET /posts/{slug}.

GET /posts (listado)
{
  "data": [
    {
      "title": "Mi primer post",
      "subtitle": null,
      "slug": "mi-primer-post",
      "excerpt": "Resumen…",
      "cover_image": "https://…/cover.jpg",
      "cover_layout": "below",
      "cover_size": "full",
      "is_featured": false,
      "view_count": 42,
      "reading_minutes": 3,
      "published_at": "2026-08-10T12:00:00+00:00",
      "published_label": "10 ago 2026",
      "author": { "name": "Ana" },
      "category": { "name": "Noticias", "slug": "noticias" }
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 1,
    "per_page": 12,
    "total": 1,
    "stats": { "articles": 1, "categories": 1, "featured": 0 }
  },
  "template": {
    "key": "classic",
    "name": "Classic",
    "config": {}
  }
}
GET /posts/{slug} (detalle)
{
  "data": {
    "title": "Mi primer post",
    "slug": "mi-primer-post",
    "excerpt": "Resumen…",
    "content": "<p>HTML del artículo…</p>",
    "meta_title": "Mi primer post",
    "meta_description": "Resumen…",
    "cover_image": "https://…/cover.jpg",
    "view_count": 43,
    "author": { "name": "Ana" },
    "category": { "name": "Noticias", "slug": "noticias" }
  },
  "template": { "key": "classic", "name": "Classic", "config": {} }
}

Datos

Campos de un post

Todos los campos que expone la API hoy.

CampoDescripciónDónde
titleTítulolistado + detalle
subtitleSubtítulo opcionallistado + detalle
slugIdentificador para /blog/{slug} o ?slug=listado + detalle
excerptResumen cortolistado + detalle
contentHTML del cuerposolo detalle
cover_imageURL de portada (o null)listado + detalle
cover_layoutDisposición de portada (ej. below)listado + detalle
cover_sizeTamaño de portada (ej. full)listado + detalle
is_featuredtrue si está destacadolistado + detalle
view_countVisualizaciones del artículo (se incrementa al abrir el detalle)listado + detalle
reading_minutesMinutos estimados de lecturalistado + detalle
published_atFecha ISO 8601listado + detalle
published_labelFecha legible para UIlistado + detalle
author.nameNombre del autorlistado + detalle
category.nameNombre de categoríalistado + detalle
category.slugSlug de categoría (filtro)listado + detalle
meta_titleTítulo SEOsolo detalle
meta_descriptionDescripción SEOsolo detalle

Errores

Códigos habituales

HTTP 401 — Falta la key

{ "message": "Missing site_key. Send X-Site-Key header or site_key query param." }

HTTP 401 — Key inválida o sitio inactivo

{ "message": "Invalid or inactive site key." }

HTTP 404 — Post no existe o no está publicado

Respuesta estándar Laravel Not Found

En tu sitio

Rutas recomendadas

  • Listado: tudominio.com/blog
  • Detalle con embed: tudominio.com/blog?slug=mi-post
  • Detalle con API propia: tudominio.com/blog/mi-post (tú haces el routing y pides /posts/mi-post)
  • Sin subdominio ni marca ajena: el blog vive bajo tu dominio.

Notas

Importante al integrar

  • Solo posts con estado publicado salen en la API. Los borradores no.
  • La API es de solo lectura: crear/editar posts se hace en el panel.
  • Si recibes 401, revisa X-Site-Key o ?site_key= y que el sitio esté active.
  • CORS: desde el navegador, tu dominio debe poder llamar a la API del panel.
  • Plantillas del sitio (classic, magazine, minimal): vienen en template.key del JSON; el embed aplica la clase bp-{key}.
  • per_page máximo es 50. Por defecto son 12.
  • featured=1 o featured=true solo trae posts destacados.
  • category=slug-de-categoria filtra el listado.
  • Kit embed: ya incluye efecto de carga (spinner + texto). Si usas solo la API, el loading lo pones tú en tu front.
  • Visualizaciones: cada GET /posts/{slug} suma 1 a view_count. El panel muestra el total en la lista y al editar el post.
  • Demo local del embed: https://platform-mi-blog-listo.tinguar.com/embed/example.html

¿Listo para probarlo?

Crea tu cuenta gratis, copia la API key y sigue el ejemplo de tu lenguaje. Si no puedes solo, hay ayuda a precio accesible.