Skip to main content
seofields
docs

ItemList

The ItemList schema type describes an ordered or unordered collection of items. Google uses it to render carousel and list rich results — top-10 lists, ranked products, episode guides, and curated round-ups all benefit from this markup.

About ItemList

ItemList is one of the most flexible schema types. For ranked content (e.g. "Best laptops 2025"), set itemListOrder to ItemListOrderDescending and include explicit position values to lock the order. For navigation breadcrumbs, prefer the more specific BreadcrumbList type which Google treats differently in search results.

Fields

FieldTypeRequiredDescription
namestringThe name of the list.
descriptiontextA description of the list.
itemListOrderstringHow items are ordered: ItemListOrderAscending, ItemListOrderDescending, or ItemListUnordered.
numberOfItemsnumberTotal number of items in the list.
itemListElement[].positionnumberOrder in the list (auto-set if not provided).
itemListElement[].namestringThe name of each list item.
itemListElement[].urlurlLink to the item.
itemListElement[].imageurlImage for the list item.
itemListElement[].descriptiontextDescription of the list item.

Plugin Registration

sanity.config.ts
import { defineConfig } from 'sanity'
import { schemaOrgItemListPlugin } from 'sanity-plugin-seofields/schema'

export default defineConfig({
  plugins: [
    schemaOrgItemListPlugin(),
  ],
})

Schema Usage

Add theschemaOrgItemList field to any document schema:

schemas/roundup.ts
import { defineField, defineType } from 'sanity'

export default defineType({
  name: 'roundup',
  title: 'Roundup',
  type: 'document',
  fields: [
    defineField({
      name: 'schemaOrgItemList',
      title: 'ItemList Schema',
      type: 'schemaOrgItemList',
    }),
  ],
})

GROQ Query

GROQ query
*[_type == "roundup"][0]{
  schemaOrgItemList {
    name,
    description,
    itemListOrder,
    numberOfItems,
    itemListElement[]{
      position,
      name,
      url,
      image,
      description
    }
  }
}

Next.js Component

app/layout.tsx
import { ItemListSchema } from 'sanity-plugin-seofields/schema/next'

export default function Layout({ data }) {
  return <ItemListSchema data={data.schemaOrgItemList} />
}

JSON-LD Output

Generated JSON-LD
{
  "@context": "https://schema.org",
  "@type": "ItemList",
  "name": "Top 5 React Frameworks of 2025",
  "description": "Our editor-curated ranking of the most popular React-based frameworks.",
  "itemListOrder": "https://schema.org/ItemListOrderDescending",
  "numberOfItems": 5,
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Next.js",
      "url": "https://nextjs.org",
      "image": "https://example.com/img/nextjs.png",
      "description": "The React framework for the web."
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "Remix",
      "url": "https://remix.run"
    }
  ]
}

Was this page helpful?