# Discoverability: SEO and structured data for PWAs

> How structured data (JSON-LD) and crawlable HTML help search engines understand a PWA and qualify it for rich results, checked with the Rich Results Test.

**In one line:** per MDN, distributing a PWA as a website (rather than only through an
app store) makes it "discoverable through web search," and per Google, structured data
gives search engines "explicit clues" about what a page's content means.

## What it is

Per MDN's PWA installability guide, shipping a PWA as a website "means you can
distribute your PWA as a website, making it discoverable through web search, and also
distribute it in app stores, so users can find it there." Per Google Search Central,
"structured data is a standardized format for providing information about a page and
classifying the page content," and Google states it "uses structured data that it finds
on the web to understand the content of the page."

## Search engine and platform support

Structured data is markup, not a browser API, so there is no per-browser support matrix
to publish for it. Google Search Central documents JSON-LD, delivered as "a `<script>` tag in the `head` and `body`
elements," as its recommended format. [schema.org](https://schema.org/WebApplication)
defines a `WebApplication` type, described generically as "Web applications.", under
`Thing > CreativeWork > SoftwareApplication > WebApplication` — a page describing a PWA
can use this type — with a `browserRequirements` property schema.org describes as
"Specifies browser requirements in human-readable text. For example, 'requires HTML5
support'."

## How to use it

Add a JSON-LD block describing the app with schema.org's `WebApplication` type:

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "WebApplication",
  "name": "My PWA",
  "browserRequirements": "Requires JavaScript. Requires HTML5."
}
</script>
```

Per Google's guidance, only describe content that is actually present and visible on
that page — "don't create blank or empty pages just to hold structured data, and don't
add structured data about information that is not visible to the user, even if the
information is accurate."

## How to detect it at runtime

Before shipping, read back the JSON-LD block your own page emits and confirm it parses —
this catches a malformed-JSON template bug, though it does not replace validating the
markup with Google's Rich Results Test:

```js
function readStructuredData() {
  if (!("querySelector" in document)) {
    // No DOM Selectors API — nothing to read back; treat as absent.
    return null;
  }
  const script = document.querySelector('script[type="application/ld+json"]');
  if (!script) {
    return null;
  }
  try {
    return JSON.parse(script.textContent);
  } catch {
    // Malformed JSON-LD would fail Google's Rich Results Test — surface it
    // instead of shipping markup that can't be parsed.
    return null;
  }
}
```

## Practical checklist

- Don't create blank or empty pages just to hold structured data, per Google Search
  Central's guidelines.
- Don't describe information in structured data that isn't visible to the user on that
  page, even if it's accurate, per Google.
- Validate markup with Google's Rich Results Test before shipping — Google describes it
  as "an easy and useful tool for validating your structured data."
- MDN describes distributing a PWA as a website — not only through an app store — as
  what keeps it "discoverable through web search"; keep it reachable as a crawlable
  website too.

## Where to go next

- [Make it installable](/guides/installable/)
- [Choosing a caching strategy](/guides/offline/caching-strategies/)