Datos estructurados con JSON-LD y schema.org
En esta lección
Cuando lees la ficha de un taller, entiendes enseguida que “14 de noviembre” es la fecha, “35 €” el precio y “Santander” el lugar. Un buscador no lo tiene tan claro: ve texto. Los datos estructurados son una forma de decirle, en un formato que una máquina entiende sin dudas, qué es cada cosa. Con ellos Google puede mostrar tu página con resultados enriquecidos: estrellas, precio, fechas de eventos, la ruta de la página… En esta lección aprenderás a escribirlos con JSON-LD y el vocabulario de schema.org, los tipos más útiles y cómo comprobar que están bien.
Lo básico del SEO (título, descripción, encabezados, URLs) está en SEO en HTML. Esto es el siguiente paso.
Qué son los datos estructurados
Son información sobre el contenido de la página escrita con un vocabulario común. Ese vocabulario es schema.org, un proyecto que mantienen juntos Google, Microsoft, Yahoo y Yandex. Define cientos de tipos (Event, Product, Recipe, Organization…) y, para cada uno, sus propiedades (name, startDate, price…).
Para qué sirven:
- Resultados enriquecidos (rich results): el enlace a tu página en Google aparece con información extra, como el precio y la disponibilidad de un producto o la fecha y el lugar de un evento. Llaman más la atención que un enlace normal.
- Que el buscador entienda mejor tu página: quién es la organización, cuál es su logo, qué artículo escribió quién y cuándo.
- Otros sistemas también los leen: algunos asistentes de voz, agregadores de eventos, comparadores de precios, herramientas de inteligencia artificial que resumen páginas.
Nota: los datos estructurados no garantizan un resultado enriquecido ni te suben puestos por sí solos. Google decide cuándo mostrarlos. Lo que sí es seguro es que, sin ellos, no hay resultado enriquecido.
JSON-LD: el formato recomendado
Hay tres formas de escribir datos estructurados en HTML: JSON-LD, microdata y RDFa. Google recomienda JSON-LD porque va separado del HTML visible, en un bloque <script>:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Rocódromo La Fisura",
"url": "https://www.lafisura.es",
"logo": "https://www.lafisura.es/img/logo.png"
}
</script>
Las piezas:
type="application/ld+json": el navegador no ejecuta este script; lo deja ahí para quien lo quiera leer. No se ve en la página.- El contenido es JSON puro: claves y textos entre comillas dobles, sin comas al final, sin comentarios. Si tienes dudas con el formato, repasa JSON.
"@context": "https://schema.org": indica qué vocabulario usas."@type": el tipo de cosa que describes.- El resto son propiedades del tipo.
Puedes ponerlo en el <head> o en el <body>; funciona igual. Y puedes tener varios bloques en la misma página.
Objetos dentro de objetos
Muchas propiedades no son un texto, sino otra “cosa” con su propio tipo. Por ejemplo, el autor de un artículo es una Person, y la dirección de un lugar, una PostalAddress:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Rocódromo La Fisura",
"telephone": "+34 942 000 000",
"address": {
"@type": "PostalAddress",
"streetAddress": "Calle del Muro 12",
"postalCode": "39001",
"addressLocality": "Santander",
"addressCountry": "ES"
},
"openingHours": ["Mo-Fr 10:00-22:30", "Sa-Su 10:00-14:00"]
}
LocalBusiness es un tipo más concreto de Organization para negocios con local físico: un gimnasio, una tienda, un restaurante. Incluso hay tipos más concretos aún, como SportsActivityLocation o Restaurant.
La regla de oro
Cuidado: los datos estructurados deben describir lo que se ve en la página. Si pones en el JSON-LD unas valoraciones de 5 estrellas que no aparecen en ningún sitio, o un precio distinto del visible, Google lo considera engaño y puede aplicar una acción manual que elimina tus resultados enriquecidos.
Los tipos más útiles
Organization: quién eres
Va normalmente en la página de inicio. Ayuda a que Google asocie tu logo, tu web y tus redes sociales a tu marca:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Rocódromo La Fisura",
"url": "https://www.lafisura.es",
"logo": "https://www.lafisura.es/img/logo.png",
"sameAs": [
"https://www.instagram.com/lafisura.escalada",
"https://www.youtube.com/@lafisura"
]
}
sameAs lista otras páginas que representan a la misma organización. Las URL van siempre completas (con https://), nunca relativas.
Article: noticias y entradas de blog
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Cinco ejercicios para mejorar tu agarre en regletas",
"image": "https://www.lafisura.es/blog/img/regletas.jpg",
"datePublished": "2026-09-18T09:00:00+02:00",
"dateModified": "2026-09-25T17:30:00+02:00",
"author": {
"@type": "Person",
"name": "Lucía Ortega",
"url": "https://www.lafisura.es/equipo/lucia-ortega"
}
}
Las fechas van en formato ISO 8601: año-mes-día, una T, la hora y la zona horaria (+02:00 es la hora de verano en España peninsular, +01:00 la de invierno). Es el mismo formato que usa el atributo datetime de <time>.
También existen NewsArticle (noticias) y BlogPosting (entradas de blog), que son variantes más concretas.
BreadcrumbList: la ruta de la página
Las migas de pan (breadcrumbs) son esa línea “Inicio › Cursos › Iniciación” que indica dónde estás dentro de la web. Con BreadcrumbList, Google puede mostrar esa ruta en lugar de la URL:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Inicio",
"item": "https://www.lafisura.es/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Cursos",
"item": "https://www.lafisura.es/cursos/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Iniciación a la escalada"
}
]
}
positionempieza en 1, no en 0.- El último elemento es la página actual; puede ir sin
item.
En el HTML visible, las migas suelen ir en un <nav aria-label="Migas de pan"> con una lista ordenada <ol>.
FAQPage: preguntas frecuentes
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "¿Necesito traer material?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Te prestamos arnés y pies de gato en tu primera visita."
}
},
{
"@type": "Question",
"name": "¿Desde qué edad se puede escalar?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Desde los 6 años, siempre con un adulto responsable."
}
}
]
}
En la página, esas mismas preguntas pueden ir en acordeones con <details> y <summary>, como viste en elementos interactivos.
Nota: desde 2023 Google solo muestra el resultado enriquecido de preguntas frecuentes en webs oficiales de gobierno y de salud muy conocidas. Para el resto de webs, el marcado sigue siendo válido y otros sistemas lo leen, pero no esperes ver las preguntas desplegadas en Google.
Event: cursos, talleres, conciertos
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Open de bloque La Fisura 2026",
"startDate": "2026-12-05T16:00:00+01:00",
"endDate": "2026-12-05T21:00:00+01:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Rocódromo La Fisura",
"address": {
"@type": "PostalAddress",
"streetAddress": "Calle del Muro 12",
"addressLocality": "Santander",
"postalCode": "39001",
"addressCountry": "ES"
}
},
"image": "https://www.lafisura.es/img/open-2026.jpg",
"description": "Competición de bloque para todos los niveles, con categorías infantil y adulta.",
"offers": {
"@type": "Offer",
"price": "15.00",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"url": "https://www.lafisura.es/open-2026/inscripcion"
}
}
Fíjate en algunos detalles:
- Valores como
eventStatusoavailabilityno son textos libres: son URL de schema.org con valores fijos (EventScheduled,EventCancelled,EventPostponed;InStock,SoldOut…). - El precio va con punto decimal y sin símbolo:
"15.00", no"15,00 €". La moneda va aparte con su código ISO (EUR). - Si el evento se cancela, cambia
eventStatusaEventCancelleden lugar de borrar la página sin más.
Product: fichas de producto
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Bolsa de magnesio Cumbre",
"image": "https://tienda.lafisura.es/img/bolsa-cumbre.jpg",
"description": "Bolsa de magnesio con cierre de cordón y cepillo.",
"sku": "BM-CUMBRE-AZ",
"brand": { "@type": "Brand", "name": "Cumbre" },
"offers": {
"@type": "Offer",
"price": "18.90",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "37"
}
}
Con esto, Google puede mostrar el precio, si hay existencias y las estrellas. Recuerda la regla de oro: las valoraciones deben ser reales y verse en la página.
Varios tipos en la misma página
Puedes poner un bloque por tipo, o juntarlos en uno con @graph, que es una lista de cosas:
{
"@context": "https://schema.org",
"@graph": [
{ "@type": "Organization", "name": "Rocódromo La Fisura", "url": "https://www.lafisura.es" },
{ "@type": "BreadcrumbList", "itemListElement": [] }
]
}
Las dos opciones son válidas. Muchos gestores de contenido (WordPress con un plugin de SEO, por ejemplo) generan un único @graph automáticamente.
Comprobar los datos estructurados
Un error en el JSON (una coma de más, unas comillas que faltan) hace que el bloque entero se ignore, y no verás ningún aviso en la página. Por eso hay que validarlo siempre.
| Herramienta | Para qué |
|---|---|
| Prueba de resultados enriquecidos de Google (search.google.com/test/rich-results) | Dice qué resultados enriquecidos puede generar tu página y qué propiedades faltan |
| Validador de schema.org (validator.schema.org) | Comprueba cualquier tipo de schema.org, aunque Google no lo use |
| Google Search Console | Con la web ya publicada, informa de los errores en todas tus páginas |
Las dos primeras aceptan una URL o un fragmento de código pegado, así que puedes probar antes de publicar. La prueba de Google distingue entre:
- Errores: falta una propiedad obligatoria. Ese resultado enriquecido no se mostrará.
- Advertencias: falta una propiedad recomendada. Puede mostrarse, pero con menos información.
Consejo: antes de pegar el JSON-LD en la página, puedes comprobar que es JSON válido en la consola del navegador con
JSON.parse(`...`). Si hay un error de sintaxis, te dirá en qué posición.
Microdata: la otra forma que verás
En código antiguo, y en algunas plantillas, verás los datos estructurados escritos con microdata: atributos dentro del propio HTML visible.
<div itemscope itemtype="https://schema.org/Event">
<h2 itemprop="name">Taller de nudos básicos</h2>
<p>
<time itemprop="startDate" datetime="2026-10-24T18:00+02:00">24 de octubre a las 18:00</time>
</p>
<p itemprop="location" itemscope itemtype="https://schema.org/Place">
<span itemprop="name">Rocódromo La Fisura</span>,
<span itemprop="address">Santander</span>
</p>
</div>
itemscope: aquí empieza una “cosa”.itemtype: qué tipo de cosa es.itemprop: qué propiedad es este elemento.
Funciona, y Google lo entiende, pero mezcla los datos con el diseño: si alguien rehace la maqueta y cambia un <span>, puede romper los datos sin darse cuenta. Con JSON-LD los datos van en un bloque aparte, más fácil de leer, generar desde el servidor y mantener. Para proyectos nuevos, usa JSON-LD.
Errores frecuentes
- JSON mal formado. Comas al final, comillas simples o comentarios hacen que se ignore todo el bloque. Valídalo siempre.
- Datos que no están en la página. Valoraciones inventadas, precios distintos o preguntas que no se muestran. Google puede penalizarlo.
- URL relativas. En
url,image,logooitem, usa la dirección completa conhttps://. - Precio con coma o con símbolo. Escribe
"18.90"y pon la moneda enpriceCurrency. - Fechas sin formato ISO.
"14/11/2026"no vale; usa"2026-11-14T10:00:00+01:00". - Equivocarse con las mayúsculas. Los tipos empiezan con mayúscula (
Event, noevent) y las propiedades en camelCase (startDate, nostart_date). - Esperar resultados inmediatos. Google tiene que volver a rastrear la página, y aun así decide si muestra el resultado enriquecido o no.
Resumen
| Concepto | Qué es |
|---|---|
| Datos estructurados | Información sobre el contenido en un formato que las máquinas entienden |
| schema.org | El vocabulario común de tipos y propiedades |
| JSON-LD | <script type="application/ld+json"> con un objeto JSON; formato recomendado |
@context / @type | Vocabulario usado / tipo de cosa descrita |
Organization / LocalBusiness | Quién eres: nombre, logo, dirección, redes |
Article | Titular, autor, imagen y fechas de un artículo |
BreadcrumbList | La ruta de la página dentro de la web |
FAQPage | Preguntas y respuestas (resultado enriquecido muy limitado) |
Event | Fecha, lugar, estado y precio de un evento |
Product | Precio, disponibilidad y valoraciones de un producto |
| Prueba de resultados enriquecidos | Comprueba qué puede mostrar Google y qué falta |
| Microdata | itemscope, itemtype, itemprop en el HTML; lo verás en código antiguo |
En la siguiente lección profundizarás en los atributos que hacen accesibles los componentes interactivos: ARIA a fondo.
Pruébalo tú
Cambia el código y pulsa Ejecutar (o Ctrl + Enter).
Pon a prueba lo que has aprendido
¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.