How are several paywalled sections represented in structured data?

The Citead team, updated

In short. Use one WebPageElement object per paywalled CSS class inside a hasPart array.

Definition: Several paywalled sections are represented with a hasPart array. Each array item is a WebPageElement whose cssSelector names a paywalled HTML class and whose isAccessibleForFree value is false.

Key facts

  • Google's paywalled content documentation accepts JSON-LD and microdata for describing paywalled content.
  • The page says to add a class name around each paywalled section and to use only .class selectors for cssSelector.
  • For multiple sections, Google says to add the class names as an array, then shows two WebPageElement objects in the hasPart array.
  • Schema.org defines hasPart as indicating an item or CreativeWork that is part of another item or CreativeWork; its expected value is CreativeWork.
  • Schema.org's WebPageElement definition describes a web page element and says that multiple matches for a cssSelector can form one conceptual web page element.

How does the hasPart array map to the HTML?

Google's example gives each restricted section its own class, section1 or section2. The structured data repeats the relationship for each class. The article-level isAccessibleForFree value is false, and each child object also sets that value to false.

"hasPart": [
  {
    "@type": "WebPageElement",
    "isAccessibleForFree": false,
    "cssSelector": ".section1"
  },
  {
    "@type": "WebPageElement",
    "isAccessibleForFree": false,
    "cssSelector": ".section2"
  }
]

The array therefore represents separate class selectors, while each object describes one paywalled page element. Schema.org lists hasPart as a property of CreativeWork and gives CreativeWork as its expected value type, which is why a WebPageElement object fits inside the relationship.

What should each CSS selector contain?

The cssSelector value points to the class name placed in the HTML around the restricted content. Google's guidance says that cssSelector references the class name added in the markup and limits the property to .class selectors. Values such as .section1 and .section2 therefore correspond to HTML class attributes with those names.

Schema.org defines cssSelector as a CSS selector for a WebPageElement. It also records that multiple matches within a page can constitute one conceptual web page element. That definition supports using one class selector for the elements that make up one conceptual section, while Google's multiple-section example uses separate selectors for its two sections.

What should you check before publishing the markup?

Google's page is marked “Last updated 2026-09-08 UTC.” It says not to nest content sections, requires the class names to be present in the page markup, and recommends validating the code with the Rich Results Test. The guidance applies to all page versions, including AMP and non-AMP.

The same documentation also says that the bot access policy should be the same for AMP and non-AMP pages, because a difference can produce content mismatch errors in Search Console. For pages intended for crawling and indexing, Google says that Googlebot, and Googlebot-News when applicable, must be able to access the page.

FAQ

How do I mark two restricted sections?

Add one class around each section, then put one WebPageElement object for each class in the hasPart array. Set isAccessibleForFree to false in each object and use the matching .class value in cssSelector.

Can I use any CSS selector in cssSelector?

Google's documented rule is to use .class selectors for this property. Add the class to the HTML section first, then use the same class name in the structured data.

What does WebPageElement mean here?

Schema.org describes it as a web page element, such as a table or an image. In this markup, each object identifies a paywalled page section through its class selector.

Sources

  1. Google Search Central, "Structured data for subscription and paywalled content", 2026-09-08
  2. Schema.org, "WebPageElement", 2026-09-16
  3. Schema.org, "hasPart", 2026-09-16

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark