> Portal Navigation:
> 
> - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version.
> - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages).
> - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`).
> - Top-level index of all portals: https://dev.wix.com/docs/llms.txt
> - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt

# BulkSetItemSeoTags

# Package: seo

# Namespace: ItemSeoTagsService

# Method link: https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/bulk-set-item-seo-tags.md

## Permission Scopes:
Manage SEO Settings: SCOPE.PROMOTE.MANAGE-SEO

## Introduction

Sets the SEO tags of multiple items of the same type in one call.

Each entry carries its own field mask and behaves like a single [Set Item SEO
Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md)
call. The response reports a result per entry, correlated to the request by
`itemMetadata.originalIndex`, so you can tell exactly which entries succeeded.

A problem with one entry, such as an invalid tag or an item that doesn't exist, fails
only that entry. Check `bulkActionMetadata.totalFailures` and retry just the failed
entries: writes are idempotent, so re-sending an entry that already succeeded is safe.

Not every failure is per entry. An item type that isn't supported, or one that doesn't
support bulk writes, rejects the whole call, and so does a request that isn't
authorized. In those cases there are no per-entry results to inspect, so handle a
failed call as well as failed entries.

The saved-versus-published limitation applies per entry too: for a static page, an entry
with `publish: true` updates only the published revision, so Get Item SEO Tags and List
Item SEO Tags keep returning the values from before this call for that item.

To set the tags of a single item, call [Set Item SEO
Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md).

---

## REST API

### Schema

```
 Method: bulkSetItemSeoTags
 Description: Sets the SEO tags of multiple items of the same type in one call.  Each entry carries its own field mask and behaves like a single [Set Item SEO Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md) call. The response reports a result per entry, correlated to the request by `itemMetadata.originalIndex`, so you can tell exactly which entries succeeded.  A problem with one entry, such as an invalid tag or an item that doesn't exist, fails only that entry. Check `bulkActionMetadata.totalFailures` and retry just the failed entries: writes are idempotent, so re-sending an entry that already succeeded is safe.  Not every failure is per entry. An item type that isn't supported, or one that doesn't support bulk writes, rejects the whole call, and so does a request that isn't authorized. In those cases there are no per-entry results to inspect, so handle a failed call as well as failed entries.  The saved-versus-published limitation applies per entry too: for a static page, an entry with `publish: true` updates only the published revision, so Get Item SEO Tags and List Item SEO Tags keep returning the values from before this call for that item.  To set the tags of a single item, call [Set Item SEO Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md).
 URL: https://www.wixapis.com/promote/seo/v1/bulk/item-seo-tags/set
 Method: POST
 # Note: If the parameter `a.b` is listed under required parameters, `b` is only required if `a` is also present.
 Required parameters:  itemType
 Method parameters: 
   param name: entries | type: array<entries> | description: Items to set tags for, each with its own field mask.  | validation: minItems 1, maxItems 100
              - name: itemId | type: string | description: GUID of the item to set tags for.  | validation: maxLength 200
              - name: itemSeoTags | type: ItemSeoTags | description: Item SEO tags to set for this item. Only `tags` and `focusKeywords` can be changed.  
                 - name: tags | type: array<Tag> | description: Tags set for this item alone, which take precedence over the tags it would otherwise inherit.  Empty when the item has no tags of its own.  | validation: maxItems 100
                    - name: type | type: string | description: SEO tag type.   Supported values: `title`, `meta`, `script`, `link`.  
                    - name: props | type: object | description: A `{"key": "value"}` pair object where each SEO tag property (`"name"`, `"content"`, `"rel"`, `"href"`) contains a value. For example: `{"name": "description", "content": "the description itself"}`.  
                    - name: meta | type: object | description: SEO tag metadata. For example, `{"height": 300, "width": 240}`.  
                    - name: children | type: string | description: SEO tag inner content. For example, `<title> inner content </title>`.  
                    - name: custom | type: boolean | description: Whether the tag is a [custom tag](https://support.wix.com/en/article/adding-additional-meta-tags-to-your-sites-pages) — i.e. an entry from the site's Advanced/Custom Tags list.  This flag is scoped to that feature only. It is NOT an indicator of whether a standard tag (`title`, `description`, Open Graph, etc.) reflects a manually configured value versus a computed default/pattern — standard tags always resolve with `custom: false`, even when their content comes from a page's manually saved SEO title/description override. Don't use this field to verify whether a live page reflects a manual per-page SEO edit.  Limitation: when `ResolveStaticPageSeoTags` is called without `seoData`, the per-page SEO data is read only from the Vibe/Wix-managed-headless override store. That store holds nothing for classic Wix Editor or Wix Studio pages, so even genuine Advanced/Custom Tags saved on those pages are missing from the response entirely — there, `false` means this API could not tell, not that no custom tag exists. Pass `seoData` explicitly to resolve against a known set of tags.  
                    - name: disabled | type: boolean | description: Whether the tag is disabled. If the tag is disabled, people can't find your page when searching for this phrase in search engines.  
                 - name: focusKeywords | type: array<Keyword> | description: Keywords the item's content is intended to rank for. Used by Wix's SEO tools to assess the item's content; they aren't rendered on the page.  Mark the item's main keyword with `isMain` rather than relying on its position in the list.  | validation: maxItems 5
                    - name: term | type: string | description: Keyword value.  
                    - name: isMain | type: boolean | description: Whether the keyword is the main focus keyword.  
                    - name: origin | type: string | description: The source that added the keyword terms to the SEO settings.  | validation: maxLength 1000
              - name: fieldMask | type:  | description: Fields to update for this item.  Supported properties: `tags`, `focusKeywords`  
   param name: itemType | type: itemType | description: Type of item all the entries belong to. For example, `STATIC_PAGE` or `STORES_PRODUCT`. | required: true | validation: maxLength 100
   param name: publish | type: publish | description: Whether to publish every change to the live site, for item types that keep a separate draft, such as static pages.  Default: `false`  
   param name: returnEntity | type: returnEntity | description: Whether to return the updated item SEO tags in the results.  Default: `false`  
 Return type: BulkSetItemSeoTagsResponse
  - name: results | type: array<BulkItemSeoTagsResult> | description: Result for each item in the request, in the same order.  Match a result to the item you sent using `itemMetadata.originalIndex`. When an item fails, the reason is in `itemMetadata.error`.  | validation: maxItems 100
     - name: itemMetadata | type: ItemMetadata | description: Whether setting this item's tags succeeded, which item in the request it refers to, and the reason if it failed.  
        - name: id | type: string | description: Item GUID. Should always be available, unless it's impossible (for example, when failing to create an item).  | validation: maxLength 100
        - name: originalIndex | type: integer | description: Index of the item within the request array. Allows for correlation between request and response items.  
        - name: success | type: boolean | description: Whether the requested action was successful for this item. When `false`, the `error` field is populated.  
        - name: error | type: ApplicationError | description: Details about the error in case of failure.  
           - name: code | type: string | description: Error code.  
           - name: description | type: string | description: Description of the error.  
           - name: data | type: object | description: Data related to the error.  
     - name: item | type: ItemSeoTags | description: Updated item SEO tags.  Returned only when `returnEntity` is `true` and the item succeeded.  
        - name: id | type: string | description: Item SEO tags GUID, in the format `{itemType}:{itemId}`.  | read-only: true | validation: maxLength 400
        - name: itemType | type: string | description: Type of item the tags belong to. For example, `STATIC_PAGE`, `BLOG_POST`, or `STORES_PRODUCT`.  For an item on a page built from a Wix Data collection, the item type takes the form `WIX_DATA_PAGE_ITEM-{pageId}`.  | read-only: true | validation: maxLength 100
        - name: itemId | type: string | description: GUID of the item the tags belong to. For a static page, this is the page GUID.  | read-only: true | validation: maxLength 200
        - name: tags | type: array<Tag> | description: Tags set for this item alone, which take precedence over the tags it would otherwise inherit.  Empty when the item has no tags of its own.  | validation: maxItems 100
           - name: type | type: string | description: SEO tag type.   Supported values: `title`, `meta`, `script`, `link`.  
           - name: props | type: object | description: A `{"key": "value"}` pair object where each SEO tag property (`"name"`, `"content"`, `"rel"`, `"href"`) contains a value. For example: `{"name": "description", "content": "the description itself"}`.  
           - name: meta | type: object | description: SEO tag metadata. For example, `{"height": 300, "width": 240}`.  
           - name: children | type: string | description: SEO tag inner content. For example, `<title> inner content </title>`.  
           - name: custom | type: boolean | description: Whether the tag is a [custom tag](https://support.wix.com/en/article/adding-additional-meta-tags-to-your-sites-pages) — i.e. an entry from the site's Advanced/Custom Tags list.  This flag is scoped to that feature only. It is NOT an indicator of whether a standard tag (`title`, `description`, Open Graph, etc.) reflects a manually configured value versus a computed default/pattern — standard tags always resolve with `custom: false`, even when their content comes from a page's manually saved SEO title/description override. Don't use this field to verify whether a live page reflects a manual per-page SEO edit.  Limitation: when `ResolveStaticPageSeoTags` is called without `seoData`, the per-page SEO data is read only from the Vibe/Wix-managed-headless override store. That store holds nothing for classic Wix Editor or Wix Studio pages, so even genuine Advanced/Custom Tags saved on those pages are missing from the response entirely — there, `false` means this API could not tell, not that no custom tag exists. Pass `seoData` explicitly to resolve against a known set of tags.  
           - name: disabled | type: boolean | description: Whether the tag is disabled. If the tag is disabled, people can't find your page when searching for this phrase in search engines.  
        - name: focusKeywords | type: array<Keyword> | description: Keywords the item's content is intended to rank for. Used by Wix's SEO tools to assess the item's content; they aren't rendered on the page.  Mark the item's main keyword with `isMain` rather than relying on its position in the list.  | validation: maxItems 5
           - name: term | type: string | description: Keyword value.  
           - name: isMain | type: boolean | description: Whether the keyword is the main focus keyword.  
           - name: origin | type: string | description: The source that added the keyword terms to the SEO settings.  | validation: maxLength 1000
        - name: hasOverride | type: boolean | description: Whether the item has tags of its own, as opposed to inheriting them.  `false` doesn't mean the item shows Wix's built-in tags: it may inherit from the pattern for its item type, from the site's tags, or from the page that hosts it. See `resolvedTags` for the tags the item is expected to render with.  | read-only: true 
        - name: resolvedTags | type: array<ResolvedTag> | description: The tags the item is expected to render with, each marked with where it came from.  Derived by combining every source Wix manages, so it reflects inherited tags as well as the item's own. Tags that site code, apps, or page components add while the page renders aren't included, so this isn't a literal copy of the page's rendered head.  If a tag's source can't be determined, the tag is still exact but its `source` is `TAG_SOURCE_UNSPECIFIED`.  | read-only: true | validation: maxItems 500
           - name: tag | type: Tag | description: Resolved SEO tag.  
           - name: source | type: TagSource | description: Where the tag came from.  
                 - enum:
                 -     TAG_SOURCE_UNSPECIFIED: Unknown source.
                 -     TAG_SOURCE_SITE: The site's own site-wide tags.
                 -     TAG_SOURCE_DEFAULT_PATTERN: The pattern Wix provides for the page type.
                 -     TAG_SOURCE_USER_PATTERN: The pattern the Wix user customized for the page type.
                 -     TAG_SOURCE_HOST_PAGE: The tags of the page the item is displayed on.
                 -     TAG_SOURCE_ITEM: The item's own tags, which the Wix user set for that item alone.
        - name: hostPageId | type: string | description: GUID of the page that displays the item, for items shown on a shared page, such as a blog post or a store product.  Informational: the hosting page can't be addressed through this API.  | read-only: true | validation: maxLength 200
        - name: publishStatus | type: PublishStatus | description: Whether the item's SEO tags are live on the published site.  | read-only: true 
             - enum:
             -     PUBLISH_STATUS_UNSPECIFIED: Unknown publish status. Returned when the item type doesn't report one.
             -     PUBLISH_STATUS_PUBLISHED: The item's SEO tags are live on the published site. Item types that keep no separate draft, such as store products, events, and portfolio collections, always report this status.
             -     PUBLISH_STATUS_NOT_PUBLISHED: The item has never been published, so its SEO tags exist only as a draft and aren't on the live site. For example, a blog post that's still a draft.
        - name: language | type: string | description: Language the tags apply to, as an IETF BCP 47 language tag. For example, `en-US` for U.S. English.  Tags can currently be written only for the site's primary language, so leave this unset on a write. Sending a language fails with `LANGUAGE_NOT_SUPPORTED`.  | read-only: true | validation: maxLength 100
        - name: origin | type: Origin | description: What made the most recent change to the item's tags, for example a user or the site migration flow. Derived from the caller, not from the request.  `ORIGIN_UNSPECIFIED` when the caller isn't one Wix identifies as a specific origin. Origin isn't stored with the tags either, so Get Item SEO Tags and List Item SEO Tags always return `ORIGIN_UNSPECIFIED`.  | read-only: true 
             - enum:
             -     ORIGIN_UNSPECIFIED: Unknown origin. Returned by read methods, because origin isn't stored alongside the data it describes.
             -     ORIGIN_USER: A user, working in the dashboard or editor, or calling the API on their own behalf.
             -     ORIGIN_MIGRATION: The flow that imports an existing site into Wix.
             -     ORIGIN_AI: An AI agent or an automated suggestion flow.
  - name: bulkActionMetadata | type: BulkActionMetadata | description: How many items succeeded and how many failed.  
     - name: totalSuccesses | type: integer | description: Number of items that were successfully processed.  
     - name: totalFailures | type: integer | description: Number of items that couldn't be processed.  
     - name: undetailedFailures | type: integer | description: Number of failures without details because detailed failure threshold was exceeded.  

 Possible Errors:
   HTTP Code: 400 | Status Code: INVALID_ARGUMENT | Application Code: UNSUPPORTED_ITEM_TYPE | Description: Wix doesn't support the specified `itemType`. The error message lists the item types that are supported.
   HTTP Code: 428 | Status Code: FAILED_PRECONDITION | Application Code: BULK_NOT_SUPPORTED_FOR_ITEM_TYPE | Description: The item type doesn't support setting tags for multiple items at once. Set the items one at a time with Set Item SEO Tags instead.


```

### Examples

### Set the titles of several pages in one call
The third entry names an item that does not exist, so it fails on its own while the other two succeed.

```curl
curl -X POST \
'https://www.wixapis.com/seo-metatags-server/v1/bulk/item-seo-tags/set' \
-H 'Authorization: <AUTH>' \
-H 'Content-Type: application/json' \
-d '{
  "itemType": "STATIC_PAGE",
  "returnEntity": true,
  "entries": [
    {
      "itemId": "c1dmp",
      "itemSeoTags": {
        "tags": [
          {
            "type": "title",
            "children": "Winter collection | Ceramics studio"
          }
        ]
      },
      "fieldMask": "tags"
    },
    {
      "itemId": "j4xh7",
      "itemSeoTags": {
        "tags": [
          {
            "type": "title",
            "children": "Journal | Ceramics studio"
          }
        ]
      },
      "fieldMask": "tags"
    },
    {
      "itemId": "zzzzz",
      "itemSeoTags": {
        "tags": [
          {
            "type": "title",
            "children": "Does not exist"
          }
        ]
      },
      "fieldMask": "tags"
    }
  ]
}'
```

---

## JavaScript SDK

### Schema

```
 Method: wixClientAdmin.seo.itemSeoTags.bulkSetItemSeoTags(itemType, options)
 Description: Sets the SEO tags of multiple items of the same type in one call.  Each entry carries its own field mask and behaves like a single [Set Item SEO Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md) call. The response reports a result per entry, correlated to the request by `itemMetadata.originalIndex`, so you can tell exactly which entries succeeded.  A problem with one entry, such as an invalid tag or an item that doesn't exist, fails only that entry. Check `bulkActionMetadata.totalFailures` and retry just the failed entries: writes are idempotent, so re-sending an entry that already succeeded is safe.  Not every failure is per entry. An item type that isn't supported, or one that doesn't support bulk writes, rejects the whole call, and so does a request that isn't authorized. In those cases there are no per-entry results to inspect, so handle a failed call as well as failed entries.  The saved-versus-published limitation applies per entry too: for a static page, an entry with `publish: true` updates only the published revision, so Get Item SEO Tags and List Item SEO Tags keep returning the values from before this call for that item.  To set the tags of a single item, call [Set Item SEO Tags](https://dev.wix.com/docs/api-reference/business-management/seo/item-seo-tags-v1/set-item-seo-tags.md).
 # Note: If the parameter `a.b` is listed under required parameters, `b` is only required if `a` is also present.
 Required parameters:  itemType
 Method parameters: 
   param name: itemType | type: string | description: Type of item all the entries belong to. For example, `STATIC_PAGE` or `STORES_PRODUCT`. | required: true | validation: maxLength 100
   param name: options | type: BulkSetItemSeoTagsOptions  none  
        - name: entries | type: array<MaskedItemSeoTags> | description: Items to set tags for, each with its own field mask.  | validation: minItems 1, maxItems 100
           - name: itemId | type: string | description: GUID of the item to set tags for.  | validation: maxLength 200
           - name: itemSeoTags | type: ItemSeoTags | description: Item SEO tags to set for this item. Only `tags` and `focusKeywords` can be changed.  
              - name: tags | type: array<Tag> | description: Tags set for this item alone, which take precedence over the tags it would otherwise inherit.  Empty when the item has no tags of its own.  | validation: maxItems 100
                 - name: type | type: string | description: SEO tag type.   Supported values: `title`, `meta`, `script`, `link`.  
                 - name: props | type: object | description: A `{"key": "value"}` pair object where each SEO tag property (`"name"`, `"content"`, `"rel"`, `"href"`) contains a value. For example: `{"name": "description", "content": "the description itself"}`.  
                 - name: meta | type: object | description: SEO tag metadata. For example, `{"height": 300, "width": 240}`.  
                 - name: children | type: string | description: SEO tag inner content. For example, `<title> inner content </title>`.  
                 - name: custom | type: boolean | description: Whether the tag is a [custom tag](https://support.wix.com/en/article/adding-additional-meta-tags-to-your-sites-pages) — i.e. an entry from the site's Advanced/Custom Tags list.  This flag is scoped to that feature only. It is NOT an indicator of whether a standard tag (`title`, `description`, Open Graph, etc.) reflects a manually configured value versus a computed default/pattern — standard tags always resolve with `custom: false`, even when their content comes from a page's manually saved SEO title/description override. Don't use this field to verify whether a live page reflects a manual per-page SEO edit.  Limitation: when `ResolveStaticPageSeoTags` is called without `seoData`, the per-page SEO data is read only from the Vibe/Wix-managed-headless override store. That store holds nothing for classic Wix Editor or Wix Studio pages, so even genuine Advanced/Custom Tags saved on those pages are missing from the response entirely — there, `false` means this API could not tell, not that no custom tag exists. Pass `seoData` explicitly to resolve against a known set of tags.  
                 - name: disabled | type: boolean | description: Whether the tag is disabled. If the tag is disabled, people can't find your page when searching for this phrase in search engines.  
              - name: focusKeywords | type: array<Keyword> | description: Keywords the item's content is intended to rank for. Used by Wix's SEO tools to assess the item's content; they aren't rendered on the page.  Mark the item's main keyword with `isMain` rather than relying on its position in the list.  | validation: maxItems 5
                 - name: term | type: string | description: Keyword value.  
                 - name: isMain | type: boolean | description: Whether the keyword is the main focus keyword.  
                 - name: origin | type: string | description: The source that added the keyword terms to the SEO settings.  | validation: maxLength 1000
           - name: fieldMask | type: array<string> | description: Fields to update for this item.  Supported properties: `tags`, `focusKeywords`  
        - name: publish | type: boolean | description: Whether to publish every change to the live site, for item types that keep a separate draft, such as static pages.  Default: `false`  
        - name: returnEntity | type: boolean | description: Whether to return the updated item SEO tags in the results.  Default: `false`  
 Return type: PROMISE<BulkSetItemSeoTagsResponse>
  - name: results | type: array<BulkItemSeoTagsResult> | description: Result for each item in the request, in the same order.  Match a result to the item you sent using `itemMetadata.originalIndex`. When an item fails, the reason is in `itemMetadata.error`.  | validation: maxItems 100
     - name: itemMetadata | type: ItemMetadata | description: Whether setting this item's tags succeeded, which item in the request it refers to, and the reason if it failed.  
        - name: _id | type: string | description: Item GUID. Should always be available, unless it's impossible (for example, when failing to create an item).  | validation: maxLength 100
        - name: originalIndex | type: integer | description: Index of the item within the request array. Allows for correlation between request and response items.  
        - name: success | type: boolean | description: Whether the requested action was successful for this item. When `false`, the `error` field is populated.  
        - name: error | type: ApplicationError | description: Details about the error in case of failure.  
           - name: code | type: string | description: Error code.  
           - name: description | type: string | description: Description of the error.  
           - name: data | type: object | description: Data related to the error.  
     - name: item | type: ItemSeoTags | description: Updated item SEO tags.  Returned only when `returnEntity` is `true` and the item succeeded.  
        - name: _id | type: string | description: Item SEO tags GUID, in the format `{itemType}:{itemId}`.  | read-only: true | validation: maxLength 400
        - name: itemType | type: string | description: Type of item the tags belong to. For example, `STATIC_PAGE`, `BLOG_POST`, or `STORES_PRODUCT`.  For an item on a page built from a Wix Data collection, the item type takes the form `WIX_DATA_PAGE_ITEM-{pageId}`.  | read-only: true | validation: maxLength 100
        - name: itemId | type: string | description: GUID of the item the tags belong to. For a static page, this is the page GUID.  | read-only: true | validation: maxLength 200
        - name: tags | type: array<Tag> | description: Tags set for this item alone, which take precedence over the tags it would otherwise inherit.  Empty when the item has no tags of its own.  | validation: maxItems 100
           - name: type | type: string | description: SEO tag type.   Supported values: `title`, `meta`, `script`, `link`.  
           - name: props | type: object | description: A `{"key": "value"}` pair object where each SEO tag property (`"name"`, `"content"`, `"rel"`, `"href"`) contains a value. For example: `{"name": "description", "content": "the description itself"}`.  
           - name: meta | type: object | description: SEO tag metadata. For example, `{"height": 300, "width": 240}`.  
           - name: children | type: string | description: SEO tag inner content. For example, `<title> inner content </title>`.  
           - name: custom | type: boolean | description: Whether the tag is a [custom tag](https://support.wix.com/en/article/adding-additional-meta-tags-to-your-sites-pages) — i.e. an entry from the site's Advanced/Custom Tags list.  This flag is scoped to that feature only. It is NOT an indicator of whether a standard tag (`title`, `description`, Open Graph, etc.) reflects a manually configured value versus a computed default/pattern — standard tags always resolve with `custom: false`, even when their content comes from a page's manually saved SEO title/description override. Don't use this field to verify whether a live page reflects a manual per-page SEO edit.  Limitation: when `ResolveStaticPageSeoTags` is called without `seoData`, the per-page SEO data is read only from the Vibe/Wix-managed-headless override store. That store holds nothing for classic Wix Editor or Wix Studio pages, so even genuine Advanced/Custom Tags saved on those pages are missing from the response entirely — there, `false` means this API could not tell, not that no custom tag exists. Pass `seoData` explicitly to resolve against a known set of tags.  
           - name: disabled | type: boolean | description: Whether the tag is disabled. If the tag is disabled, people can't find your page when searching for this phrase in search engines.  
        - name: focusKeywords | type: array<Keyword> | description: Keywords the item's content is intended to rank for. Used by Wix's SEO tools to assess the item's content; they aren't rendered on the page.  Mark the item's main keyword with `isMain` rather than relying on its position in the list.  | validation: maxItems 5
           - name: term | type: string | description: Keyword value.  
           - name: isMain | type: boolean | description: Whether the keyword is the main focus keyword.  
           - name: origin | type: string | description: The source that added the keyword terms to the SEO settings.  | validation: maxLength 1000
        - name: hasOverride | type: boolean | description: Whether the item has tags of its own, as opposed to inheriting them.  `false` doesn't mean the item shows Wix's built-in tags: it may inherit from the pattern for its item type, from the site's tags, or from the page that hosts it. See `resolvedTags` for the tags the item is expected to render with.  | read-only: true 
        - name: resolvedTags | type: array<ResolvedTag> | description: The tags the item is expected to render with, each marked with where it came from.  Derived by combining every source Wix manages, so it reflects inherited tags as well as the item's own. Tags that site code, apps, or page components add while the page renders aren't included, so this isn't a literal copy of the page's rendered head.  If a tag's source can't be determined, the tag is still exact but its `source` is `TAG_SOURCE_UNSPECIFIED`.  | read-only: true | validation: maxItems 500
           - name: tag | type: Tag | description: Resolved SEO tag.  
           - name: source | type: TagSource | description: Where the tag came from.  
                 - enum:
                 -     TAG_SOURCE_UNSPECIFIED: Unknown source.
                 -     TAG_SOURCE_SITE: The site's own site-wide tags.
                 -     TAG_SOURCE_DEFAULT_PATTERN: The pattern Wix provides for the page type.
                 -     TAG_SOURCE_USER_PATTERN: The pattern the Wix user customized for the page type.
                 -     TAG_SOURCE_HOST_PAGE: The tags of the page the item is displayed on.
                 -     TAG_SOURCE_ITEM: The item's own tags, which the Wix user set for that item alone.
        - name: hostPageId | type: string | description: GUID of the page that displays the item, for items shown on a shared page, such as a blog post or a store product.  Informational: the hosting page can't be addressed through this API.  | read-only: true | validation: maxLength 200
        - name: publishStatus | type: PublishStatus | description: Whether the item's SEO tags are live on the published site.  | read-only: true 
             - enum:
             -     PUBLISH_STATUS_UNSPECIFIED: Unknown publish status. Returned when the item type doesn't report one.
             -     PUBLISH_STATUS_PUBLISHED: The item's SEO tags are live on the published site. Item types that keep no separate draft, such as store products, events, and portfolio collections, always report this status.
             -     PUBLISH_STATUS_NOT_PUBLISHED: The item has never been published, so its SEO tags exist only as a draft and aren't on the live site. For example, a blog post that's still a draft.
        - name: language | type: string | description: Language the tags apply to, as an IETF BCP 47 language tag. For example, `en-US` for U.S. English.  Tags can currently be written only for the site's primary language, so leave this unset on a write. Sending a language fails with `LANGUAGE_NOT_SUPPORTED`.  | read-only: true | validation: maxLength 100
        - name: origin | type: Origin | description: What made the most recent change to the item's tags, for example a user or the site migration flow. Derived from the caller, not from the request.  `ORIGIN_UNSPECIFIED` when the caller isn't one Wix identifies as a specific origin. Origin isn't stored with the tags either, so Get Item SEO Tags and List Item SEO Tags always return `ORIGIN_UNSPECIFIED`.  | read-only: true 
             - enum:
             -     ORIGIN_UNSPECIFIED: Unknown origin. Returned by read methods, because origin isn't stored alongside the data it describes.
             -     ORIGIN_USER: A user, working in the dashboard or editor, or calling the API on their own behalf.
             -     ORIGIN_MIGRATION: The flow that imports an existing site into Wix.
             -     ORIGIN_AI: An AI agent or an automated suggestion flow.
  - name: bulkActionMetadata | type: BulkActionMetadata | description: How many items succeeded and how many failed.  
     - name: totalSuccesses | type: integer | description: Number of items that were successfully processed.  
     - name: totalFailures | type: integer | description: Number of items that couldn't be processed.  
     - name: undetailedFailures | type: integer | description: Number of failures without details because detailed failure threshold was exceeded.  

 Possible Errors:
   HTTP Code: 400 | Status Code: INVALID_ARGUMENT | Application Code: UNSUPPORTED_ITEM_TYPE | Description: Wix doesn't support the specified `itemType`. The error message lists the item types that are supported.
   HTTP Code: 428 | Status Code: FAILED_PRECONDITION | Application Code: BULK_NOT_SUPPORTED_FOR_ITEM_TYPE | Description: The item type doesn't support setting tags for multiple items at once. Set the items one at a time with Set Item SEO Tags instead.


```

### Examples

### Set the titles of several pages in one call
The code filters the results for entries that failed, although both entries succeed here.

```javascript
import { itemSeoTags } from "@wix/seo";

async function bulkSetItemSeoTags() {
  const response = await itemSeoTags.bulkSetItemSeoTags("STATIC_PAGE", {
    entries: [
      {
        itemId: "c1dmp",
        itemSeoTags: {
          tags: [{ type: "title", children: "Winter collection | Ceramics studio" }],
        },
        fieldMask: ["tags"],
      },
      {
        itemId: "j4xh7",
        itemSeoTags: {
          tags: [{ type: "title", children: "Journal | Ceramics studio" }],
        },
        fieldMask: ["tags"],
      },
    ],
    returnEntity: true,
  });
  // bulkSetItemSeoTags resolves even when individual items fail, so check the results
  // rather than assuming every item was written.
  const failedEntries = response.results.filter(
    ({ itemMetadata }) => itemMetadata?.success !== true,
  );
  return { response, failedEntries };
}

/* Promise resolves to:
 * {
 *   "results": [
 *     {
 *       "itemMetadata": { "id": "c1dmp", "originalIndex": 0, "success": true },
 *       "item": { "_id": "STATIC_PAGE:c1dmp", "itemId": "c1dmp", "hasOverride": true }
 *     },
 *     {
 *       "itemMetadata": { "id": "j4xh7", "originalIndex": 1, "success": true },
 *       "item": { "_id": "STATIC_PAGE:j4xh7", "itemId": "j4xh7", "hasOverride": true }
 *     }
 *   ],
 *   "bulkActionMetadata": {
 *     "totalSuccesses": 2,
 *     "totalFailures": 0,
 *     "undetailedFailures": 0
 *   }
 * }
 */

```

### bulkSetItemSeoTags (self-hosted)
Self-hosted SDK calls require you to [create a client](https://dev.wix.com/docs/sdk/articles/work-with-the-sdk/about-the-wix-client.md).

```javascript
import { createClient } from '@wix/sdk';
import { itemSeoTags } from '@wix/seo';
// Import the auth strategy for the relevant access type
// Import the relevant host module if needed

const myWixClient = createClient ({
  modules: { itemSeoTags },
  // Include the auth strategy and host as relevant
});


async function bulkSetItemSeoTags(itemType,options) {
  const response = await myWixClient.itemSeoTags.bulkSetItemSeoTags(itemType,options);
};
```

---