Saltar al contenido
microdatos.html · devschool

Datos estructurados con JSON-LD y schema.org

Lección 30 de 39 · 11 min de lectura · Actualizado el

En esta lección
  1. Qué son los datos estructurados
  2. JSON-LD: el formato recomendado
  3. Los tipos más útiles
  4. Comprobar los datos estructurados
  5. Microdata: la otra forma que verás
  6. Errores frecuentes
  7. Resumen

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.

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"
    }
  ]
}
  • position empieza 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 eventStatus o availability no 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 eventStatus a EventCancelled en 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.

HerramientaPara 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 ConsoleCon 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, logo o item, usa la dirección completa con https://.
  • Precio con coma o con símbolo. Escribe "18.90" y pon la moneda en priceCurrency.
  • 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, no event) y las propiedades en camelCase (startDate, no start_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

ConceptoQué es
Datos estructuradosInformación sobre el contenido en un formato que las máquinas entienden
schema.orgEl vocabulario común de tipos y propiedades
JSON-LD<script type="application/ld+json"> con un objeto JSON; formato recomendado
@context / @typeVocabulario usado / tipo de cosa descrita
Organization / LocalBusinessQuién eres: nombre, logo, dirección, redes
ArticleTitular, autor, imagen y fechas de un artículo
BreadcrumbListLa ruta de la página dentro de la web
FAQPagePreguntas y respuestas (resultado enriquecido muy limitado)
EventFecha, lugar, estado y precio de un evento
ProductPrecio, disponibilidad y valoraciones de un producto
Prueba de resultados enriquecidosComprueba qué puede mostrar Google y qué falta
Microdataitemscope, 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).

microdatos.html
Resultado

Pon a prueba lo que has aprendido

[HTML] ¿Qué formato de datos estructurados recomienda Google y se coloca en un <script>?

[HTML] ¿Cuál de estos valores está bien escrito en un JSON-LD de tipo Product?

[HTML] Un JSON-LD declara 5 estrellas de valoración que no aparecen en la página. ¿Qué riesgo hay?

[HTML] ¿Qué formato de fecha pide schema.org para startDate?

¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.