GET /api/v1/site
Datos del sitio y plantilla activa.
Parámetros: Ninguno (solo auth).
Respuesta: data { name, slug, domain, template }
Documentación completa
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
Regístrate gratis como empresa o escritor y copia tu API key en el panel.
Embed: pegas CSS + JS. API: pides JSON y lo renders con tu diseño.
Crea categorías y posts. Solo los publicados aparecen en la API.
Llama a GET /posts con tu key. Si ves data[], la conexión está bien.
Autenticación
La API es de solo lectura. En cada petición envía la key de tu empresa:
X-Site-Key: TU_SITE_KEY?site_key=TU_SITE_KEYhttps://platform-mi-blog-listo.tinguar.com/api/v1La 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
Elige tu stack. El código cambia al instante: HTML, JS, PHP, Python, WordPress, Astro, Laravel o React/Next.
<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
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.
| Opción | ¿Obligatoria? | Descripción |
|---|---|---|
apiBase | sí | Base de la API, ej. https://platform-mi-blog-listo.tinguar.com/api/v1 |
siteKey | sí | Tu API key del panel |
listEl | sí | Selector o nodo del listado, ej. #blog-root |
detailEl | no | Selector 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étodo | Qué 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-post → bootFromQuery() carga el artículo. Demo: https://platform-mi-blog-listo.tinguar.com/embed/example.html
API
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
| Endpoint | Qué trae |
|---|---|
GET /api/v1/site | Sitio + plantilla |
GET /api/v1/posts | Listado paginado |
GET /api/v1/posts/{slug} | Artículo publicado |
GET /api/v1/categories | Categorías |
<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>// 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 -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
Forma típica de GET /posts y GET /posts/{slug}.
{
"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": {}
}
}{
"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
Todos los campos que expone la API hoy.
| Campo | Descripción | Dónde |
|---|---|---|
title | Título | listado + detalle |
subtitle | Subtítulo opcional | listado + detalle |
slug | Identificador para /blog/{slug} o ?slug= | listado + detalle |
excerpt | Resumen corto | listado + detalle |
content | HTML del cuerpo | solo detalle |
cover_image | URL de portada (o null) | listado + detalle |
cover_layout | Disposición de portada (ej. below) | listado + detalle |
cover_size | Tamaño de portada (ej. full) | listado + detalle |
is_featured | true si está destacado | listado + detalle |
view_count | Visualizaciones del artículo (se incrementa al abrir el detalle) | listado + detalle |
reading_minutes | Minutos estimados de lectura | listado + detalle |
published_at | Fecha ISO 8601 | listado + detalle |
published_label | Fecha legible para UI | listado + detalle |
author.name | Nombre del autor | listado + detalle |
category.name | Nombre de categoría | listado + detalle |
category.slug | Slug de categoría (filtro) | listado + detalle |
meta_title | Título SEO | solo detalle |
meta_description | Descripción SEO | solo detalle |
Errores
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 FoundEn tu sitio
tudominio.com/blogtudominio.com/blog?slug=mi-posttudominio.com/blog/mi-post (tú haces el routing y pides /posts/mi-post)Notas
Crea tu cuenta gratis, copia la API key y sigue el ejemplo de tu lenguaje. Si no puedes solo, hay ayuda a precio accesible.