

# Work with multi-product solutions
<a name="work-with-multi-product-solutions"></a>

AWS Marketplace multi-product solutions combine multiple products and services to address specific customer needs. Two capabilities support this:
+ **Solutions** – Dedicated pages that show customers how your AWS Marketplace products work together.
+ **Offer sets** – Unified transactions that group multiple private offers, allowing customers to accept all offers with a single action.

You can use these capabilities independently or together. Use solutions to improve product discovery, offer sets to streamline procurement, or both for a complete multi-product experience.

**Topics**
+ [Work with solutions](work-with-solutions.md)
+ [Work with offer sets](work-with-offer-sets.md)

# Work with solutions
<a name="work-with-solutions"></a>

A solution is a collection of products and services that work together to solve specific customer problems. Solutions can include AWS Marketplace products and non-AWS Marketplace products. Solutions help you showcase how multiple products integrate to address industry-specific use cases. The solution describes the customer problem, use cases, integration details, and related products.

## Solutions in AWS Marketplace and AWS Partner Central
<a name="solutions-in-marketplace-partner-central"></a>

When you migrate from Partner Central 2.0 to Partner Central 3.0, you're prompted to create an AWS account and register as an AWS Marketplace seller. For more information, see [Register and create your seller profile](https://docs.aws.amazon.com/marketplace/latest/userguide/create-public-profile.html). This registration is required to:
+ Migrate your existing Partner Central solutions to the AWS Marketplace catalog (all solutions will be migrated to `AWSMarketplace` catalog)
+ Enable your AWS Marketplace solutions to work with Partner Central APIs, such as [Selling APIs](https://docs.aws.amazon.com/partner-central/latest/APIReference/working-with-your-opportunities.html).

### Understanding profile linking and migration
<a name="understanding-profile-linking-migration"></a>

There are two distinct scenarios for connecting your Partner Central and AWS Marketplace accounts:

**Profile linking only** – If you link your AWS Partner Central and AWS accounts without migrating to Partner Central 3.0, your AWS Marketplace solutions and Partner Central solutions remain separate. You manage each platform independently.

**Profile migration** – When you migrate to Partner Central 3.0 with linked AWS Marketplace seller profiles:
+ Your Partner Central 2.0 solutions migrate to AWS Marketplace
+ You manage solutions through AWS Marketplace only
+ Partner Central APIs can access migrated solutions

**Note**  
If you have already linked your AWS Partner Central and AWS accounts (see [Linking AWS Partner Central and AWS accounts](https://docs.aws.amazon.com/partner-central/latest/getting-started/account-linking.html)), you don't need to create a new AWS account. However, verify that your existing AWS account is registered as an AWS Marketplace seller. To make your solution publicly available on AWS Marketplace buyer website, you need a public profile as an AWS Marketplace seller. For AWS Marketplace seller registration instructions, see [Register and create your seller profile](https://docs.aws.amazon.com/marketplace/latest/userguide/create-public-profile.html).

### Making pre-existing AWS Marketplace solutions available to Partner Central APIs
<a name="making-pre-existing-solutions-available"></a>

AWS Marketplace solutions that you created before the Partner Central 3.0 profile migration aren't automatically recognized by Partner Central APIs. This applies even after you complete the migration and link your AWS account with a Partner Central account.

To make an existing pre-migration solution visible to Partner Central APIs, update any field in the solution. You can enter the same information that's currently there. Repeat this process for each solution you created before the Partner Central 3.0 profile migration.

For example, use the `UpdateInformation` change type to update a solution's name with its current value. After you update a solution once, Partner Central APIs will automatically recognize any future updates to that solution.

## Solution entity
<a name="solution-entity"></a>

A solution is a marketing document that helps buyers discover and understand your offerings. Solutions contain a title, description, use cases, AWS Marketplace products, and non-AWS Marketplace products. Solution is a separate entity type from product, offer, and offer sets. Each solution has its own discovery and listing experience that buyers can browse separately from individual products.

**Key characteristics**
+ Group multiple products, including both AWS Marketplace products and non-AWS Marketplace products.
+ Create a dedicated discovery and listing experience for buyers.
+ Group products that you own with products from other sellers.

The solution entity type is `Solution@1.0`.

**Entity identifiers**

Solutions use the `soln-*` identifier format (for example, `soln-abc123def456`).

**Entity ARN format**

Solutions follow the standard AWS ARN format:

```
arn:{aws-partition}:aws-marketplace:{region}:{account-id}:{aws-marketplace-catalog}/Solution/{solution-id}
```

Example:

```
arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/soln-abc123def456
```

## Getting started with solutions
<a name="getting-started-with-solutions"></a>

This section provides detailed information about creating and managing solutions using AWS Marketplace Catalog API [change types](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_Change.html).

Before you begin, make sure you have:
+ Valid AWS Marketplace seller registration and a public profile. For more information, see [Register and create your seller profile](https://docs.aws.amazon.com/marketplace/latest/userguide/create-public-profile.html).
+ Access to the API and completed seller prerequisites. For more information, see [Access control for the AWS Marketplace Catalog API](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-api-access-control.html).
+ Learned the basics of using the AWS Marketplace Catalog API, see [Using the AWS Marketplace Catalog API](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html).

## List your solutions
<a name="list-your-solutions"></a>

To list all solutions in your account, call the `ListEntities` API operation and set `EntityType` to Solution.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "Solution"
}
```

**Response**

```
{
  "EntitySummaryList": [
    {
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/soln-abc123456",
      "EntityId": "soln-abc123456",
      "EntityType": "Solution",
      "LastModifiedDate": "2024-10-10T19:50:43Z",
      "Name": "Test Solution 1",
      "Visibility": "Limited"
    }
  ],
  "NextToken": null
}
```

### Filter solutions by visibility
<a name="filter-solutions-by-visibility"></a>

You can filter solutions by visibility using the `FilterList` parameter.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "Solution",
  "FilterList": [
    {
      "Name": "Visibility",
      "ValueList": [
        "Public"
      ]
    }
  ]
}
```

## Get solution details
<a name="get-solution-details"></a>

To get detailed information about a specific solution, call the `DescribeEntity` API operation.

**Note**  
The DescribeEntity response returns an `EntityIdentifier` that combines an `EntityId` with a `RevisionId.` For solutions, `EntityId` is the solution ID, and `RevisionId` can be used for optimistic locking. For more information, see [Identifiers](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#identifier).

**Request**

```
GET /DescribeEntity?catalog=AWSMarketplace&entityId=soln-abc123456 HTTP/1.1
```

**Response**

```
{
  "Details": "{...}",
  "DetailsDocument": {
    "Lifecycle": {
      "Visibility": "Limited"
    },
    "Identifiers": {
      "Id": "soln-abc123456"
    },
    "Presentation": {
      "Title": "My Solution",
      "Name": "solution_for_customer_X",
      "ShortDescription": "Solution value proposition",
      "LongDescription": "Detailed solution description",
      "LogoUrl": "https://s3.amazonaws.com/logo.jpg",
      "UseCases": [
        {
          "Group": "advertising_and_marketing",
          "SubGroup": "ad_intelligence_and_measurement",
          "Item": "amazon_ads_insights",
          "Description": "Use case description"
        }
      ]
    },
    "RelatedProducts": {
      "AwsMarketplaceProducts": [
        {
          "ProductId": "prod-123"
        }
      ],
      "IntegrationDescription": "How products work together",
      "NonAwsMarketplaceProducts": [
        {
          "Type": "Hardware",
          "Title": "A hardware product",
          "Url": "https://example.com",
          "Description": "My hardware product description"
        }
      ]
    },
    "BuyerEngagement": [
      {
        "EngagementOption": "RequestPrivateOffer"
      }
    ]
  },
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/soln-abc123456",
  "EntityIdentifier": "soln-abc123456@12",
  "EntityType": "Solution@1.0",
  "LastModifiedDate": "2025-04-22T01:02:48Z"
}
```

## List change history for a solution
<a name="list-change-history-for-solution"></a>

To view the change history for a specific solution, call the `ListChangeSets` API operation with an entity filter.

**Request Syntax**

```
POST /ListChangeSets HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "FilterList": [
    {
      "Name": "EntityId",
      "ValueList": [
        "soln-abc123456"
      ]
    }
  ]
}
```

## Tag solutions and change sets
<a name="tag-solutions-and-change-sets"></a>

You can add tags to solutions and change sets during creation or update them later.

**Tag during creation**

You can add `EntityTags` only to the `CreateSolution` change type, not to other solution change types. You can add `ChangeSetTags` to any `StartChangeSet` payload.

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateSolution",
      "Entity": {
        "Type": "Solution@1.0"
      },
      "DetailsDocument": {
        "Name": "Test solution resource name"
      },
      "EntityTags": [
        {
          "Key": "Team",
          "Value": "Solutions"
        }
      ]
    }
  ],
  "ChangeSetTags": [
    {
      "Key": "Environment",
      "Value": "Production"
    }
  ]
}
```

**Manage tags on existing resources**

Use the `TagResource` and `UntagResource` API operations to manage tags on existing solutions and change sets. Use `ListTagsForResource` to view current tags.

For more information, see [Managing tags on resources](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-api-access-control.html#managing-tags-on-resources) and [Adding tags to an entity and change set during creation](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-api-access-control.html#example-adding-tags-entity-creation).

## Create a solution
<a name="create-solution"></a>

You can use the `CreateSolution` change type to create a new solution document with only a solution ID and name. Other values aren't yet filled in.

When your request is processed successfully, AWS Marketplace creates a solution in `Draft` status for you. This incomplete solution isn't visible to buyers on AWS Marketplace.

You then use other change types to complete the solution: `UpdateInformation`, `UpdateRelatedProducts`, `UpdateBuyerEngagementOptions` (optional for creating a `Limited` solution), and `ReleaseSolution`. The `ReleaseSolution` change type validates that all required fields needed for a `Limited` solution are present on the solution, and then moves it to `Limited` visibility.

**Note**  
To move a solution to Public status or to change a solution's status, use the `UpdateVisibility` change type after providing the required values.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateSolution",
      "Entity": {
        "Type": "Solution@1.0"
      },
      "ChangeName": "CreateSolutionChange",
      "DetailsDocument": {
        "Name": "solution_for_customerX_en",
        "Title": "New Partner Solution"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateSolution` change type:
+ `Entity` (object) (required) – The named type of the solution entity being created.
  + `Type` (string) (required) – The `Type` must be `Solution@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `Name` (string) (required) – AWS resource name for seller's own reference only (not visible to buyers). Max length: 100 characters. Must not contain leading or trailing whitespaces, linebreaks or control characters. You can also update the solution tile via the `UpdateInformation` change type.
  + `Title` (string) (optional) – The title for your solution. Max length: 255 characters. Must not contain leading or trailing whitespaces, linebreaks or control characters. You can also set or update the solution title via the `UpdateInformation` change type.

**Response Syntax**

A change set is created for your request. The response gives you the `ChangeSetId` and `ChangeSetArn`:

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. You can check the status using the AWS Marketplace Management Portal or the `DescribeChangeSet` API operation.

When the request is completed successfully (if the `Status` is `SUCCEEDED`), a new solution ID is generated.

**Asynchronous Errors**

`CreateSolution` actions return specific errors, in addition to [common asynchronous errors](#solution-error-codes). You receive these errors from `DescribeChangeSet` after a change set finishes processing. To learn how to get change request status, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INVALID\$1NAME | The solution Name length isn't valid. Enter a Name that's between 1 and 100 characters and try again. | 
| MISSING\$1NAME | A Name value is required. Specify a Name value and try again. | 
| INVALID\$1TITLE | The solution Title length isn't valid. Enter a Title that's between 1 and 255 characters and try again. | 

## Update solution information
<a name="update-solution-information"></a>

If you already have a solution in AWS Marketplace, you can use the Catalog API to update the solution information.

To update solution information, call the `StartChangeSet` API operation with the `UpdateInformation` change type and your updated details. See the following example.

**Note**  
The `UpdateInformation` change types behave like HTTP PATCH operations for top-level attributes. How fields are updated:  
If a top-level attribute is present in the `DetailsDocument`, the workflow validates your input and overwrites existing values.
If a top-level field is not present in the `DetailsDocument`, the existing value is preserved.
To unset an optional field, send an explicit JSON `null` for that field.

AWS Marketplace verifies and ingests logo and promotional media assets into an AWS Marketplace-owned location. DescribeEntity returns an accessible URL for the ingested files, not your original input from StartChangeSet. To see your original submitted URLs, use the DescribeChangeSet API.

**Note**  
When you modify `PromotionalMedia` asset files (by providing new URLs) on a `Public` solution, `UpdateInformation` requires manual review from the AWS Marketplace Seller Operations team. This increases execution time. In this scenario, use `UpdateInformation` separately in its own change set.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateInformation",
      "Entity": {
        "Identifier": "soln-1234abcd",
        "Type": "Solution@1.0"
      },
      "DetailsDocument": {
        "Name": "project_cold_harbor",
        "Title": "My Awesome Solution",
        "ShortDescription": "Solution value proposition",
        "LongDescription": "Detailed solution description explaining how this addresses customer needs",
        "LogoUrl": "https://s3.amazonaws.com/awsmp-logos/logo.jpg",
        "PromotionalMedia": [
          {
            "Type": "Image",
            "Url": "https://s3.amazonaws.com/awsmp-media/image.jpg",
            "Title": "Sample image",
            "Description": "Sample image description"
          },
          {
            "Type": "Video",
            "Url": "https://s3.amazonaws.com/awsmp-media/video.mp4",
            "Title": "Sample video",
            "PreviewUrl": "https://s3.amazonaws.com/awsmp-media/preview.png",
            "Description": "Sample video description"
          }
        ],
        "AdditionalResources": [
          {
            "Text": "Troubleshooting guide",
            "Url": "https://example.com/troubleshooting"
          }
        ],
        "UseCases": [
          {
            "Group": "advertising_and_marketing",
            "SubGroup": "ad_intelligence_and_measurement",
            "Item": "amazon_ads_insights",
            "Description": "Highlight description of this use case"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateInformation` change type:
+ `Entity` (object) (required) – The named type of entity being updated.
  + `Identifier` (string) (required) – The solution ID.
  + `Type` (string) (required) – Must be `Solution@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request including the information that you want to update for your solution. Each field is optional, but you must include at least one change to update.
  + `Name` (string) — The resource name of the solution, visible only to the seller via Catalog API read operations, not visible to buyers. Max length: 100 characters. Must not contain leading or trailing whitespaces, linebreaks or control characters.
  + `Title` (string) – The title of the solution to be displayed to buyers. Max length: 255 characters. Must not contain leading or trailing whitespaces, linebreaks or control characters.
  + `ShortDescription` (string) – The value proposition description of key aspects of the solution to be displayed to buyers. This is usually 2–3 sentences. Max length: 1000 characters. Must not contain leading or trailing whitespaces or control characters.
  + `LongDescription` (string) – The longer description of this solution to be displayed to buyers. This is usually 1–3 paragraphs. Max length: 5000 characters. Must not contain leading or trailing whitespaces or control characters.
  + `LogoUrl` (string) – The URL to an image in a publicly accessible Amazon S3 bucket or a presigned S3 URL. Must be a direct S3 URL (not behind CloudFront or API Gateway). Max length: 2048 characters. For logo specifications, see [Company and product logo requirements](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#seller-and-product-logos).
  + `PromotionalMedia` (array of objects) – The list of promotional images and videos. Max 15 items (5 videos and 10 images). For promotional media specifications, see [Enhance your AWS Marketplace product with promotional media](https://docs.aws.amazon.com/marketplace/latest/userguide/promotional-media.html).
    + `Type` (string) (required) – Either `Image` or `Video`.
    + `Url` (string) (required) – The URL to the media file. Must be a direct S3 URL or presigned S3 URL. Max length: 2048 characters. Must be an https URL.
    + `Title` (string) (required) – The title of the media. Max length: 100 characters. Must not contain leading or trailing whitespaces, linebreaks, or control characters.
    + `Description` (string) (required) – The description of the media. Max length: 200 characters. Must not contain leading or trailing whitespaces or control characters.
    + `PreviewUrl` (string) (optional) – For videos only, the URL to a preview image. Max length: 2048 characters. Must be an https URL.
  + `AdditionalResources` (array of objects) – The list of references to additional resources. Max 8 items.
    + `Text` (string) – The name or title of the resource. Max length: 500 characters. Must not contain leading or trailing whitespaces, linebreaks, or control characters.
    + `Url` (string) – The URL to the resource. Max length: 2048 characters. Must be an https URL.
  + `UseCases` (array of objects) – The list of use cases that this solution addresses. Max 3 items. For valid use case categories (a combination of Group, SubGroup, and Item), see [use case categories list](https://d1z4dgsxp8pfa2.cloudfront.net/awsmp-solutions/use-case-categories-list.json) for active accepted values and their [introduction labels](https://d1z4dgsxp8pfa2.cloudfront.net/awsmp-solutions/i18n/en.json). The combination of Group, SubGroup, and Item must be a valid item in the use case categories list.
    + `Group` (string) – Industry or technology category. Must be one of the Group values in [use case categories list](https://d1z4dgsxp8pfa2.cloudfront.net/awsmp-solutions/use-case-categories-list.json).
    + `SubGroup` (string) – Use case group within the category. Must be one of the SubGroup values in [use case categories list](https://d1z4dgsxp8pfa2.cloudfront.net/awsmp-solutions/use-case-categories-list.json).
    + `Item` (string) – Specific use case. Must be one of the Item values in [use case categories list](https://d1z4dgsxp8pfa2.cloudfront.net/awsmp-solutions/use-case-categories-list.json).
    + `Description` (string) – Description of how this solution addresses the use case. Max length: 500 characters. Must not contain leading or trailing whitespaces or control characters.

For presigned URL information, see [Sharing objects with presigned URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html).

**Note**  
When calling UpdateInformation change type, you can always provide a subset of fields to be updated in the `DetailsDocument` object. However, before moving a solution from `Draft` to `Limited`, the following fields must be set properly: `Title`, `ShortDescription`, `LongDescription`, and `LogoUrl`.  
However, when you are updating existing fields on the solution, you can include only the attributes that need to be changed in the `DetailsDocument` object of the `UpdateInformation` change type.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. To check request status, use the AWS Marketplace Management Portal or call the `DescribeChangeSet` API.

After triggering this change type with `PromotionalMedia` assets modified for a `Public` solution, it can take up to 37 days to complete. This includes the time the AWS Marketplace Seller Operations Team needs to review, audit, and approve.

**Asynchronous Errors**

In addition to [common asynchronous errors](#solution-error-codes), the following errors are specific to `UpdateInformation` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INVALID\$1SHORT\$1DESCRIPTION | The solution ShortDescription length isn't valid. Enter a ShortDescription that's between 1 and 1000 characters and try again. | 
| INVALID\$1LONG\$1DESCRIPTION | The solution LongDescription length isn't valid. Enter a LongDescription that's between 1 and 5000 characters and try again. | 
| INVALID\$1NAME | The solution Name length isn't valid. Enter a Name that's between 1 and 100 characters and try again. | 
| INVALID\$1TITLE | The solution Title length isn't valid. Enter a Title that's between 1 and 255 characters and try again. | 
| INVALID\$1ADDITIONAL\$1RESOURCES | The solution AdditionalResources[%d].Text length isn't valid. Enter a Text that's between 1 and 500 characters and try again. | 
| INVALID\$1ADDITIONAL\$1RESOURCES | The following URLs in the provided additional resources are inaccessible: [%s]. Provide valid and accessible URLs | 
| INVALID\$1ADDITIONAL\$1RESOURCES | A Url value is required. Specify a Url value and try again. | 
| INVALID\$1ADDITIONAL\$1RESOURCES | Text cannot be missing. Provide a Text | 
| INVALID\$1USE\$1CASE | The solution UseCases[%d].Description length isn't valid. Enter a Description that's between 1 and 500 characters and try again. | 
| INVALID\$1USE\$1CASE | UseCases[%d].Group: The provided Group (%s) is invalid. Provide a valid Group. | 
| INVALID\$1USE\$1CASE | UseCases[%d].SubGroup: The provided Group (%s) is invalid. Provide a valid SubGroup. | 
| INVALID\$1USE\$1CASE | UseCases[%d].Item: The provided Item (%s) is invalid. Provide a valid Item. | 
| INVALID\$1USE\$1CASE | UseCases[%d].Item: The provided use case is inactive. Provide an active use case | 
| INVALID\$1USE\$1CASE | UseCases[%d].Group: Group cannot be missing. Provide a Group. | 
| INVALID\$1USE\$1CASE | UseCases[%d].SubGroup: SubGroup cannot be missing. Provide a SubGroup. | 
| INVALID\$1USE\$1CASE | UseCases[%d].Item: SubGroup cannot be missing. Provide a Item. | 
| INVALID\$1MEDIA | The solution PromotionalMedia[%d].Title length isn't valid. Enter a Title that's between 1 and 100 characters and try again. | 
| INVALID\$1MEDIA | The solution PromotionalMedia[%d].Description length isn't valid. Enter a Description that's between 1 and 200 characters and try again. | 
| INVALID\$1MEDIA | Invalid URL: %s Provide a new URL for media stored in S3. | 
| INVALID\$1MEDIA | Media location not accessible: %s Provide a new, accessible URL for media stored in one of the following locations: [S3]. | 
| INVALID\$1MEDIA | Image size exceeds %s. Provide an image that is under %s. | 
| INVALID\$1MEDIA | Video size exceeds %s. Provide an video that is under %s. | 
| INVALID\$1MEDIA | Logo size exceeds %s. Provide an logo that is under %s. | 
| INVALID\$1MEDIA | Malware detected in %s. Provide media without malware. | 
| INVALID\$1MEDIA | Inappropriate content: %s detected. Provide media with no inappropriate content | 
| INVALID\$1MEDIA | Explicit content in %s: '\$1ExplicitContent\$1' detected. Provide media without explicit content. | 
| INVALID\$1MEDIA | PromotionalMedia[%s].Url: %s is not in a supported format (%s). Use a well-formed image in a supported format: [JPEG, PNG]. | 
| INVALID\$1MEDIA | PromotionalMedia[%s].Url: %s is not in a supported format (%s). Use a well-formed video in a supported format: [MP4, MOV]. | 
| INVALID\$1MEDIA | LogoUrl at %s has invalid aspect ratio. Provide an image with 1:1 (square) or 2:1 (wide) aspect ratio. | 
| INVALID\$1MEDIA | Logo: %s has invalid dimensions. Provide an image between 120x120 and 1080x1080 pixels. | 
| INVALID\$1MEDIA | PromotionalMedia[%d].Type is not supported. Provide PromotionalMedia in a supported type: %s | 
| DUPLICATE\$1MEDIA | Duplicate media detected: [%s] Provide media items with no duplicates. | 
| INVALID\$1MEDIA | PromotionalMedia[%d].Url: Malware detected in %s. Provide media without malware. | 
| TOO\$1MANY\$1ITEMS | Provide no more than %d %s. | 

## Update related products
<a name="update-related-products"></a>

You can use the Catalog API to update the products and services included in your solution, including AWS Marketplace products and non-AWS Marketplace products.

To update related products, call the `StartChangeSet` API operation with the `UpdateRelatedProducts` change type, as shown in the following example.

**Note**  
The `UpdateRelatedProducts` change type behaves like an HTTP PATCH operation for top-level attributes. You can provide all current AWS Marketplace product types as `AwsMarketplaceProducts` in `UpdateRelatedProducts`.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateRelatedProducts",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "soln-123456"
      },
      "DetailsDocument": {
        "IntegrationDescription": "How to use the products in this solution (usage guide)",
        "AwsMarketplaceProducts": [
          {
            "ProductId": "prod-123"
          },
          {
            "ProductId": "prod-456"
          }
        ],
        "NonAwsMarketplaceProducts": [
          {
            "Type": "Hardware",
            "Title": "Diamond engine",
            "Description": "Hardware details",
            "Url": "https://example.com/hardware-product-specs.html"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateRelatedProducts` change type:
+ `Entity` (object) (required) – The named type of entity being updated.
  + `Identifier` (string) (required) – The solution ID.
  + `Type` (string) (required) – Must be `Solution@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request. Each field is optional, but you must include at least one change to update.
  + `IntegrationDescription` (string) – Description of how the products work together in this solution. Max length: 5000 characters. Must not contain leading or trailing whitespaces or control characters.
  + `AwsMarketplaceProducts` (array of objects) – AWS Marketplace products included in this solution. Max 5 items
    + `ProductId` (string) – AWS Marketplace product ID (a UUID or a string beginning with `prod-`). Max length: 50 characters.
  + `NonAwsMarketplaceProducts` (array of objects) – Products not available on AWS Marketplace. Max 5 items.
    + `Type` (string) (required) – Type of the product. Possible values: `Software`, `Consulting`, `Hardware`, `Communication`, `Professional Service`, `Managed Service`, `Value-Added Resale`, `Training`
    + `Title` (string) (required) – Title of the product. Max length: 255 characters. Must not contain leading or trailing whitespaces, linebreaks, or control characters.
    + `Description` (string) (optional) – Description of the product. Max length: 220 characters. Must not contain leading or trailing whitespaces or control characters.
    + `Url` (string) (optional) – URL to more information about the product. Max length: 2048 characters. Must be an https url.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed.

To check request status, use the AWS Marketplace Management Portal or call the `DescribeChangeSet` API.

**Asynchronous Errors**

In addition to [common asynchronous errors](#solution-error-codes), the following errors are specific to `UpdateRelatedProducts` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1OPERATION\$1UPDATE\$1RELATED\$1PRODUCTS\$1SOLUTION | The operation to update related products isn't supported for public solutions. To make this change, first change the solution's visibility to limited and try again. | 
| INVALID\$1AWS\$1MARKETPLACE\$1PRODUCTS | AWS Marketplace product '%s' is not available for your account. Choose a Public product or a Limited product where you have allowlist access, or contact the seller to request access. | 
| INVALID\$1AWS\$1MARKETPLACE\$1PRODUCTS | The specified product type '%s' isn't supported. Provide one of these valid product types: [AmiProduct, SaaSProduct, ContainerProduct, MachineLearningProduct, ProfessionalServicesProduct, DataProduct] and try again. | 
| INVALID\$1AWS\$1MARKETPLACE\$1PRODUCTS | Product '%s' not found. Provide a valid product ID in the same catalog. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | The specified Non-AWS Marketplace product URLs aren't accessible: [%s]. Verify that the URLs are valid and publicly accessible, and try again. | 
| INVALID\$1INTEGRATION\$1DESCRIPTION | Provide a solution IntegrationDescription between 1 and 5000 characters. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | The solution NonAwsMarketplaceProduct[%d].Title length isn't valid. Enter a Description that's between 1 and 255 characters and try again. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | The solution NonAwsMarketplaceProduct[%d].Description length isn't valid. Enter a Description that's between 1 and 220 characters and try again. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | The solution NonAwsMarketplaceProduct[%d].Type length isn't valid. Enter a Type that's between 1 and 50 characters and try again. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | NonAwsMarketplaceProduct[%d].Type is not a valid non-AWS Marketplace product type. Provide one of the following non-AWS Marketplace product types: [%s] | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | A NonAwsMarketplaceProduct[%d].Title value is required. Specify a Title value and try again. | 
| INVALID\$1NON\$1AWS\$1MARKETPLACE\$1PRODUCTS | A NonAwsMarketplaceProduct[%d].Type value is required. Specify a Type value and try again. | 
| TOO\$1MANY\$1PRODUCTS | The maximum number of AWS Marketplace products you can link is %d. Remove existing linked products before adding new ones. | 
| TOO\$1MANY\$1PRODUCTS | The maximum number of none AWS Marketplace products you can add is %d. Remove existing none AWS Marketplace products before adding new ones. | 
| INVALID\$1AWS\$1MARKETPLACE\$1PRODUCTS | Duplicate AWS Marketplace product IDs aren't allowed. Each product ID must be unique in your solution. | 
| INVALID\$1REMOVE\$1OPERATION | Invalid operation, you can not remove all products. | 

## Release a solution
<a name="release-solution"></a>

You can use the Catalog API to publish a `Draft` solution into `Limited` visibility in AWS Marketplace.

The `ReleaseSolution` change type validates that all required fields for a `Limited` solution are present. It then moves the solution from `Draft` to `Limited` visibility. Once a solution is in `Limited` visibility, you cannot move it back to `Draft` visibility.

To release a solution, call the `StartChangeSet` API operation with the `ReleaseSolution` change type, as shown in the following example.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "ReleaseSolution",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "soln-1234abcd"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `ReleaseSolution` change type:
+ `Entity` (object) (required) – The named type of entity being released.
  + `Identifier` (string) (required) – The solution ID.
  + `Type` (string) (required) – Must be `Solution@1.0`.
+ `DetailsDocument` (object) (required) – Must be an empty object. The change type `ReleaseSolution` doesn't accept any details.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `DescribeChangeSet` API operation.

**Asynchronous Errors**

In addition to [common asynchronous errors](#solution-error-codes), the following errors are specific to `ReleaseSolution` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| MISSING\$1REQUIRED\$1FIELDS | The request is missing required parameters: [%s]. Specify values for all required parameters and try again. | 
| INCOMPATIBLE\$1OPERATION\$1RELEASE\$1SOLUTION | The change type can only be invoked on Solutions in Draft status. Update the Solution's visibility to Draft and try again. | 

## Update buyer engagement options
<a name="update-buyer-engagement-options"></a>

You can use the Catalog API to configure how buyers engage with you about your solution.

**Note**  
To use this change type, you must have active enrollment in the [APN Customer Engagements (ACE)](https://aws.amazon.com/partners/programs/ace/) program. You must also link your AWS account with your AWS Partner Central account that has enrolled in ACE. For instructions, see [Linking AWS Partner Central and AWS accounts](https://docs.aws.amazon.com/partner-central/latest/getting-started/account-linking.html).

To update buyer engagement options, call the `StartChangeSet` API operation with the `UpdateBuyerEngagementOptions` change type, as shown in the following example.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateBuyerEngagementOptions",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "soln-1234abcd"
      },
      "DetailsDocument": [
        {
          "EngagementOption": "RequestProductDemo"
        },
        {
          "EngagementOption": "RequestPrivateOffer"
        }
      ]
    }
  ]
}
```

Provide information for the fields to add the `UpdateBuyerEngagementOptions` change type:
+ `Entity` (object) (required) – The named type of entity being updated.
  + `Identifier` (string) (required) – The solution ID.
  + `Type` (string) (required) – Must be `Solution@1.0`.
+ `DetailsDocument` (array of objects) (required) – The buyer engagement options to enable.
  + `EngagementOption` (string) (required) – The type of engagement option. Valid values: `RequestPrivateOffer`, `RequestProductDemo`.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed.

To check request status, use the AWS Marketplace Management Portal or call the `DescribeChangeSet` API.

**Asynchronous Errors**

In addition to [common asynchronous errors](#solution-error-codes), the following errors are specific to `UpdateBuyerEngagementOptions` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INELIGIBLE\$1SELLER | ACE eligibility validation isn't complete. To proceed: 1) Link your AWS Marketplace account to your APN account, 2) Complete the ACE eligibility requirements. | 

## Update solution visibility
<a name="update-solution-visibility"></a>

You can use the Catalog API to update the visibility of a solution in AWS Marketplace.

You can set target visibilities to `Limited`, `Public`, or `Restricted`.
+ **`Limited`** – The solution is complete and has successfully completed the `ReleaseSolution` change type. You can preview buyer website details of the solution in this visibility. On the AWS Marketplace buyer website, the solution is visible only to the owning account, the owners of each AWS Marketplace product included in the solution, and the AWS Marketplace Seller Operations team.
+ **`Public`** – The solution is visible on AWS Marketplace. Buyers can view and engage with the solution.
+ **`Restricted`** – The solution is no longer visible to the public on the AWS Marketplace buyer website.

**Note**  
To move a solution to `Public` visibility, you must meet the following requirements:  
You must have a public profile on AWS Marketplace.
The solution must have no non-`Public` products.
The solution must have at least 2 `Public` AWS Marketplace products.
The solution must have at least 1 AWS Marketplace product from the same AWS account.
The solution must have the `RequestPrivateOffer` buyer engagement option enabled.
The AWS Marketplace Seller Operations team reviews all requests to move a solution to `Public` visibility. For support, see [Getting support for AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/buyerguide/getting-support.html).

When you set `TargetVisibility` to `Public`, the `UpdateVisibility` change type requires manual review from the AWS Marketplace Seller Operations team. This increases execution time. Use `UpdateVisibility` separately in its own change set.

To update your solution's visibility, call the `StartChangeSet` API operation with the `UpdateVisibility` change type, as shown in the following example.

**Request Syntax**

For when `TargetVisibility` is `Public` or `Limited`.

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateVisibility",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "soln-1234abcd"
      },
      "DetailsDocument": {
        "TargetVisibility": "Public"
      }
    }
  ]
}
```

For when `TargetVisibility` is `Restricted`.

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateVisibility",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "soln-1234abcd"
      },
      "DetailsDocument": {
        "TargetVisibility": "Restricted"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateVisibility` change type:
+ `Entity` (object) (required) – The named type of entity being updated.
  + `Identifier` (string) (required) – The solution ID.
  + `Type` (string) (required) – Must be `Solution@1.0`.
+ `DetailsDocument` (object) (required) – The details required to run the change set.
  + `TargetVisibility` (string) (required) – The intended new visibility of the solution. Possible values: `Public`, `Limited`, and `Restricted`.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `DescribeChangeSet` API operation.

After triggering this change type with `TargetVisibility` as `Public`, it can take up to 37 days to complete. This includes the time the AWS Marketplace Seller Operations Team needs to review, audit, and approve.

**Asynchronous Errors**

The following errors are specific to `UpdateVisibility` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INVALID\$1VISIBILITY\$1TRANSITION | The solution can't be moved back to Draft state. Once released, solutions can only transition between Limited, Public, and Restricted states. | 
| TOO\$1FEW\$1USE\$1CASES | At least one use case is required to make a solution public. Add a use case and try again. | 
| TOO\$1FEW\$1PUBLIC\$1PRODUCTS | A minimum of 2 public AWS Marketplace products are required to make a solution public. Add the required products and try again. | 
| INCOMPATIBLE\$1PRODUCTS | The solution contains one or more non-public AWS Marketplace products. To make the solution public, remove all non-public products and try again. | 
| TOO\$1FEW\$1SELF\$1OWNED\$1PRODUCTS | The solution requires at least one AWS Marketplace product owned by the solution owner. Add an AWS Marketplace product from your account and try again. | 
| INCOMPATIBLE\$1BUYER\$1ENGAGEMENT\$1OPTIONS | The RequestPrivateOffer buyer engagement option must be enabled to make this solution public. Enable RequestPrivateOffer and try again. | 
| INCOMPATIBLE\$1OPERATION\$1UPDATE\$1VISIBILITY | UpdateVisibility isn't supported for solutions in Draft state. Publish the solution first from Draft to Limited using ReleaseSolution, then use UpdateVisibility to change to Public or Restricted. | 
| LIMIT\$1EXCEEDED\$1TOO\$1MANY\$1PUBLIC\$1SOLUTIONS | This account has reached its limit of 5 public solutions. Update an existing public solution to Limited or Restricted visibility and try again. | 
| MISSING\$1SELLER\$1PROFILE\$1INFORMATION | A public seller profile is required to make solutions public. Create a public profile in your seller account and try again. | 

## Common asynchronous error codes
<a name="solution-error-codes"></a>

There are some asynchronous validation that applies across all solution change types, such as checks for url validity and unsupported character, and their error codes and error messages are listed here.

Each URL field provided must use HTTPS protocol, and conform to RFC2396 or RFC 2732 standards.


| Error code | Error message | 
| --- | --- | 
| INVALID\$1INPUT | Invalid '%s' field. Remove unsupported characters %s. | 
| INVALID\$1INPUT | Inappropriate content '%s' found in %s field. Provide %s with no inappropriate content. | 
| UNSUPPORTED\$1CATALOG | Requested catalog %s is not supported by this change type. | 
| INVALID\$1REMOVE\$1OPERATION | Invalid operation, you can not remove %s | 
| AUDIT\$1ERROR | (varies based on AWS Marketplace Seller Operations team audit result) | 

## Solution lifecycle
<a name="solution-lifecycle"></a>

Solutions progress through the following visibility values:
+ `Draft` - Initial visibility after creation. You can progressively add information using other change types.
+ `Limited` - Solution is complete and visible to you and product owners for preview. You achieve this by using `ReleaseSolution`.
+ `Public` - Solution is visible to all buyers browsing the AWS Marketplace website. This requires additional validation.
+ `Restricted` - Solution is no longer visible to new buyers.

**Important**  
Once a solution moves from `Draft` to `Limited` visibility, you cannot move it back to `Draft`. `ReleaseSolution` validates that all required fields for a `Limited` solution are present before the transition to `Limited` visibility.

### Minimum requirements for a complete solution
<a name="minimum-requirements-complete-solution"></a>

To create a complete solution and publish it beyond Draft status, you need the following change types and attributes:
+ **`CreateSolution`**: `Name`
+ **`UpdateInformation`**: `Title`, `ShortDescription`, `LongDescription`, `LogoUrl`
+ **`UpdateRelatedProducts`**: `IntegrationDescription`, at least one item across `AwsMarketplaceProducts` and `NonAwsMarketplaceProducts`
+ **`ReleaseSolution`**

The following example shows you how to create a complete solution with `Limited` visibility in a single change set:

```
{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateSolution",
      "Entity": {
        "Type": "Solution@1.0"
      },
      "ChangeName": "CreateSolutionChange",
      "DetailsDocument": {
        "Name": "complete_solution_example",
        "Title": "Complete Solution Example"
      }
    },
    {
      "ChangeType": "UpdateInformation",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "$CreateSolutionChange.Entity.Identifier"
      },
      "ChangeName": "UpdateInformationChange",
      "DetailsDocument": {
        "ShortDescription": "A comprehensive solution for customer needs",
        "LongDescription": "This solution combines multiple products to address specific customer requirements in the advertising and marketing space.",
        "LogoUrl": "https://s3.amazonaws.com/awsmp-logos/solution-logo.jpg",
        "UseCases": [
          {
            "Group": "advertising_and_marketing",
            "SubGroup": "ad_intelligence_and_measurement",
            "Item": "amazon_ads_insights",
            "Description": "Provides comprehensive advertising insights and measurement capabilities"
          }
        ]
      }
    },
    {
      "ChangeType": "UpdateRelatedProducts",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "$CreateSolutionChange.Entity.Identifier"
      },
      "ChangeName": "UpdateRelatedProductsChange",
      "DetailsDocument": {
        "AwsMarketplaceProducts": [
          {
            "ProductId": "prod-123"
          }
        ],
        "IntegrationDescription": "These products work together to provide end-to-end advertising analytics and optimization capabilities."
      }
    },
    {
      "ChangeType": "UpdateBuyerEngagementOptions",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "$CreateSolutionChange.Entity.Identifier"
      },
      "ChangeName": "UpdateBuyerEngagementChange",
      "DetailsDocument": [
        {
          "EngagementOption": "RequestPrivateOffer"
        }
      ]
    },
    {
      "ChangeType": "ReleaseSolution",
      "Entity": {
        "Type": "Solution@1.0",
        "Identifier": "$CreateSolutionChange.Entity.Identifier"
      },
      "ChangeName": "ReleaseSolutionChange",
      "DetailsDocument": {}
    }
  ]
}
```

## IAM permissions for solutions
<a name="solution-iam-permissions"></a>

AWS Marketplace Catalog API uses standard IAM permissions. See [Access control for the AWS Marketplace Catalog API](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-api-access-control.html) for more details.

You can use `AWSMarketplaceSellerProductFullAccess` to perform all operations necessary for accessing Solution via Catalog API and Partner Central 3.0 in AWS Management Console.

### Sample IAM policy for solutions
<a name="sample-iam-policy-solutions"></a>

The following sample IAM policy allows specific actions (`DescribeEntity`, `ListEntities`, and `StartChangeSet`) on `Solution@1.0` entity. You can further narrow it down to restrict a principal's access to certain change types on certain entity IDs, or widen it up to allow a principal to also operate on another entity type supported by Catalog API.

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:StartChangeSet"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*",
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/*"
      ],
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": [
            "CreateSolution",
            "UpdateInformation",
            "UpdateRelatedProducts",
            "ReleaseSolution",
            "UpdateBuyerEngagementOptions",
            "UpdateVisibility"
          ]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:ListEntities",
        "aws-marketplace:DescribeEntity"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:DescribeChangeSet",
        "aws-marketplace:ListChangeSets",
        "aws-marketplace:CancelChangeSet"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:TagResource",
        "aws-marketplace:UntagResource",
        "aws-marketplace:ListTagsForResource"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*",
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/*"
      ]
    }
  ]
}
```

### Restricting access to specific solutions
<a name="restricting-access-specific-solutions"></a>

You can restrict access to specific solutions by using the solution ID in the resource ARN:

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:DescribeEntity",
        "aws-marketplace:StartChangeSet"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/soln-specific123"
      ]
    }
  ]
}
```

### Restricting access to specific change types
<a name="restricting-access-specific-change-types"></a>

You can restrict access to specific change types using condition keys:

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:StartChangeSet"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*"
      ],
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": [
            "UpdateInformation",
            "UpdateRelatedProducts"
          ]
        }
      }
    }
  ]
}
```

# Work with offer sets
<a name="work-with-offer-sets"></a>

AWS Marketplace offer sets enable sellers to package multiple private offers into unified multi-product transactable packages for buyers. This capability addresses growing customer demand for comprehensive, end-to-end solutions in complex enterprise environments.

Traditionally, buyers had to discover and procure individual products from multiple sellers, resulting in fragmented experiences, integration challenges, and longer procurement cycles. Offer sets simplify this by allowing AWS Marketplace partners to combine multiple offers together, streamlining the transaction process through coordinated private offers where customers can review and accept all components with one-time approval.

Offer sets work together with solutions to provide comprehensive multi-product offerings. Solutions provide rich marketing content including detailed descriptions, architecture diagrams, and use case documentation, while offer sets handle the transactable packaging and commercial terms for unified procurement.

## Offer set entity
<a name="offer-set-entity"></a>

An offer set is a container that groups 2-7 private offers into a single transactable package. Each offer within an offer set maintains its own distinct pricing, payment terms, duration, and End User License Agreement (EULA), while the offer set provides a unified discovery and acceptance experience for buyers.

**Key characteristics:**
+ Groups multiple private offers (minimum 2, maximum 7)
+ Enables unified buyer acceptance of all offers with a single action
+ Maintains flexibility with distinct terms for each offer
+ Creates separate agreements for each product, allowing independent management after purchase
+ Can be optionally associated with a solution for enhanced marketing content

The offer set entity type is `OfferSet@1.0`.

**Entity identifiers**

Offer sets use the `offerset-*` identifier format (for example, `offerset-abc123def456`).

**Entity ARN format**

Offer sets follow the standard AWS ARN format:

```
arn:aws:aws-marketplace:{region}:{account-id}:AWSMarketplace/OfferSet/{offerset-id}
```

Example:

```
arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/offerset-abc123def456
```

## Getting started with offer sets
<a name="getting-started-with-offer-sets"></a>

This section provides detailed information about creating and managing offer sets using AWS Marketplace Catalog API [change types](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_Change.html).

Before you begin, make sure you have:
+ Valid AWS Marketplace seller registration and a public profile. For more information, see [Register and create your seller profile](https://docs.aws.amazon.com/marketplace/latest/userguide/create-public-profile.html).
+ Access to the API and completed seller prerequisites. For more information, see [Access control for the AWS Marketplace Catalog API](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-api-access-control.html).
+ Learned the basics of using the AWS Marketplace Catalog API, see [Using the AWS Marketplace Catalog API](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html).

## List offer sets
<a name="list-offer-sets"></a>

To list all offer sets in your account, call the `ListEntities` API operation with `EntityType` set to `OfferSet`.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "OfferSet"
}
```

**Response**

```
{
  "EntitySummaryList": [
    {
      "EntityType": "OfferSet",
      "EntityId": "offerset-xyz123",
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/offerset-xyz123",
      "LastModifiedDate": "2025-06-25T23:46:25Z",
      "OfferSetSummary": {
        "Name": "Enterprise Security Solution Offer Set",
        "State": "Released",
        "ReleaseDate": "2025-06-25T23:46:20Z",
        "SolutionId": "soln-abc987",
        "AssociatedOfferIds": [
          "offer-abc123",
          "offer-def456",
          "offer-ghi789"
        ]
      }
    }
  ],
  "NextToken": null
}
```

### Filter offer sets by state
<a name="filter-offer-sets-by-state"></a>

You can filter offer sets by state using the `EntityTypeFilters` parameter.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "OfferSet",
  "EntityTypeFilters": {
    "OfferSetFilters": {
      "State": {
        "ValueList": [
          "Released"
        ]
      }
    }
  }
}
```

### Filter offer sets by solution ID
<a name="filter-offer-sets-by-solution-id"></a>

You can filter offer sets by solution ID using the `EntityTypeFilters` parameter.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "OfferSet",
  "EntityTypeFilters": {
    "OfferSetFilters": {
      "SolutionId": {
        "ValueList": [
          "soln-abc987"
        ]
      }
    }
  }
}
```

### Filter offer sets by release date
<a name="filter-offer-sets-by-release-date"></a>

You can filter offer sets by release date and sort the results using the `EntityTypeFilters` and `EntityTypeSort` parameters.

**Request**

```
POST /ListEntities HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "EntityType": "OfferSet",
  "EntityTypeFilters": {
    "OfferSetFilters": {
      "ReleaseDate": {
        "AfterValue": "2025-11-01"
      }
    }
  },
  "EntityTypeSort": {
    "OfferSetSort": {
      "SortBy": "ReleaseDate",
      "SortOrder": "DESCENDING"
    }
  }
}
```

## Describe an offer set
<a name="describe-offer-set"></a>

To get detailed information about a specific offer set, call the `DescribeEntity` API operation.

**Request**

```
GET /DescribeEntity?catalog=AWSMarketplace&entityId=offerset-xyz123 HTTP/1.1
```

**Response**

```
{
  "EntityType": "OfferSet@1.0",
  "EntityId": "offerset-xyz123",
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/offerset-xyz123",
  "LastModifiedDate": "2025-06-25T23:46:25Z",
  "DetailsDocument": {
    "Id": "offerset-xyz123",
    "Name": "Enterprise Security Solution Offer Set",
    "BuyerNotes": "Complete security solution including endpoint protection and network monitoring",
    "State": "Released",
    "SolutionId": "soln-abc987",
    "ReleaseDate": "2025-06-25T23:46:20Z",
    "AssociatedOffers": [
      {
        "OfferId": "offer-abc123"
      },
      {
        "OfferId": "offer-def456"
      },
      {
        "OfferId": "offer-ghi789"
      }      
    ]
  }
}
```

## Create an offer set
<a name="create-offer-set"></a>

Use the `CreateOfferSet` change type to create a new offer set entity in Draft state. This is the first step in the offer set lifecycle, establishing the foundational entity that will later be configured with offer associations and metadata before releasing to buyers.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateOfferSet",
      "Entity": {
        "Type": "OfferSet@1.0"
      },
      "ChangeName": "CreateOfferSetChange",
      "DetailsDocument": {
        "Name": "Enterprise Security Solution Offer Set"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateOfferSet` change type:
+ `Entity` (object) (required) – The entity type being created.
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `Name` (string) (required) – The name associated with the offer set for better readability to you and your customers. Minimum length: 1 character. Maximum length: 150 characters.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

After successful processing, AWS Marketplace generates an offer set in Draft state with a unique identifier prefixed with `offerset-`.

## Update offer set information
<a name="update-offer-set-information"></a>

Use the `UpdateInformation` change type to modify the details of an existing offer set, including its name and buyer notes.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateInformation",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {
        "Name": "Updated Enterprise Security Offer Set",
        "BuyerNotes": "Complete security solution including endpoint protection, network monitoring, and professional services implementation"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateInformation` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – At least one field must be provided.
  + `Name` (string) (optional) – Display name visible to buyers. Minimum length: 1 character. Maximum length: 150 characters.
  + `BuyerNotes` (string) (optional) – Detailed information about the offer set that helps buyers understand its purpose and contents. Minimum length: 1 character. Maximum length: 1,000 characters.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

## Associate offers with an offer set
<a name="associate-offers"></a>

Use the `AssociateOffers` change type to associate multiple AWS Marketplace offers with an offer set. This creates the relationship between offers and the offer set, making the offers part of the offer set's transactable configuration.

The operation is idempotent and allows associating offers regardless of their current state, enabling complete configuration before individual offers are released. Each offer can only belong to one offer set.

**Important**  
The `OfferSetId` on individual offers is immutable and can only be set during offer creation. Before associating offers with an offer set using `AssociateOffers`, you must first create the individual offers and specify the `OfferSetId` during offer creation. If you need to include an existing offer that doesn't have the correct `OfferSetId`, you must create a new offer with the correct `OfferSetId` specified.

For information about required IAM permissions, see [](#iam-permissions-offer-sets).

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "AssociateOffers",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {
        "Offers": [
          {
            "OfferId": "offer-xyz789"
          },
          {
            "OfferId": "offer-def456"
          },
          {
            "OfferId": "offer-ghi123"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `AssociateOffers` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `Offers` (array) (required) – List of AWS Marketplace offers to associate. Minimum: 1 item. Maximum: 7 items.
    + `OfferId` (string) (required) – The identifier of the AWS Marketplace offer. Minimum length: 1 character. Maximum length: 36 characters.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

### Asynchronous Errors
<a name="associate-offers-asynchronous-errors"></a>

The following errors are specific to `AssociateOffers` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| TOO\$1MANY\$1OFFERS | Associate up to 7 offers to the offer set. | 
| INCOMPATIBLE\$1OFFER\$1SET\$1REFERENCE | Ensure all offers were created specifically for this offer set. | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer set released. | 

## Disassociate offers from an offer set
<a name="disassociate-offers"></a>

Use the `DisassociateOffers` change type to remove multiple AWS Marketplace offers from an offer set. This idempotent operation removes the association relationship while preserving the offer's `OfferSetId` attribute. Disassociated offers become hidden from buyer discovery until re-associated with the same offer set. They cannot be associated with a different offer set.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "DisassociateOffers",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {
        "Offers": [
          {
            "OfferId": "offer-xyz789"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `DisassociateOffers` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `Offers` (array) (required) – List of offers to disassociate. Minimum: 1 item. Maximum: 7 items.
    + `OfferId` (string) (required) – The identifier of the AWS Marketplace offer. Minimum length: 1 character. Maximum length: 36 characters.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

### Asynchronous Errors
<a name="disassociate-offers-asynchronous-errors"></a>

The following errors are specific to `DisassociateOffers` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer set released. | 

## Associate a solution with an offer set
<a name="associate-solution-with-offer-set"></a>

Use the `AssociateSolution` change type to associate a single AWS Marketplace solution with an offer set. This creates a relationship that allows buyers to discover the offer set's connection to the solution and access the solution's rich marketing content such as detailed descriptions, architecture diagrams, and use case documentation.

**Note**  
This is a loosely coupled association. AWS Marketplace doesn't enforce consistency between the solution and offer set. Solutions can contain no AWS Marketplace products, different products than those in the offer set, or overlapping products. You have complete flexibility to associate any solution you own for marketing and discovery purposes.

For information about required IAM permissions, see [](#iam-permissions-offer-sets).

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "AssociateSolution",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {
        "SolutionId": "soln-xyz789"
      }
    }
  ]
}
```

Provide information for the fields to add the `AssociateSolution` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `SolutionId` (string) (required) – The identifier of the AWS Marketplace solution to associate. Minimum length: 1 character. Maximum length: 50 characters. Must match pattern `^soln-[A-Za-z0-9]+$`.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

### Asynchronous Errors
<a name="associate-solution-asynchronous-errors"></a>

The following errors are specific to `AssociateSolution` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1SOLUTION\$1ASSOCIATION | Disassociate the existing solution before associating a new solution. | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer set released. | 

## Disassociate a solution from an offer set
<a name="disassociate-solution-from-offer-set"></a>

Use the `DisassociateSolution` change type to remove the association between a solution and an offer set. This removes the solution's marketing content from the offer set while maintaining the offer set's transactable functionality.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "DisassociateSolution",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {
        "SolutionId": "soln-xyz789"
      }
    }
  ]
}
```

Provide information for the fields to add the `DisassociateSolution` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – The details of the request.
  + `SolutionId` (string) (required) – The identifier of the solution to disassociate. Minimum length: 1 character. Maximum length: 50 characters.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

### Asynchronous Errors
<a name="disassociate-solution-asynchronous-errors"></a>

The following errors are specific to `DisassociateSolution` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer set released. | 

## Release an offer set
<a name="release-offer-set"></a>

Use the `ReleaseOfferSet` change type to make an offer set available to buyers. Once released, the offer set transitions from Draft to Released state, becomes discoverable through AWS Marketplace, and associated offers can only be found as part of the unified package.

Released offer sets generate notifications at two levels: individual offers and the offer set itself. All individual offer notifications include the OfferSetId in existing notification channels ([email notifications](https://docs.aws.amazon.com/marketplace/latest/userguide/email-notifications.html) and [Amazon EventBridge events](https://docs.aws.amazon.com/marketplace/latest/userguide/notifications-eventbridge.html)). Offer set-level notifications are sent for key events such as when the offer set is released.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "ReleaseOfferSet",
      "Entity": {
        "Type": "OfferSet@1.0",
        "Identifier": "offerset-abc123"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `ReleaseOfferSet` change type:
+ `Entity` (object) (required) – The entity being updated.
  + `Identifier` (string) (required) – Your offer set ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – Must be `OfferSet@1.0`.
+ `DetailsDocument` (object) (required) – Empty object for this operation.

**Response Syntax**

A change set is created for your request. The response to this request gives you the `ChangeSetId` and `ChangeSetArn` for the change set and looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef"
}
```

The change request is added to a queue and processed. This includes validating information to ensure that it meets the AWS Marketplace guidelines. The validation process can take a few minutes.

You can check the status of the request through the AWS Marketplace Management Portal, or directly through Catalog API using the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

### Asynchronous Errors
<a name="release-offer-set-asynchronous-errors"></a>

The following errors are specific to `ReleaseOfferSet` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more information about using `DescribeChangeSet` to get the status of a change request, see [Working with change sets](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| MISSING\$1BUYER\$1NOTES | Provide BuyerNotes before releasing the offer set. | 
| MISSING\$1OFFERS | Associate at least two offers to the offer set before releasing it. | 
| TOO\$1MANY\$1OFFERS\$1PER\$1PRODUCT | Associate only one offer per product to the offer set. | 
| INCONSISTENT\$1OFFER\$1CURRENCY\$1CODE | Ensure all associated offers have matching CurrencyCode. | 
| INCONSISTENT\$1OFFER\$1AVAILABILITY\$1END\$1DATE | Ensure all associated offers have matching AvailabilityEndDate. | 
| INCONSISTENT\$1OFFER\$1TARGETING\$1RULE | Ensure all associated offers have matching TargetingRule. | 
| INCOMPATIBLE\$1OFFER\$1TARGETING\$1RULE | Only buyer-targeted offers can be associated to an offer set. | 
| EXPIRED\$1OFFERS | Disassociate expired offers from the offer set or extend their AvailabilityEndDates. | 
| DRAFT\$1OFFERS | Release all associated offers before releasing the offer set. | 
| INCOMPATIBLE\$1SOLUTION\$1STATE | Provide a solution in limited or public state. | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer set released. | 

## Offer set lifecycle
<a name="offer-set-lifecycle"></a>

The offer set lifecycle consists of the following stages:

### Creation phase
<a name="creation-phase"></a>

Create the offer set entity in Draft state using the `CreateOfferSet` change type. The offer set receives a unique identifier and begins in Draft state.

### Configuration phase
<a name="configuration-phase"></a>

During configuration, you:
+ Add or update metadata using `UpdateInformation` (name, buyer notes)
+ Create individual private offers, specifying the `OfferSetId` during offer creation
+ Associate offers with the offer set using `AssociateOffers`
+ Optionally associate a solution using `AssociateSolution` for enhanced marketing content

**Important**  
The `OfferSetId` on individual offers is immutable and can only be set during offer creation. Before associating offers with an offer set using `AssociateOffers`, you must first create the individual offers and specify the `OfferSetId` during offer creation. If you need to include an existing offer that doesn't have the correct `OfferSetId`, you must create a new offer with the correct `OfferSetId` specified.

### Validation phase
<a name="validation-phase"></a>

Before releasing an offer set, ensure:
+ The offer set contains between 2 and 7 offers
+ All associated offers must be: 
  + In Released state
  + Active
  + Using the same currency
  + Targeting the same buyer AWS account ID(s)
  + Having identical expiration dates

### Release phase
<a name="release-phase"></a>

When ready, use the `ReleaseOfferSet` change type to transition the offer set from Draft to Released state. This makes the offer set discoverable to buyers through AWS Marketplace.

### Post-release management
<a name="post-release-management"></a>

**Expiration management:**
+ The effective expiration of an offer set is calculated as the earliest expiration date among all associated offers
+ You can modify individual offer expiration dates using existing offer management capabilities (`UpdateAvailability` change type)

**Offer set modifications:**

When buyers request changes to a released offer set, use the recreation workflow:

1. Create a new offer set entity

1. For offers that don't require changes, clone existing offers through the AWS Marketplace Management Portal

1. For offers requiring modifications, create new offers with the requested changes, specifying the new `OfferSetId`

1. Associate all offers (cloned and new) with the new offer set using `AssociateOffers`

1. Release the new offer set using `ReleaseOfferSet`

1. Expire the original offer set by setting the availability end date of associated offers

## IAM permissions for offer sets
<a name="iam-permissions-offer-sets"></a>

To work with offer sets using the AWS Marketplace Catalog API, you need specific IAM permissions. This section describes the required permissions for offer set operations and cross-entity authorization requirements.

### Required IAM actions
<a name="required-iam-actions"></a>

The following IAM actions are required for offer set operations:
+ `aws-marketplace:StartChangeSet` – Required for all offer set change types including create, update, associate, and release operations
+ `aws-marketplace:DescribeChangeSet` – Required to check the status and results of change set executions
+ `aws-marketplace:ListEntities` – Required to list offer sets in your account
+ `aws-marketplace:DescribeEntity` – Required to retrieve detailed information about an offer set

### Resource permissions
<a name="resource-permissions"></a>

Use the following ARN patterns to grant permissions on specific resources:
+ **Offer sets** – `arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/*`
+ **Individual offers** – `arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Offer/*`
+ **Solutions** – `arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*`

For more restrictive permissions, replace the wildcard (\$1) with specific entity identifiers.

### Cross-entity authorization
<a name="cross-entity-authorization"></a>

Some offer set operations require permissions on both the offer set and the entities being associated:

**AssociateOffers**
+ `aws-marketplace:StartChangeSet` permission on the offer set entity
+ `aws-marketplace:StartChangeSet` permission with `AssociateWithOfferSet` change type on each individual offer entity being associated

**AssociateSolution**
+ `aws-marketplace:StartChangeSet` permission on the offer set entity
+ `aws-marketplace:StartChangeSet` permission with `AssociateWithOfferSet` change type on the solution entity being associated

**Note**  
Having only `DescribeEntity` (read-only) permission on offers or solutions is not sufficient for association operations. You must have `StartChangeSet` permission with the `AssociateWithOfferSet` change type on the entities being associated with the offer set.

### Example IAM policies
<a name="example-iam-policies"></a>

**Basic offer set management**

This policy provides permissions for basic offer set operations without cross-entity associations:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "aws-marketplace:StartChangeSet",
        "aws-marketplace:DescribeChangeSet",
        "aws-marketplace:ListEntities",
        "aws-marketplace:DescribeEntity"
      ],
      "Resource": [
        "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/*"
      ]
    }
  ]
}
```

**Cross-entity permissions for AssociateOffers**

This policy demonstrates the specific permissions and conditions required for AssociateOffers:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:StartChangeSet",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/*",
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": ["AssociateOffers"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:DescribeEntity",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Offer/*"
    },
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:StartChangeSet",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Offer/*",
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": ["AssociateWithOfferSet"]
        }
      }
    }
  ]
}
```

For more restrictive permissions, replace the wildcard (\$1) with specific entity identifiers.

**Cross-entity permissions for AssociateSolution**

This policy demonstrates the specific permissions and conditions required for AssociateSolution:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:StartChangeSet",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/OfferSet/*",
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": ["AssociateSolution"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:DescribeEntity",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*"
    },
    {
      "Effect": "Allow",
      "Action": "aws-marketplace:StartChangeSet",
      "Resource": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/Solution/*",
      "Condition": {
        "StringEquals": {
          "catalog:ChangeType": ["AssociateWithOfferSet"]
        }
      }
    }
  ]
}
```

For more restrictive permissions, replace the wildcard (\$1) with specific entity identifiers.