--- title: getSitemap description: >- Generate a sitemap for a specific resource type. Returns a standard Response object. api_version: 2025-07 api_name: hydrogen source_url: html: 'https://shopify.dev/docs/api/hydrogen/latest/utilities/getsitemap' md: 'https://shopify.dev/docs/api/hydrogen/latest/utilities/getsitemap.md' --- # get​Sitemap Generate a sitemap for a specific resource type. Returns a standard Response object. ## get​Sitemap([options](#getsitemap-propertydetail-options)​) ### Parameters * options GetSiteMapOptions required ### Returns * Promise\ ### GetSiteMapOptions * getChangeFreq Optionally customize the changefreq property for each URL ```ts (options: { type: string; handle: string; }) => string ``` * getLink A function that produces a canonical url for a resource. It is called multiple times for each locale supported by the app. ```ts (options: { type: string; baseUrl: string; handle?: string; locale?: string; }) => string ``` * locales An array of locales to generate alternate tags ```ts string[] ``` * noItemsFallback If the sitemap has no links, fallback to rendering a link to the homepage. This prevents errors in Google's search console. Defaults to \`/\`. ```ts string ``` * params The params object from Remix ```ts Params ``` * request A Remix Request object ```ts Request ``` * storefront The Storefront API Client from Hydrogen ```ts Storefront ``` ```ts interface GetSiteMapOptions { /** The params object from Remix */ params: LoaderFunctionArgs['params']; /** The Storefront API Client from Hydrogen */ storefront: Storefront; /** A Remix Request object */ request: Request; /** A function that produces a canonical url for a resource. It is called multiple times for each locale supported by the app. */ getLink: (options: { type: string | SITEMAP_INDEX_TYPE; baseUrl: string; handle?: string; locale?: string; }) => string; /** An array of locales to generate alternate tags */ locales?: string[]; /** Optionally customize the changefreq property for each URL */ getChangeFreq?: (options: { type: string | SITEMAP_INDEX_TYPE; handle: string; }) => string; /** If the sitemap has no links, fallback to rendering a link to the homepage. This prevents errors in Google's search console. Defaults to `/`. */ noItemsFallback?: string; } ``` ### Storefront Interface to interact with the Storefront API. * cache ```ts Cache ``` * CacheCustom ```ts (overrideOptions: AllCacheOptions) => AllCacheOptions ``` * CacheLong ```ts (overrideOptions?: AllCacheOptions) => AllCacheOptions ``` * CacheNone ```ts () => NoStoreStrategy ``` * CacheShort ```ts (overrideOptions?: AllCacheOptions) => AllCacheOptions ``` * generateCacheControlHeader ```ts (cacheOptions: AllCacheOptions) => string ``` * getApiUrl ```ts any ``` * getPrivateTokenHeaders ```ts any ``` * getPublicTokenHeaders ```ts any ``` * getShopifyDomain ```ts any ``` * i18n ```ts TI18n ``` * mutate ```ts (mutation: RawGqlString, ...options: ClientVariablesInRestParams) => Promise ``` * query ```ts (query: RawGqlString, ...options: ClientVariablesInRestParams, AutoAddedVariableNames>) => Promise ``` ```ts { query: < OverrideReturnType extends any = never, RawGqlString extends string = string, >( query: RawGqlString, ...options: ClientVariablesInRestParams< StorefrontQueries, RawGqlString, StorefrontCommonExtraParams & Pick, AutoAddedVariableNames > ) => Promise< ClientReturn & StorefrontError >; mutate: < OverrideReturnType extends any = never, RawGqlString extends string = string, >( mutation: RawGqlString, ...options: ClientVariablesInRestParams< StorefrontMutations, RawGqlString, StorefrontCommonExtraParams, AutoAddedVariableNames > ) => Promise< ClientReturn & StorefrontError >; cache?: Cache; CacheNone: typeof CacheNone; CacheLong: typeof CacheLong; CacheShort: typeof CacheShort; CacheCustom: typeof CacheCustom; generateCacheControlHeader: typeof generateCacheControlHeader; getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; i18n: TI18n; } ``` ### AllCacheOptions Override options for a cache strategy. * maxAge The maximum amount of time in seconds that a resource will be considered fresh. See \`max-age\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:\~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). ```ts number ``` * mode The caching mode, generally \`public\`, \`private\`, or \`no-store\`. ```ts string ``` * sMaxAge Similar to \`maxAge\` but specific to shared caches. See \`s-maxage\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). ```ts number ``` * staleIfError Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See \`stale-if-error\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). ```ts number ``` * staleWhileRevalidate Indicate that the cache should serve the stale response in the background while revalidating the cache. See \`stale-while-revalidate\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). ```ts number ``` ```ts export interface AllCacheOptions { /** * The caching mode, generally `public`, `private`, or `no-store`. */ mode?: string; /** * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). */ maxAge?: number; /** * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). */ staleWhileRevalidate?: number; /** * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). */ sMaxAge?: number; /** * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). */ staleIfError?: number; } ``` ### NoStoreStrategy * mode ```ts string ``` ```ts { mode: string; } ``` ### StorefrontMutations Maps all the mutations found in the project to variables and return types. ```ts export interface StorefrontMutations { // Example of how a generated mutation type looks like: // '#graphql mutation m1 {...}': {return: M1Mutation; variables: M1MutationVariables}; } ``` ### StorefrontCommonExtraParams * displayName ```ts string ``` * headers ```ts HeadersInit ``` * storefrontApiVersion ```ts string ``` ```ts { headers?: HeadersInit; storefrontApiVersion?: string; displayName?: string; } ``` ### AutoAddedVariableNames ```ts 'country' | 'language' ``` ### StorefrontQueries Maps all the queries found in the project to variables and return types. ```ts export interface StorefrontQueries { // Example of how a generated query type looks like: // '#graphql query q1 {...}': {return: Q1Query; variables: Q1QueryVariables}; } ``` ### StorefrontQueryOptions ```ts StorefrontCommonExtraParams & { query: string; mutation?: never; cache?: CachingStrategy; } ``` ### CachingStrategy Use the \`CachingStrategy\` to define a custom caching mechanism for your data. Or use one of the pre-defined caching strategies: CacheNone, CacheShort, CacheLong. * maxAge The maximum amount of time in seconds that a resource will be considered fresh. See \`max-age\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:\~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). ```ts number ``` * mode The caching mode, generally \`public\`, \`private\`, or \`no-store\`. ```ts string ``` * sMaxAge Similar to \`maxAge\` but specific to shared caches. See \`s-maxage\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). ```ts number ``` * staleIfError Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See \`stale-if-error\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). ```ts number ``` * staleWhileRevalidate Indicate that the cache should serve the stale response in the background while revalidating the cache. See \`stale-while-revalidate\` in the \[MDN docs]\(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). ```ts number ``` ```ts AllCacheOptions ``` Examples ### Examples * #### Example code ##### Description I am the default example ##### JavaScript ```js import {getSitemap} from '@shopify/hydrogen'; export async function loader({request, params, context: {storefront}}) { const response = await getSitemap({ storefront, request, params, // The locales to include in the sitemap locales: ['EN-US', 'EN-CA', 'FR-CA'], // A function to generate a link for a given resource getLink: ({type, baseUrl, handle, locale}) => { if (!locale) return `${baseUrl}/${type}/${handle}`; return `${baseUrl}/${locale}/${type}/${handle}`; }, }); // Set any custom headers on the sitemap response response.headers.set('Cache-Control', `max-age=${60 * 60 * 24}`); return response; } ``` ##### TypeScript ```ts import type {LoaderFunctionArgs} from '@shopify/remix-oxygen'; import {getSitemap} from '@shopify/hydrogen'; export async function loader({ request, params, context: {storefront}, }: LoaderFunctionArgs) { const response = await getSitemap({ storefront, request, params, // The locales to include in the sitemap locales: ['EN-US', 'EN-CA', 'FR-CA'], // A function to generate a link for a given resource getLink: ({type, baseUrl, handle, locale}) => { if (!locale) return `${baseUrl}/${type}/${handle}`; return `${baseUrl}/${locale}/${type}/${handle}`; }, }); // Set any custom headers on the sitemap response response.headers.set('Cache-Control', `max-age=${60 * 60 * 24}`); return response; } ``` ## Related [- getSitemapIndex](https://shopify.dev/api/hydrogen/utilities/getSitemapIndex)