Datos estructurados JSON-LD

JSON-LD es el formato de datos estructurados basado en scripts que recomienda Google: es fácil de implementar, nunca toca el HTML visible y normalmente se combina con schema.org para el SEO.

Publicado por primera vez: 26 jun 2026 · Última actualización: 11 ago 2026 · Avanzado
Idiomas
1 señal de evidencia en esta página

JSON-LD (notación de objetos JavaScript para datos enlazados) es un formato de datos estructurados que vive en una etiqueta <script type="application/ld+json">; en SEO suele combinarse con el vocabulario schema.org para describir el contenido de una página, aunque JSON-LD también puede transportar otros vocabularios. Es una recomendación del W3C (2014), y Google lo recomienda frente a Microdata y RDFa por un motivo: es el formato más fácil de implementar y mantener a escala, porque vive en su propio bloque y nunca toca el HTML visible. Los tres formatos funcionan igual de bien cuando se implementan correctamente. La columna vertebral de la sintaxis es @context (el vocabulario: schema.org para la mayoría del marcado SEO, aunque no es el único valor válido), @type (la entidad) y @id (una URI estable útil, pero opcional, para enlazar entidades; es la base del patrón @graph, una forma válida de organizar varias entidades, no un requisito). El matiz que omiten la mayoría de las guías: Googlebot renderiza JavaScript, por lo que el JSON-LD inyectado dinámicamente funciona para Google, pero varios rastreadores de IA —incluidos GPTBot y ClaudeBot, según las pruebas— no ejecutan JavaScript; esto depende del proveedor y de la fecha, no es una regla universal, así que verifica directamente si te importa un rastreador concreto y renderiza en el servidor el marcado que no puedas confirmar de otro modo. Los datos estructurados no son una señal de posicionamiento: determinan la elegibilidad para resultados enriquecidos y la comprensión de entidades, y deben describir contenido realmente visible en la página.

TL;DR — JSON-LD (notación de objetos JavaScript para datos enlazados) es una recomendación del W3C de 2014: se basa en JSON, pero @context es lo que lo convierte en datos enlazados, no en simple JSON. Es el formato de datos estructurados que recomienda Google porque es el más fácil de implementar y mantener a escala y nunca toca el HTML visible; Microdata y RDFa son igual de válidos cuando son correctos. La columna vertebral de la sintaxis es @context (el vocabulario: schema.org para la mayoría del marcado SEO, aunque la especificación permite otros contextos), @type (la entidad) y @id (una URI estable útil, pero opcional, para referenciar entidades; es la base de @graph, que es un patrón válido entre otros y no un requisito). Colócalo en <head> o <body>: Google acepta ambos. Googlebot renderiza JS, por lo que el JSON-LD inyectado dinámicamente funciona para Google; varios rastreadores de IA (incluidos GPTBot y ClaudeBot, según las pruebas) no ejecutan JS, pero esto depende del proveedor y de la fecha: verifícalo directamente en vez de suponerlo para todos los rastreadores de IA, y renderiza en el servidor lo que no puedas confirmar. Los datos estructurados no son una señal de posicionamiento: impulsan la elegibilidad para resultados enriquecidos y la comprensión de entidades, y deben describir contenido visible en la página.

JSON-LD es un formato, no un vocabulario

Primero, una distinción que aclara mucha confusión: JSON-LD es el formato; schema.org es el vocabulario. JSON-LD es cómo escribes el marcado; los tipos Article, Product y Organization de schema.org son lo que expresas. Los resultados enriquecidos son la capa de funcionalidades que se coloca sobre ambos. Esta página trata sobre el formato. El enfoque del vocabulario para la IA está en Schema Markup for AI.

JSON-LD es una recomendación del W3C, publicada por primera vez en 2014. Es anterior a su adopción en SEO y se diseñó para la interoperabilidad general de datos enlazados en la web, no específicamente para la búsqueda. Por eso existe una propiedad como @id, y este es el punto de nivel de especificación que la mayoría de las guías de SEO omiten: JSON-LD no es simplemente JSON. Se basa en la sintaxis JSON, pero la declaración @context es lo que hace que los datos estén enlazados: sean identificables y conectables en la web. Si eliminas @context, tienes datos que un analizador no puede interpretar.

JSON-LD tampoco está unido a schema.org. La especificación permite que @context haga referencia a cualquier vocabulario publicado —sus propios ejemplos enlazan a contextos que no son de schema.org—, así que JSON-LD es la respuesta correcta a «¿qué formato?», mientras que schema.org es una respuesta, la habitual para el marcado de búsqueda y búsqueda con IA, a «¿qué vocabulario?». Una página podría usar válidamente JSON-LD con otro vocabulario; simplemente dejaría de ser marcado de schema.org.

JSON-LD frente a Microdata y RDFa

Hay tres formas de expresar datos estructurados y Google admite las tres:

JSON-LDMicrodataRDFa
Dónde viveUn bloque <script> separadoAtributos itemprop integrados en el HTMLAtributos property integrados en el HTML
¿Toca el HTML visible?No
¿Puede inyectarlo JS / un gestor de etiquetas?Sí (limpiamente)IncómodoIncómodo
Postura de GoogleRecomendadoCompatibleCompatible
Probabilidad de erroresLa más bajaMayor (mezclado con el marcado)Mayor (mezclado con el marcado)

La recomendación de Google es explícita, pero su alcance es limitado: “In general, Google recommends using JSON-LD for structured data if your site’s setup allows it, as it’s the easiest solution for website owners to implement and maintain at scale (in other words, less prone to user errors).” (traducción) «En general, Google recomienda usar JSON-LD para los datos estructurados si la configuración del sitio lo permite, porque es la solución más fácil de implementar y mantener a escala y resulta menos propensa a errores».

El matiz que normalmente omiten los competidores —y que merece la pena conservar— procede de la misma página de Google: “All 3 formats are equally fine for Google, as long as the markup is valid and properly implemented per the feature’s documentation.” (traducción) «Los tres formatos son igualmente válidos para Google siempre que el marcado sea válido y esté bien implementado conforme a la documentación de la función». Por tanto, la recomendación trata sobre facilidad de implementación y tasa de errores, no sobre velocidad de análisis ni ventaja de posicionamiento. Usar Microdata no es una penalización. JSON-LD gana en la práctica porque no enreda los datos estructurados con el marcado que un diseñador podría editar mañana.

La sintaxis: @context, @type, @id, propiedades y anidamiento

Aquí tienes un bloque Article anotado:

<script type="application/ld+json">
{
  "@context": "https://schema.org",          // the vocabulary — the common value for SEO
  "@type": "Article",                          // the entity type
  "@id": "https://example.com/post#article",   // a stable URI for this entity
  "headline": "How JSON-LD Works",            // a property (key/value)
  "datePublished": "2026-06-26",
  "author": {                                  // a nested entity
    "@type": "Person",
    "name": "Patrick Stox",
    "url": "https://patrickstox.com/"
  }
}
</script>
  • @context: establece el marco semántico (el vocabulario). Para el marcado SEO de schema.org normalmente es "https://schema.org", pero es una convención, no una regla: @context asigna términos a identificadores, y la especificación permite que apunte a otros vocabularios. Indica al analizador cómo interpretar cada nombre de propiedad que sigue. Esta es la parte que convierte los datos en datos enlazados.
  • @type: declara la entidad: Article, Product, Organization, BreadcrumbList, etc. Se corresponde con un tipo de schema.org. Usa el tipo aplicable más específico: NewsArticle en lugar de Article si encaja.
  • @id: una URI única que identifica el recurso. Es el mecanismo que permite referenciar una entidad desde otra (consulta @graph abajo) y conviene configurarlo en todo lo que vayas a referenciar, pero no es obligatorio universalmente. La especificación JSON-LD permite nodos en blanco no identificados, así que un JSON-LD válido puede omitir @id en entidades a las que nunca necesites referirte desde otro lugar.
  • Propiedades: pares normales de clave/valor JSON que usan términos del vocabulario de @context.
  • Anidamiento: las entidades hijas se expresan como objetos JSON anidados (el objeto author de arriba) o como matrices de objetos.

El patrón @graph (el enfoque escalable)

La mayoría de las páginas necesitan más de una entidad: una Organization, un WebSite, una BreadcrumbList y el propio Article o WebPage. El enfoque ingenuo son cuatro bloques <script> separados que repiten datos. Una alternativa escalable es un único bloque con @graph: una matriz de entidades referenciadas entre sí mediante @id. Ni la especificación JSON-LD ni Google exigen @graph como el patrón: es sintaxis para expresar un grafo, y existen otras disposiciones válidas (bloques tipados separados, objetos anidados sin un @graph de nivel superior y nodos en blanco sin @id), pero en un sitio con varias entidades referenciadas es el patrón que evita repetir los mismos datos de Organization o WebSite en cada página:

Declare each entity once and connect the graph with stable `@id` references instead of repeating full objects. Fuente: Nested Schema

One Organization is referenced as publisher by the WebSite and Article. The WebPage belongs to the WebSite and is connected to the Article. Each entity is declared once, and the same stable ID string is reused for every reference.

© Patrick Stox LLC · CC BY 4.0 ·

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Organization",
      "@id": "https://example.com/#org",
      "name": "Example Co",
      "url": "https://example.com/"
    },
    {
      "@type": "WebSite",
      "@id": "https://example.com/#website",
      "url": "https://example.com/",
      "publisher": { "@id": "https://example.com/#org" }   // reference, not a copy
    },
    {
      "@type": "WebPage",
      "@id": "https://example.com/post#webpage",
      "isPartOf": { "@id": "https://example.com/#website" },
      "breadcrumb": { "@id": "https://example.com/post#breadcrumb" }
    }
  ]
}
</script>

Define Organization una sola vez y apunta a ella con { "@id": "...#org" } en el resto de lugares, en vez de repetir el nombre, el logotipo y la URL. Así construyen su salida los principales plugins de Schema para CMS, y por eso existe @id. Bing argumenta lo mismo sobre el anidamiento de JSON-LD: “makes defining links and relationships between data and entities… easy because it supports nested data.” (traducción) «facilita definir enlaces y relaciones entre datos y entidades porque admite datos anidados».

Dónde colocarlo: <head> o <body>

Google confirma que ambos funcionan: “You can put the JSON-LD data in the <head> or the <body> of the page.” (traducción) «Puedes colocar los datos JSON-LD en el <head> o el <body> de la página». <head> es lo convencional, pero muchos plugins de CMS lo inyectan cerca del final de <body>, y no pasa nada. Bing coincide en que puede estar “in the header, body or foot of the page.” (traducción) «en la cabecera, el cuerpo o el pie de la página». No pierdas tiempo trasladando un bloque válido del body al head: no cambia nada. Evidence for this claim Google permits JSON-LD in either the head or body of an HTML document for supported structured-data features. Scope: Google Search JSON-LD guidance; markup must still match visible page content. Confidence: high · Verified: Google: Structured data introduction

Generar JSON-LD dinámicamente: la trampa de los rastreadores de IA

Puedes crear JSON-LD al vuelo con JavaScript, y Google documenta dos formas de hacerlo:

Evidence for this claim Dynamically generated structured data is acceptable to Google when it is rendered and complies with content and quality guidelines. Scope: Google Search JavaScript and structured-data guidance; crawlability and rendering remain prerequisites. Confidence: high · Verified: Google: Generate structured data with JavaScript
  1. Google Tag Manager — una etiqueta HTML personalizada que contiene el JSON-LD y extrae valores de las variables de GTM. (Evita duplicar datos entre la página y la etiqueta.)
  2. JavaScript personalizado — crea el elemento script mediante programación:
    const script = document.createElement('script');
    script.setAttribute('type', 'application/ld+json');
    script.textContent = structuredDataText;
    document.head.appendChild(script);

Esto funciona para Googlebot, porque Google renderiza la página: “Google Search can understand and process structured data that’s available in the DOM when it renders the page.” (traducción) «La Búsqueda de Google puede comprender y procesar los datos estructurados disponibles en el DOM cuando renderiza la página». Hasta aquí, todo bien.

Esta es la trampa que omiten la mayoría de las guías, explicada con cuidado. Varios rastreadores de IA —incluidos GPTBot y ClaudeBot, según pruebas habituales— no han ejecutado JavaScript. Si tu JSON-LD solo existe después de que se ejecute un script del lado del cliente, un rastreador que omite JS nunca lo verá: será invisible para ese bot aunque Googlebot lo lea correctamente, porque Google documenta que renderiza el DOM antes de buscar datos estructurados.

Hay dos matices honestos sobre ese comportamiento de los rastreadores de IA: la documentación propia de Google establece la parte de Googlebot; la parte de los rastreadores de IA procede de pruebas e informes sobre proveedores individuales, no de una especificación publicada por ninguno, así que depende del proveedor y de la fecha. La compatibilidad de un rastreador con JavaScript puede cambiar y no he verificado directamente a todos los proveedores. No trates «los rastreadores de IA omiten JS» como una regla universal sobre la que construir; tómalo como un motivo para comprobar el rastreador que realmente te importa (o usa el renderizado en servidor por defecto cuando no puedas comprobarlo). Si no está en el HTML renderizado por el servidor y no has confirmado que el rastreador ejecute JS, da por hecho que no puede verlo. Para la visibilidad en búsquedas con IA, renderiza JSON-LD en el servidor dentro del HTML estático salvo que hayas verificado lo contrario. (Este es el problema del renderizado de JavaScript visto desde los datos estructurados; consulta SEO para JavaScript.)

Hay un segundo matiz para el comercio electrónico: Google advierte que el marcado Product generado dinámicamente “can make Shopping crawls less frequent and less reliable,” (traducción) «puede hacer que los rastreos de Shopping sean menos frecuentes y menos fiables», lo que es un problema real para precios y disponibilidad que cambian rápidamente. Para productos, prefiere el renderizado en servidor independientemente de la IA.

Las políticas (ahora tienen consecuencias)

Las directrices de datos estructurados de Google son breves y fundamentales:

  • “Don’t mark up content that is not visible to readers of the page.” (traducción) «No marques contenido que no sea visible para quienes leen la página».
  • “Don’t mark up irrelevant or misleading content, such as fake reviews.” (traducción) «No marques contenido irrelevante o engañoso, como reseñas falsas».
  • “Put the structured data on the page that it describes.” (traducción) «Coloca los datos estructurados en la página que describen».
  • “Use the most specific applicable type and property names defined by schema.org.” (traducción) «Usa los nombres de tipo y propiedad aplicables más específicos definidos por schema.org».
  • No bloquees tus páginas con datos estructurados a Googlebot mediante robots.txt o noindex.

La regla del contenido visible es la que debes interiorizar. El Schema que describe contenido no mostrado en la página siempre ha incumplido las reglas; la aplicación de la norma sobre Schema «invisible» se ha endurecido. Bing formula la advertencia sin rodeos: “even though the markup is not visible on your page, it is still read by the search engines, and putting spam data in the markup can hamper your presence.” (traducción) «aunque el marcado no sea visible en la página, los motores de búsqueda lo leen, y añadir datos de spam al marcado puede perjudicar tu presencia».

Errores habituales de JSON-LD

  • Marcado que no coincide con la página visible: el principal problema de políticas (una valoración en JSON-LD que ningún visitante ve).
  • JSON mal formado: una coma final, una comilla sin escapar o comillas tipográficas (" en lugar de ") que rompen en silencio todo el bloque. JSON-LD es estricto.
  • Nombres de propiedad incorrectos: inventar propiedades que no existen en schema.org o escribir mal las reales, de modo que el analizador las ignore.
  • Un tipo genérico cuando existe uno específico: Thing o Article cuando correspondía Recipe o NewsArticle.
  • Bloques Organization duplicados e incoherentes entre páginas, con nombres o logotipos en conflicto.
  • Propiedades obligatorias ausentes para el resultado enriquecido al que aspiras (cada función enumera sus propios campos obligatorios).
  • Marcado inyectado mediante JS que se da por visible para todos los rastreadores: Google lo renderiza, pero algunos rastreadores de IA no lo han hecho, y conviene verificarlo para cada rastreador (la trampa anterior).

Validar JSON-LD

Bajo «¿es válido mi JSON-LD?» se plantean cuatro preguntas distintas, y no son la misma: pasar una no implica pasar las otras:

PruebaDemuestraNo demuestra
El JSON se analiza (cualquier linter de JSON o el paso de análisis del Rich Results Test)La sintaxis es JSON legal: no hay comas finales, comillas sin escapar ni comillas tipográficas que lo rompanQue algún nombre de propiedad sea vocabulario real de schema.org o que Google vaya a mostrar algo
Schema.org ValidatorLas propiedades y tipos existen en el vocabulario de schema.orgQue Google admita el tipo como resultado enriquecido o que estén presentes los campos obligatorios de una función concreta
Rich Results TestEl marcado cumple los requisitos de Google para un tipo de resultado enriquecido específico compatible, en la página renderizada que probasteQue Google vaya a mostrar realmente el resultado enriquecido —la elegibilidad no es una garantía— o que otros sistemas de búsqueda/IA lo analicen igual
Google Search Console — informes de Mejoras / resultados enriquecidosLo que Google analizó realmente en páginas activas rastreadas, a escala y con errores realesEl estado en tiempo real: los informes llevan retraso respecto al nuevo rastreo
  • Prueba por URL, no por código pegado, en páginas renderizadas con JS. El modo de entrada de código del Rich Results Test no ejecuta tus scripts ni resuelve las referencias relativas como la prueba de una URL activa: no puede decirte cómo es un bloque inyectado del lado del cliente después del renderizado.
  • Bing Webmaster Tools — Validador de marcado: Bing valida JSON-LD desde agosto de 2018.
  • Ninguna de estas pruebas representa a los rastreadores que no renderizan JavaScript (consulta el matiz sobre rastreadores de IA): probar la URL renderizada confirma lo que ve Google, no lo que recibe un bot que omite JS.

¿Ayuda JSON-LD al SEO?

Establece las expectativas con honestidad:

  • No es una señal de posicionamiento. John Mueller ha dicho que los datos estructurados no harán que un sitio se posicione mejor. Punto.
  • Elegibilidad para resultados enriquecidos. Es lo que te hace apto para funciones mejoradas de las SERP (estrellas, precios, preguntas frecuentes y migas de pan): elegibilidad, no garantía.
  • CTR, indirectamente. Los resultados con una apariencia más completa pueden conseguir más clics, que es la recompensa real para la mayoría de los sitios.
  • Comprensión de entidades. Ayuda a los motores a conectar tu página con entidades conocidas y con el Knowledge Graph.
  • Búsqueda con IA. Fabrice Canel (Bing) confirmó en 2025 que el marcado de Schema ayuda a los LLM de Microsoft a entender el contenido, pero ten en cuenta el matiz del estudio controlado de Schema Markup for AI: es infraestructura para desambiguar, no una palanca directa de citación.

Por tanto: implementa JSON-LD para la elegibilidad de resultados enriquecidos, la claridad de las entidades y la comprensión por parte de la IA/los LLM, no como un truco de posicionamiento.

Este artículo está en el hub de datos estructurados. Para el análisis específico de IA sobre el vocabulario de schema.org, consulta Schema Markup for AI; para la mecánica de renderizado tras la inyección dinámica, consulta SEO para JavaScript.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.