

# Using the AWS Marketplace API as a seller
<a name="use-apis-as-seller"></a>

The following sections provide information on how to use the API as a seller.

**Topics**
+ [Work with seller products](work-with-seller-products.md)
+ [Work with offers using the AWS Marketplace APIs](work-with-offers.md)
+ [Work with multi-product solutions](work-with-multi-product-solutions.md)
+ [Build interfaces with catalog data](build-interfaces-with-catalog-data.md)

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

You can use the AWS Marketplace Catalog API to automate tasks for working with seller products. This includes the ability to create, update, view, list, and sort products. This enables you to automate product management. For example, you can provide self-service publishing capabilities on the AWS Marketplace Management Portal.

A *product* is a unit or resource that you intend to sell in AWS Marketplace, often referred to as a base product. Buyers can't consume a base product until you add product information, deployment attributes, and billing information.

A *product* describes the product information, software deployment attributes, and billing mechanism of the listing that you intend to sell. The *product* must be paired with an *offer* to become a transactable unit that you can sell and buyers can use in AWS Marketplace.

You can also use the AWS Marketplace Catalog API to:
+ [Work with private offers using the AWS Marketplace APIs](work-with-private-offers.md)
+ [Work with resale authorizations using the AWS Marketplace APIs](work-with-resale-authorizations.md)
+ [Work with channel partner private offers using the AWS Marketplace APIs](work-with-cppos.md)

Each product type has a different product entity. An *entity* can be a product or an offer on AWS Marketplace. The following product types and entities are supported: 


| Product type | Entity | 
| --- | --- | 
| Amazon Machine Image (AMI) products | AmiProduct@1.0 | 
| Container products | ContainerProduct@1.0 | 
| Software as a service (SaaS) products | SaaSProduct@1.0 | 
| Machine learning (ML) products | MachineLearningProduct@1.0 | 

**Note**  
Single-AMI with CloudFormation product types, AWS Data Exchange data products, and professional services products are not supported.

The following topics assume you have access to the API and have completed any seller prerequisites, as described in [Access control for the AWS Marketplace Catalog API](catalog-api-access-control.md).

See the following resources:
+ To understand the basics of using the AWS Marketplace Catalog API, see [Welcome to the AWS Marketplace API Reference](welcome.md).
+ For end-to-end labs with working code examples, see [Manage products with API](https://catalog.workshops.aws/mpseller/en-US/manage-products-with-api) in the *AWS Marketplace seller workshop*.
+ For code examples of API requests, see [Python](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/python/src/catalog_api/products) and [Java](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/java/resources/changeSets/products) examples in *AWS Samples* on GitHub.

The following topics describe how to use the Catalog API to perform actions on your single-AMI products, container-based products, or SaaS products.

**Topics**
+ [Create a product](#create-product)
+ [Update product details](#update-information)
+ [Add pricing dimensions](#add-dimensions)
+ [Update pricing dimensions](#update-dimensions)
+ [Restrict pricing dimensions](#restrict-dimensions)
+ [Update targeting configuration](#update-targeting)
+ [Update product visibility](#update-visibility)
+ [Publish a product](#release-product)
+ [Find your product ID](#seller-product-id)
+ [Change set status and errors](#seller-product-change-set-errors)
+ [Work with AMI-based products](work-with-single-ami-products.md)
+ [Work with EC2 Image Builder component products](work-with-ec2-image-builder-products.md)
+ [Work with container-based products using the AWS Marketplace APIs](work-with-container-products.md)
+ [Work with SaaS products using the AWS Marketplace APIs](work-with-saas-products.md)
+ [Work with machine learning products using AWS Marketplace APIs](work-with-ml-products.md)

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

**Note**  
This change type is only needed when you intend to create a brand new product entity in the AWS Marketplace catalog. It is not needed when updating existing products.

You can use the Catalog API to create an AMI, container, machine learning, or SaaS product document with identifiers (product code and product ID) in AWS Marketplace. 

You create a product in `Draft` state by calling the `StartChangeSet` API operation with the `CreateProduct` change type. 

If your request is processed successfully, then AWS Marketplace Catalog API generates a product in `Draft` state for you. This is an incomplete product and isn’t visible to buyers in AWS Marketplace. 

You then use `Update` change types to complete the create product process: [UpdateInformation](#update-information), [UpdateDimensions](#update-dimensions), [UpdateTargeting](#update-targeting), and [UpdateVisibility](#update-visibility). 

After the product is completed, you can use the [ReleaseProduct](#release-product) change type to complete the product creation process, and then release the offer. This process validates the entire product and moves the product to the `Limited` state.

**Note**  
For more information about creating a product using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:  
[Create your single-AMI product](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#ami-create-product)  
You cannot update the AMI for the version. If you need to update the AMI, create a new version instead.
[Creating a container product](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#create-container-product)
[Creating a SaaS product](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-create-product.html)
 [Creating a machine learning product](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-creating-your-listing.html) 
If you use the AWS Marketplace Management Portal to create a product, the product will be in the `Staging` state.

To create a product in `Draft` state, call the `StartChangeSet` API operation with the `CreateProduct` change type, as shown in the following example. 

**Request Syntax**

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

{
"Catalog": "AWSMarketplace",
"ChangeSet": [ 
  { 
    "ChangeType":"CreateProduct",
    "Entity":{
      "Type": "SaaSProduct@1.0" // choose from ["AmiProduct@1.0", "ContainerProduct@1.0", "SaaSProduct@1.0", "MachineLearningProduct@1.0"]
     },
     "DetailsDocument": {
        "ProductTitle": "Test product title set in CreateProduct"
     }
  }
]
}
```

Provide information for the fields to add the `CreateProduct` change type. This change type can take in `ProductTitle` attribute, subject to the same restrictions as that sent into `UpdateInformation` change type.
+ `Entity` (object) (required) – The named type of object being created.
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`, `ContainerProduct@1.0`, `MachineLearningProduct@1.0` or `SaaSProduct@1.0`. For more information, see [Identifier](catalog-apis.md#identifier). 
+ `DetailsDocument` (object) (required) – It may be empty.
  + `ProductTitle` (optional) – The title for your product, max length is 72 characters. Note that you can also later set or update the product title via 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. 

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.

When the request is complete (if the `Status` is `SUCCEEDED`), a new `ProductId` is generated.

**Synchronous Validations**

The following schema validations are specific to `CreateProduct` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| ProductTitle (string) | Max length: 72 | 400 | 

**Asynchronous Errors**  
The following errors are specific to `CreateProduct` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more details 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\$1INPUT | Inappropriate content '\$1InappropriateContent\$1' found in ProductTitle field. Provide ProductTitle with no inappropriate content. | 

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

If you already have a product in AWS Marketplace, you can use the Catalog API to update the product details for an AMI, container, ML, or SaaS product. 

**Note**  
For more information about updating the product details using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:  
AMI-based product: [Update product information](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-updating-product)
Container-based product: [Creating or updating product information for your container product](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-product-updating-version)
SaaS-based product: [Update product information](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#update-product-information)
Machine learning product: [Updating product information](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-update-product.html)

To update product details, call the `StartChangeSet` API operation with the `UpdateInformation` change type and the details that you want to change, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateInformation",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "ProductTitle": "My Product Title",
        "ShortDescription": "My product short description.",
        "LongDescription": "My product longer description.",
        "Sku": "123example456",
        "LogoUrl": "https://awsmp-logos.s3.amazonaws.com/ca60b754fe05a24257176cdbf31c4e0d",
        "VideoUrls":
        [
          "https://example.com/my-video"
        ],
        "Highlights":
        [
          "123example45"
        ],
        "AdditionalResources":
        [
          {
            "Text": "123example456",
            "Url": "https://example.com/some-link"
          }
        ],
        "SupportDescription": "Need help? Contact our experts at support@example.com \n\nYour purchase includes 24x7 support.",
        "Categories":
        [
          "Operating Systems",
          "Network Infrastructure",
          "Application Development"
        ],
        "SearchKeywords":
        [
          "123example456"
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateInformation` change type:
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`, `ContainerProduct@1.0`, `MachineLearningProduct@1.0`, or `SaaSProduct@1.0`. 
+ `DetailsDocument` (object) (required) – The details of the request including the information that you want to update for your product. Each field is optional, but you must include at least one change to update.
  + `ProductTitle` (string) – The name of the product to be displayed to buyers.
  + `ShortDescription` (string) – The description of key aspects of the product to be displayed to buyers. This is usually 2–3 sentences.
  + `LongDescription` (string) – The longer description of your product to be displayed to buyers. This is usually 1–3 paragraphs.
  + `Sku` (string or null) – The free-form string that you define as a reference for your own use. Use `null` to unset this field.
  + `LogoUrl` (string) – The URL to an image in a publicly accessible Amazon Simple Storage Service (Amazon S3) bucket. For more information, see [Company and product logo requirements](https://docs.aws.amazon.com/marketplace/latest/userguide/product-submission.html#seller-and-product-logos).
  + `VideoUrls` (array of strings) – The list of URLs to publicly available, externally hosted videos to be provided as a reference to buyers in your product information.
**Note**  
Currently, AWS Marketplace supports one URL in the array.
  + `Highlights` (array of strings) – The list of short callouts for key product features.
  + `AdditionalResources` (array of structures) – The list of references to additional resources to learn about your product. Each reference is made up of a text name and a URL:
    + `Text` (string) – The name or title of the resource.
    + `Url` (string) – The URL to a resource that might be helpful for a buyer to understand your product.
  + `SupportDescription` (string) – The details about your support offering for your product.
  + `Categories` (array of strings) – The list of AWS Marketplace defined product categories that describe your product. For more information, see [Product categories](https://docs.aws.amazon.com/marketplace/latest/buyerguide/buyer-product-categories.html) in the *AWS Marketplace Buyer Guide*.
  + `SearchKeywords` (array of strings) – The list of keywords for your product to enhance the search experience. Seller name, product name, and product categories are automatically included in search keywords and don’t need to be repeated here.

**Note**  
When you are initially populating product information (metadata) for a `Draft` product, you will need to supply all of the following in the `DetailsDocument` object of `UpdateInformation` change type: `ProductTitle`, `ShortDescription`, `LongDescription`, `LogoUrl`, `Highlights`, `AdditionalResources`, `SupportDescription`, `Categories`, and `SearchKeywords`.   
The `ProductTitle` can be omitted if it has already been provided during `CreateProduct` change type. However, when you are updating existing fields on the product, 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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API.

**Synchronous Validations**

The following schema validations are specific to `UpdateInformation` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| String (general)  | No control characters "\$1\$1x00-\$1\$1x08\$1\$1x0B-\$1\$1x1F" | 400 | 
| ProductTitle (string) | Max length: 72 Required | 400 | 
| ShortDescription (string) | Max length: 1000 Required | 400 | 
| LongDescription (string) | Max length: 5000 Required | 400 | 
| Sku (string) | Max length: 100 Optional | 400 | 
| LogoUrl (string) |  URL pattern:  ^https://(www\$1.)?[-a-zA-Z0- 9@.]\$11,256\$1\$1.[a-zA-Z0-9()]\$12,63\$1\$1b([-a-zA- Z0-9@\$1./]\$1) Required  | 400 | 
| VideoUrls (array of strings) |  URL pattern:  https://(www\$1\$1.)?[-a-zA-Z0- 9@.\$1]\$11,256\$1\$1\$1.[a-zA-Z0-9()]\$12,63\$1\$1\$1b([-a-zA-Z0-9@\$1\$1.\$1/]  Optional  | 400 | 
| Highlights (array of strings) | Required: Min 1 - Max 3 | 400 | 
| AdditionalResources (array of structures) | Max length: 500 Optional | 400 | 
| SupportDescription (string) | Max length: 2000Required | 400 | 
| Categories (array of strings) | Min 1 - Max 3 Required | 400 | 
| SearchKeywords (array of strings) | Min 1 - Max 15 Max 50 chars for each itemRequired | 400 | 

**Asynchronous Errors**

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](catalog-apis.md#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| MISSING\$1DATA  | No data provided to perform an update. Provide data for at least 1 field of the product.  | 
| INVALID\$1INPUT | Provide LogoUrl. | 
| INVALID\$1INPUT | Provide ProductTitle. | 
| INVALID\$1INPUT | Provide ShortDescription. | 
| INVALID\$1INPUT | Provide LongDescription. | 
| INVALID\$1INPUT | Provide SupportDescription. | 
| INVALID\$1INPUT | Provide at least one search keyword. | 
| INVALID\$1INPUT | Provide at least one highlight. | 
| INVALID\$1INPUT | Provide between 1 and 3 product categories. | 
| INVALID\$1INPUT | Inappropriate content '\$1InappropriateContent\$1' found in ProductTitle field. Provide ProductTitle with no inappropriate content. | 
| INVALID\$1INPUT | Inappropriate content '\$1InappropriateContent\$1' found in ShortDescription field. Provide ShortDescription with no inappropriate content. | 
| INVALID\$1INPUT | Inappropriate content '\$1InappropriateContent\$1' found in LongDescription field. Provide LongDescription with no inappropriate content. | 
| INVALID\$1INPUT | Inappropriate content '\$1InappropriateContent\$1' found in SupportDescription field. Provide SupportDescription with no inappropriate content. | 
| INVALID\$1INPUT | Invalid ProductTitle field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid ShortDescription field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid LongDescription field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid SupportDescription field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid ProductTitle field. Remove unsupported characters [UnsupportedCharacters]. | 
| INVALID\$1INPUT | Invalid ShortDescription field. Remove unsupported characters [UnsupportedCharacters]. | 
| INVALID\$1INPUT | Invalid LongDescription field. Remove unsupported characters [UnsupportedCharacters]. | 
| INVALID\$1INPUT | Invalid SupportDescription field. Remove unsupported characters [UnsupportedCharacters]. | 
| INVALID\$1INPUT | Search keywords must be no more than 250 combined characters. | 
| INVALID\$1INPUT | The input for this change type could not be read. Submit a properly formatted input. | 
| INVALID\$1ADDITIONAL\$1RESOURCES | Invalid URLs in AdditionalResources: [InvalidAdditionalResourcesUrls] Provide valid URLs. | 
| INVALID\$1CATEGORY\$1NAMES | Provide valid category names supported by AWS Marketplace. | 
| InvalidImageProperties | Validation errors found: The file is not image type. Supported image types: [png\$1jpg\$1gif]. | 
| EXPLICIT\$1CONTENT | Explicit content: '\$1ExplicitContent\$1' detected. Provide media with no explicit content. | 
| INVALID\$1MEDIA | Invalid URL: \$1MediaUrl\$1 Provide a new URL for media stored in S3. | 
| INVALID\$1MEDIA | Invalid URL: \$1MediaUrl\$1 Provide a valid URL that does not exceed 2048 characters. | 
| INVALID\$1MEDIA | Location provided not accessible: \$1MediaUrl\$1 Provide an accessible URL for media stored in S3. | 
| INVALID\$1MEDIA | There was an issue copying the media from S3. Image size exceeds 5 MB. Provide an image that is under 5 MB. | 
| INVALID\$1MEDIA | Malware detected in media. Please resubmit media without malware. | 
| TOO\$1MANY\$1MEDIA | Provide no more than 15 media items. | 
| DUPLICATE\$1MEDIA | Duplicate media is not allowed for a product. Please provide media with no duplicates. | 

## Add pricing dimensions
<a name="add-dimensions"></a>

You can use the [AWS Marketplace Catalog API](API_Operations_AWS_Marketplace_Catalog_Service.md) to add billable pricing dimensions that enable you to charge users for AMI, container, or SaaS products.

A *pricing dimension* is a unit of measure that sellers define for charging buyers. Sellers must set up this information to bill buyers for using the product, whether it's a usage-based or contract-based pricing model. The type of dimension depends on the product's pricing model. 

**Note**  
For SaaS products with Free pricing model, you must create at least one dimension with UsageBasedPricingTerm or ConfigurableUpfrontPricingTerm, and all dimensions must be priced at \$10.00. This requirement is unique to SaaS products and does not apply to AMI, container, or machine learning products.

**Note**  
New pricing dimensions have the following impacts on SaaS buyers:  
For buyers with agreements created from public offers, you can report consumption on the new dimensions even though they did not exist in the offer when the agreement was created.
For buyers with agreements created from private offers, you can't report consumption on the new dimensions because they did not exist in the private offer when the agreement was created. Calls to the [BatchMeterUsage](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-metering_BatchMeterUsage.html) API will succeed, but the buyer will not be billed, so you must keep track of which buyer can and cannot be billed for any new dimensions. You can also use the [GetAgreementTerms](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-agreements_GetAgreementTerms.html) API to see the dimensions included in each buyer agreement.  
To report consumption on a new dimension and bill the buyer, you must [extend a replacement offer](https://docs.aws.amazon.com/marketplace/latest/userguide/private-offers-upgrades-and-renewals.html#private-offers-upgrades-and-renewals-supported-products) that includes the dimension, and the buyer must accept the offer.

For more information about product pricing, see the following topics in the *AWS Marketplace Seller Guide*:
+ [AMI product pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-ami-products.html)
+ [Container products pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/pricing-container-products.html)
+ [SaaS product pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-pricing-models.html)
+ [Machine learning product pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/machine-learning-pricing.html)

For more information about adding pricing dimensions using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:
+ AMI-based products: [Update pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-update-product-pricing).
+ Container-based products: [Adding a pricing dimension](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-add-pricing-dimensions).
+ SaaS-based products: [Add pricing dimensions](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#saas-add-pricing-dimensions).
+ ML products: Not supported. Machine learning products have fixed pricing dimensions. However, you can [Update pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-update-product-pricing).

To add pricing dimensions, call the `StartChangeSet` API with the `AddDimensions` change type, as shown in the following example.

**Note**  
After submitting the first `AddDimensions` change type with dimensions specifying a type of pricing model—usage, contract, or contract with consumption— you must work with the AWS Marketplace Seller Operations team. They help you add a dimension with types that are outside of the original pricing model.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDimensions",
      "DetailsDocument":
      [
        {
          "Description": "Description of the dimension",
          "Key": "UniqueApiKey",
          "Unit": "HostHrs",
          "Name": "First Dimension",
          "Types":
          [
            "ExternallyMetered"
          ]
        }
      ],
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "SaaSProduct@1.0"
      }
    }
  ]
}
```

Provide the following fields for the `AddDimensions` change type.
+ `DetailsDocument` (array of objects) (required) – Details of the request. 
  + `Description` (string) (required) – Full details of the dimension that will be the long description on the buyer’s viewing page.
  + `Key` (string) (required) – Enter in the facet that will be used for defining the rates in the offer. Also, enter the dimensions published to the AWS Marketplace Metering Service (MMS) if the dimension can’t be metered externally. After the dimension is created, this can’t be changed.
  + `Units` (string) (required) – The unit type for the dimension. Possible units are Users, Hosts, GB, MB, TB, Gbps, Mbps, Requests, Units, UserHrs, UnitHrs, Units, HostHrs, TierHrs, and TaskHrs.
  + `Name` (string) (required) – The display name for the dimension on the website and customer's bill.
    + `Types` (array of strings) (required) (also known as **Tags**) – These indicate whether the dimension covers metering, entitlement, or support for external metering. This is not changeable after the dimension is created.
    + 
      + `Metered` – Indicates that Commerce Platform usage types should be created to allow metering to occur for this dimension.
      + `ExternallyMetered` – Indicates that AWS Marketplace Metering Service (MMS) dimensions should be created during publishing to allow sellers to meter through the AWS SDK.
      + `Entitled` – Indicates that entitlements can be granted for the dimension during the product or offer publishing.

        The following table lists the supported combinations of pricing dimensions and products.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html)
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0` or `SaaSProduct@1.0`. 

**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 it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `AddDimensions` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Description | Max length: 1000 Required | 400 | 
| Key | Max length: 100 Pattern: [A-Za-z0-9\$1.-]\$1\$1 Required | 400 | 
| Dimension Units | Max length: 20 Required | 400 | 
| Name | Max length: 500 Required | 400 | 
| Type (tag) |  Required: Min 1 - Max 3 Inputs: Entitled, Metered, ExternallyMetered  Required  | 400 | 

**Asynchronous Errors**

The following errors are specific to `AddDimensions` 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\$1DATA | No data provided to perform an update. Provide data for at least 1 dimension. | 
| INVALID\$1DIMENSION | Provide no more than 200 dimensions. | 
| INVALID\$1DIMENSION | Can't add duplicate dimensions. | 
| INVALID\$1DIMENSION | Dimension can't be added in current state '%s'. States that support dimension updates are %s. | 
| INVALID\$1DIMENSION | Can't add dimension. The field '%s' has duplicate values '%s' in other dimensions. | 
| INVALID\$1DIMENSION | Provide non-empty fields (Key, Unit, Name, Types) for each dimension. | 
| IINVALID\$1TYPE | Remove invalid type '%s'. Valid types are ["Metered", "Entitled", "ExternallyMetered"]. | 
| INVALID\$1UNIT | Remove invalid Unit '%s'. Valid units are ["GB", "Gbps", "HostHrs", "Hosts", "MB", "Mbps", "Requests", "TaskHrs", "TB", "TierHrs", "UnitHrs", "Units", "UserHrs", "Users"]. | 
| INVALID\$1INPUT | Inappropriate content '%s' found in %s field. Provide %s with no inappropriate content. | 
| INVALID\$1INPUT | Invalid '%s' field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid '%s' field. Remove unsupported characters %s. | 
| INVALID\$1DIMENSION | Remove invalid dimension type combination %s. Allowed values are %s. | 
| INVALID\$1DIMENSION | Remove invalid dimension key '%s' for Metered dimension. | 
| INVALID\$1DIMENSION | Dimension named '%s' for productCode '%s' did not pass AWS Marketplace Metering Service validation %s. | 
| INVALID\$1DIMENSION | Dimension named '%s' for productCode '%s' has no metering record present in Metering Service. The product has either never been launched for testing or is misconfigured and does not make the appropriate calls to the AWS Marketplace Metering Service. | 

## Update pricing dimensions
<a name="update-dimensions"></a>

You can use the Catalog API to update existing pricing dimensions of an AMI, container, or SaaS product in AWS Marketplace. 

Each dimension is uniquely identified by the dimension key and dimension types to perform the update. Updating a dimension doesn’t affect any active offer or customers that the original dimension had created. 

**Note**  
For more information about updating pricing dimensions using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:  
AMI-based product: [Update pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-update-product-pricing)
Container-based product: [Updating dimension information](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-update-dimensions-information)
SaaS-based product: [Update pricing dimensions](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#saas-update-dimension)
Machine learning product: [Update product pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-update-public-offer.html)

To update pricing dimensions, call the `StartChangeSet` API operation with the `UpdateDimensions` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDimensions",
      "DetailsDocument":
      [
        {
          "Key": "UniqueApiKey",
          "Types":
          [
            "ExternallyMetered"
          ],
          "Name": "First Dimension",
          "Description": "Description of the dimension"
        }
      ],
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "SaaSProduct@1.0"
      }
    }
  ]
}
```

Use the following fields with the `UpdateDimensions` change type:
+ `DetailsDocument` (array of objects) (required) – Details of the request.
  + `Key` (string) (required) – Provide key of existing dimension from the product to change description and name on. For `UpdateDimension`, this field is only for identifying the dimension to be changed.
  + `Types` (array of strings) (required) (also known as **Tags**) – These indicate whether the dimension covers metering, entitlement, or support for external metering. This is not changeable after the dimension is created.
    + `Metered` – Indicates that Commerce Platform usage types should be created to allow metering to occur for this dimension.
    + `ExternallyMetered` – Indicates that AWS Marketplace Metering Service (MMS) dimensions should be created during publishing to allow sellers to meter through the AWS SDK.
    + `Entitled` – Indicates that entitlements can be granted for the dimension during product/offer publishing.  
**Valid Pricing Dimension Types Combinations**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html)
  + `Description` (string) (optional – Full description of the dimension that will be the long description on the buyer's viewing page.
  + `Name` (string) optional – DIsplay name for the dimension on the website and customer's bill.
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0` or `SaaSProduct@1.0`. 

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateDimensions` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Description  |  Max length: 1000 Required  | 400 | 
| Key  |  Max length: 100 Pattern: [A-Za-z0-9\$1.-]\$1\$1  Required  | 400 | 
| Name |  Max length: 5 Required  | 400 | 
|  Types (tag)  |  Required: Min 1 - Max 3 Inputs: `Entitled`, `Metered`, `ExternallyMetered`  Required  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateDimensions` 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\$1INPUT | Invalid '%s' field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid '%s' field. Remove unsupported characters %s. | 
| INVALID\$1DIMENSION | Provide non-empty fields (Key, Types, Name and/or Description) for each dimension. | 
| INVALID\$1DIMENSION | Cannot update dimension. The field Name has duplicate values '%s' in other dimensions. | 
| INVALID\$1DIMENSION | Cannot update same dimension with key '%s' and types '%s' multiple times in the same request. | 
| INVALID\$1DIMENSION | Cannot restrict dimension. The dimension key '%s' with types '%s' does not exist. | 
|  INVALID\$1DIMENSION  | Cannot update dimension. The dimension key '%s' is Metered. | 
|  INVALID\$1DIMENSION  | Dimension cannot be updated for an already restricted dimension. | 

## Restrict pricing dimensions
<a name="restrict-dimensions"></a>

You can use the Catalog API to restrict existing pricing dimensions of an AMI or SaaS product in AWS Marketplace. 

Each dimension is uniquely identified by the dimension key and dimension types to perform the update. Restricting a dimension doesn’t affect any active offer or customers that the original dimension had created. 

To restrict pricing dimensions, call the `StartChangeSet` API with the `RestrictDimensions` change type.

**Note**  
Pricing dimension restrictions are only available while the product is in draft state. Changes are not permitted once the product moves to limited or public state.

The following example shows how to restrict the `Entitled` dimension for a SaaS product.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "RestrictDimensions",
      "DetailsDocument":
      [
        {
          "Key": "UniqueApiKey",
          "Types": ["Entitled"]
        }
      ],
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "SaaSProduct@1.0"
      }
    }
  ]
}
```

Use the following fields with the `RestrictDimensions` change type:
+ `DetailsDocument` (array of objects) (required) – Details of the request.
  + `Key` (string) (required) – Provide key of existing dimension from the product to change description and name on. For `RestrictDimensions`, this field is only for identifying the dimension to be changed.
  + `Types` (array of strings) (required) (also known as **Tags**) – These indicate whether the dimension covers metering, entitlement, or support for external metering. This is not changeable after the dimension is created.
    + `["ExternallyMetered", "Entitled"]` – You can only combine these types for SaaS Contract with Consumption pricing where dimensions can be prepaid or metered.
    + `["Metered"]` – For hourly pricing dimensions of AMI products. Indicates that Commerce Platform usage types should be created to allow metering to take place for this dimension.
    + `["ExternallyMetered"]` – For flexible consumption pricing dimensions (also known as custom metering) of AMI, container, and SaaS products. Indicates that AWS Marketplace Metering Service (MMS) dimensions should be created during publishing to allow sellers to meter through the AWS SDK.
    + `["Entitled"]` – For contract pricing dimensions of SaaS Contracts and professional services products. This tag grants rights to use a software or service, sets start and end dates for the usage, and grants usage-discount rights for AMI annual products. Each entitlement is identified by a Dimension Key in AWS Marketplace Entitlement Service for creating and updating the entitlements. The key indicates that entitlements can be granted for the dimension during product and offer publishing.
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on your product's delivery method (product type): `AmiProduct@1.0` or `SaaSProduct@1.0`. 

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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

**Synchronous Validations**

The following schema validations are specific to `RestrictDimensions` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Description  |  Max length: 1000 Required  | 400 | 
| Key  |  Max length: 100 Pattern: [A-Za-z0-9\$1.-]\$1\$1  Required  | 400 | 
| Name |  Max length: 5 Required  | 400 | 
|  Types (tag)  |  Required: Min 1 - Max 3 Inputs: `Entitled`, `Metered`, `ExternallyMetered`  Required  | 400 | 

**Asynchronous Errors**

The following errors are specific to `RestrictDimensions` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` while 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\$1INPUT | Invalid '%s' field. Remove spaces before trademark symbol. | 
| INVALID\$1INPUT | Invalid '%s' field. Remove unsupported characters %s. | 
| INVALID\$1DIMENSION | The dimension key '%s' with types '%s' was already restricted | 
| INVALID\$1DIMENSION | Cannot restrict dimension. The dimension key '%s' with types '%s' does not exist | 
| INVALID\$1DIMENSION | Cannot restrict duplicate dimensions. | 
| INVALID\$1DIMENSION | All Entitled dimensions cannot be restricted. There must be at least one active Entitled dimension. | 
|  INVALID\$1DIMENSION  | The dimension key '%s' with types '%s' is associated with another dimension of different types '%s'. Both dimensions of the same key must be restricted at the same time to be valid. | 

## Update targeting configuration
<a name="update-targeting"></a>

You can use the Catalog API to add AWS account IDs that are allowed to view the AMI, container, ML, or SaaS product in AWS Marketplace before it’s moved to a `Public` state by calling the `UpdateTargeting` change type. 

Managed Catalog Operations (MCO) accounts are automatically added to the allowed accounts list when new products are created. These MCO accounts are visible to sellers in the AWS Marketplace Management Portal (AMMP) when viewing allowed accounts, and in the `Targeting` section of the `DescribeEntity` API response.

**Note**  
For more information about adding AWS account IDs using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:  
AMI-based product: [Update the allowlist (preview accounts)](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-updating-allowlist)
Container-based product: [Updating the allowlist of AWS account IDs](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-update-allowlist)
SaaS-based product: [Updating the allowlist of AWS account IDs](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#update-allowlist)
 Machine learning product: [Updating the allowlist](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-update-allowlist.html) 

To add AWS account IDs that are allowed to view the AMI, container, ML, or SaaS product, call the `StartChangeSet` API operation with the `UpdateTargeting` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateTargeting",
      "Entity":
      {
        "Type": "SaaSProduct@1.0",
        "Identifier": "prod-example12345"
      },
      "DetailsDocument":
      {
        "PositiveTargeting":
        {
          "BuyerAccounts":
          [
            "1112223334444"
          ]
        }
      }
    }
  ]
}
```

Use the following the fields with the `UpdateTargeting` change type. 
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`, `MachineLearningProduct@1.0`, or `SaaSProduct@1.0`. 
+ `DetailsDocument` (object) (required) – The details required to run the ChangeSet.
  + `PositiveTargeting` (object) (optional) – Positive targeting defines the criteria which any buyer's profile should fulfill in order to be allowed to access the offer. This field is optional, but at least one targeting option should be provided when this field is present.
    + `BuyerAccounts` (array of strings) (optional) – List as an option to allow targeting based on AWS accounts (also known as, Private Offer). If the intention is to not target the offer to an AWS account, this field should be omitted.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

To check request status, use the AWS Marketplace Management Portal or call the `[DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API.

When the request is complete (if the `Status` is `SUCCEEDED`), a new `ProductId` is generated.

**Synchronous Validations**

The following schema validations are specific to `UpdateTargeting` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Type of targeting | Valid current visibility states | BuyerAccounts (input) | Check | 
| --- | --- | --- | --- | 
| Positive | Public, Limited, or Draft |  Array of 12-digit AWS account ID strings. Min size: 0.  Max size: 5000.  | The input must be different from the current document targeted accounts.Input must be in valid AWS accounts. | 

**Asynchronous Errors**

The following errors are specific to `DescribeChangeSet` 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\$1PRODUCT\$1VISIBILITY | Use an existing Public, Limited or Draft product. | 
| INVALID\$1AWS\$1ACCOUNT\$1IDS | Provide valid AWS account IDs. AWS accounts not found: [x, y, z]. | 
| ValidationException | Professional services products do not have allowlists. Unlike other product types, professional services products in the limited state can be extended to any buyer without requiring an allowlist. | 

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

You can use the Catalog API to update the visibility (also known as lifecycle state) of an AMI, container, ML, or SaaS product in AWS Marketplace. 

**Note**  
For more information updating product visibility using the AWS Marketplace Management Portal, see the following topics in the *AWS Marketplace Seller Guide*:  
AMI-based product: [Update product visibility](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#ami-update-self-service-visibility)
Container-based product: [Updating product visibility](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-product-visibility)
SaaS-based product: [Update product visibility](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#saas-update-visibility)
Machine learning product: [Updating product visibility](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-update-visibility.html)

Allowed target lifecycle states are `Limited`, `Public`, or `Restricted`.

`Limited`   
The product is complete and has successfully completed the `ReleaseProduct` `ChangeType`. Sellers can view details of the product in this state. The product is not public. However, sellers can target specific buyers to allow to preview the product.

`Public`   
The product is visible in AWS Marketplace. Buyers can view and subscribe to the product.

`Restricted`   
The product is no longer visible to the public and doesn’t accept new subscribers. Existing subscribers can continue using this product until their subscription expires.

**Note**  
The `UpdateVisibility` change type requires a manual review from the AWS Marketplace Seller Operations team, which results in a longer execution time. Use `UpdateVisibility` separately in its own change set.

To update your product'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": "SaaSProduct@1.0",
        "Identifier": "prod-example12345"
      },
      "DetailsDocument":
      {
        "TargetVisibility": "Public"
      }
    }
  ]
}
```

For when `TargetVisibility` is `Restricted`.

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateVisibility",
      "Entity":
      {
        "Type": "SaaSProduct@1.0",
        "Identifier": "prod-example12345"
      },
      "DetailsDocument":
      {
        "TargetVisibility": "Restricted",
        "ReplacementProductId": "prod-example54321"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateVisibility` change type. 
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`, `SaaSProduct@1.0`, `ContainerProduct@1.0`, `MachineLearningProduct@1.0`. For more information, see [Identifier](catalog-apis.md#identifier).
+ `DetailsDocument` (object) (required) – The details required to run the `ChangeSet`.
  + 
    + `TargetVisibility` – The intended new visibility of the product.

      Possible values: `Public`, `Limited`, and `Restricted`
    + `ReplacementProductId` (string) (optional) – Replacement product ID for the product to be `Restricted`. Used to notify current subscribers about the product restriction.

      Only accepts `Restricted` for `TargetVisibility`.

**Synchronous Validations**

The following schema validations are specific to `UpdateVisibility` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Type of targeting  | Valid current states | ReplacementProductId (input)  | Validation checks | 
| --- | --- | --- | --- | 
| Public | Limited and Restricted | Not allowed | Valid current state | 
| Limited | Public and Restricted | Not allowed | Valid current state | 
| Restricted | Public and Limited | String (Optional) | ReplacementProductId must belong to an existing Limited or Public product. | 

After triggering this change type, 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. When restricting a product, you have 24 hours to change your mind, by calling `CancelChangeSet`, before the AWS Marketplace Seller Operations Team begins auditing. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_CancelChangeSet.html](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_CancelChangeSet.html).

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

When the request is complete (if the `Status` is `SUCCEEDED`), a new `ProductId` is generated.

**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](catalog-apis.md#working-with-change-sets).


| Error code  | Error message | 
| --- | --- | 
| INVALID\$1PRODUCT\$1STATE | Use an existing Public, Limited, or Restricted product. | 
| INVALID\$1TARGET\$1VISIBILITY | Provide a valid target visibility state: Public, Limited, or Restricted. | 
| EMPTY\$1TARGET\$1VISIBILITY | Provide a valid target visibility state: Public, Limited, or Restricted. | 
| INVALID\$1REPLACEMENT\$1PRODUCT\$1ID | Use an existing Public or Limited product as replacement. | 
| INVALID\$1REPLACEMENT\$1PRODUCT\$1ID | Replacement product ID is only valid when restricting a product. | 
| AUDIT\$1ERROR | Varies based on MCO manual review. | 
| MISSING\$1SELLER\$1PROFILE\$1INFORMATION | Before you can update your product to Public, you must add a public profile to your seller account. | 

## Publish a product
<a name="release-product"></a>

You can use the Catalog API to publish a `Draft` AMI, container, ML, or SaaS product into `Limited` state in AWS Marketplace. 

**Note**  
For `AmiProduct@1.0` and `SaaSProduct@1.0`, the `ReleaseProduct` change type must be accompanied by `ReleaseOffer` change type on the corresponding draft public `Offer@1.0` entity created for this product.

To publish a product, call the `StartChangeSet` API operation with the `ReleaseProduct` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "ReleaseProduct",
      "Entity":
      {
        "Type": "SaaSProduct@1.0",
        "Identifier": "prod-example12345"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add to the `ReleaseProduct` change type. This change type does not take any parameter payload.
+ `Entity` (object) (required) – The named type of entity being created.
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`, `SaaSProduct@1.0`, `ContainerProduct@1.0`, `MachineLearningProduct@1.0`. For more information, see [Identifier](catalog-apis.md#identifier).
+ `DetailsDocument` (object) (required) - Must be an empty object. The change type `ReleaseProduct` 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. This included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

When the request is complete (if the `Status` is `SUCCEEDED`), a new `ProductId` is generated.

**Asynchronous Errors**

The following errors are specific to `ReleaseProduct` 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 | 
| --- | --- | 
| VALIDATION\$1FAILED | Provide Description information. | 
| VALIDATION\$1FAILED | Provide Versions information. | 
| VALIDATION\$1FAILED | Provide Dimensions information. | 
| VALIDATION\$1FAILED | Provide Description\$1PromotionalResources\$1SupportInformation information. | 

## Find your product ID
<a name="seller-product-id"></a>

You must get the product ID for your product before you can modify it with AWS Marketplace Catalog API. There are two ways to find the product ID for server products:
+ Open the AWS Marketplace Management Portal and sign in with your seller account. From the **Products** menu, select **Server products**, then choose the product you are interested in. The product ID is listed in the **Product Summary** section.
+ Use the [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListEntities.html](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListEntities.html) action with the `EntityType` **AmiProduct** or **ContainerProduct**, **SaaSProduct**, **MachineLearningProduct**,or **DataProduct** to get a list of products, including their product IDs, via the Catalog API. `ListEntities` requires that you do not include the version of the entity type (for example, `AmiProduct@1.0`).

**Note**  
The product ID is only available after your product has been published and is visible to at least yourself in AWS Marketplace. When you first create your product, it can take several days to be reviewed and fully created. During this time, it will not have a product ID available. 

The following topics explain how to find a product by filtering on entity id, product title, last modified date, or visibility.

**Topics**
+ [Find a product based on product title](#find-product-using-title)
+ [Find a product based on last modified date](#find-product-using-last-mod-date)
+ [Find a product based on product visibility](#find-product-using-visibility)
+ [Find a product based on product title, last modified date, and product visibility](#find-product-using-all)
+ [Get additional details about a product](#get-additional-details)

### Find a product based on product title
<a name="find-product-using-title"></a>

**Request**

```
POST /ListEntities HTTP/1.1
Content-Type: application/json
      
{
    "Catalog": "AWSMarketplace",
    "EntityType": "AmiProduct",
    "MaxResults": 10,
    "EntityTypeFilters": {
        "AmiProductFilters": {
            "ProductTitle": {
                "WildCardValue": "XYZ"
            }
        }
    }
}
```

**Response**

```
HTTP/1.1 200
Content-type: application/json

{ 
  "EntitySummaryList": [ 
    { 
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/AmiProduct/example-abcd-1234",
      "EntityId": "example1-abcd-1234-5ef6-7890abcdef12@1",
      "EntityType": "AmiProduct",
      "LastModifiedDate": "2018-02-27T13:45:22Z",
       "AmiProductSummary": {
            "ProductTitle": "ABC-XYZ-123",
            "Visibility": "Public"
       }
    } 
  ],
  "NextToken": "" 
}
```

### Find a product based on last modified date
<a name="find-product-using-last-mod-date"></a>

**Request**

```
POST /ListEntities HTTP/1.1
Content-Type: application/json
      
{
    "Catalog": "AWSMarketplace",
    "EntityType": "AmiProduct",
    "MaxResults": 10,
    "EntityTypeFilters": {
        "AmiProductFilters": {
            "LastModifiedDate": {
                "DateRange": {
                    "BeforeValue": "2018-03-27T13:45:22Z",
                    "AfterValue": "2018-01-27T13:45:22Z"
                }
            }
        }
    }
}
```

**Response**

```
HTTP/1.1 200
Content-type: application/json

{ 
  "EntitySummaryList": [ 
    { 
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/AmiProduct/example-abcd-1234",
      "EntityId": "example1-abcd-1234-5ef6-7890abcdef12@1",
      "EntityType": "AmiProduct",
      "LastModifiedDate": "2018-02-27T13:45:22Z",
       "AmiProductSummary": {
            "ProductTitle": "ABC-XYZ-123",
            "Visibility": "Public"
       }
    } 
  ],
  "NextToken": "" 
}
```

### Find a product based on product visibility
<a name="find-product-using-visibility"></a>

**Request**

```
POST /ListEntities HTTP/1.1
Content-Type: application/json
      
{
    "Catalog": "AWSMarketplace",
    "EntityType": "AmiProduct",
    "MaxResults": 10,
    "EntityTypeFilters": {
        "AmiProductFilters": {
            "Visibility": {
                "ValueList": [
                    "Public"
                ]
            }
        }
    }
}
```

**Response**

```
HTTP/1.1 200
Content-type: application/json

{ 
  "EntitySummaryList": [ 
    { 
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/AmiProduct/example-abcd-1234",
      "EntityId": "example1-abcd-1234-5ef6-7890abcdef12@1",
      "EntityType": "AmiProduct",
      "LastModifiedDate": "2018-02-27T13:45:22Z",
       "AmiProductSummary": {
            "ProductTitle": "ABC-XYZ-123",
            "Visibility": "Public"
       }
    } 
  ],
  "NextToken": "" 
}
```

### Find a product based on product title, last modified date, and product visibility
<a name="find-product-using-all"></a>

**Request**

```
POST /ListEntities HTTP/1.1
Content-Type: application/json
      
{
    "Catalog": "AWSMarketplace",
    "EntityType": "AmiProduct",
    "MaxResults": 10,
    "EntityTypeFilters": {
        "AmiProductFilters": {
            "LastModifiedDate": {
                "DateRange": {
                    "BeforeValue": "2018-03-27T13:45:22Z",
                    "AfterValue": "2018-01-27T13:45:22Z"
                }
            },
            "Visibility": {
                "ValueList": [
                    "Public"
                ]
            },
            "ProductTitle": {
                "ValueList": [
                    "ABC-XYZ-123"
                ]
            }
        }
    }
}
```

**Response**

```
HTTP/1.1 200
Content-type: application/json

{ 
  "EntitySummaryList": [ 
    { 
      "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/AmiProduct/example-abcd-1234",
      "EntityId": "example1-abcd-1234-5ef6-7890abcdef12@1",
      "EntityType": "AmiProduct",
      "LastModifiedDate": "2018-02-27T13:45:22Z",
       "AmiProductSummary": {
            "ProductTitle": "ABC-XYZ-123",
            "Visibility": "Public"
       }
    } 
  ],
  "NextToken": "" 
}
```

### Get additional details about a product
<a name="get-additional-details"></a>

You can get additional details about the product using the entity id with the `DescribeEntity` action.

**Request**

```
GET /DescribeEntity?catalog=AWSMarketplace&entityId=example-abcd-1234 HTTP/1.1
```

**Response**

```
HTTP/1.1 200
Content-type: application/json

{
   "DetailsDocument": {
        "ProductTitle": "ABC-XYZ-123",
        "ShortDescription": "My product short description.", 
        "LongDescription": "My product longer description.", 
        "Sku": "123example456", 
        "SupportDescription": "Need help? Contact our experts at support@example.com \n\nYour purchase includes 24x7 support.", 
        "Categories": [ 
            "Operating Systems", 
            "Network Infrastructure", 
            "Application Development" 
            ] 
   }
    "EntityArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/AmiProduct/example-abcd-1234",
    "EntityId": "example1-abcd-1234-5ef6-7890abcdef12@1",
    "EntityType": "AmiProduct",
    "LastModifiedDate": "2018-02-27T13:45:22Z",
}
```

## Change set status and errors
<a name="seller-product-change-set-errors"></a>

Making changes to seller products in the AWS Marketplace Catalog API involves creating change sets that describe the changes you want to make, and then using the `StartChangeSet` action to start the changes. The changes from the request can take minutes to hours or longer to complete, depending on the request. The response to this request 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, including scanning the files and information to ensure that it meets the AWS Marketplace guidelines for products. Depending on the change requests, this process can take a few minutes to days. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action. For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets).

To check the status of your request, use the `DescribeChangeSet` action.

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

{
   "Catalog": "AWSMarketplace",
   "ChangeSetID": "example123456789012abcdef"
}
```

The result of this call looks like the following (in this case, for adding a new version to a container product).

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef",
  "ChangeSetName": "Submitted by 123456789012",
  "StartTime": "2020-10-27T22:21:26Z",
  "EndTime": "2020-10-27T22:32:19Z",
  "Status": "SUCCEEDED",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Type": "ContainerProduct@1.0",
        "Identifier": "example-1234-abcd-56ef-abcdef12345678@4"
      },
      "Details": "{\"Version\": {\"VersionTitle\": \"1.1\",\"ReleaseNotes\": \"Minor bug fix\"},\"DeliveryOptions\": [{\"DeliveryOptionTitle\": \"EKSDelivery\",\"Details\": {\"EcrDeliveryOptionDetails\" : {\"ContainerImages\": [\"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1\"],\"DeploymentResources\": [{\"Name\": \"HelmDeploymentTemplate\",\"Url\": \"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1\"}],\"CompatibleServices\": [\"EKS\"],\"Description\": \"Sample Description\",\"UsageInstructions\":\"helm pull 111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1\"}}},{\"DeliveryOptionTitle\": \"HelmChartDeliveryOption\",\"Details\": {\"HelmDeliveryOptionDetails\": {\"CompatibleServices\": [\"EKS\", \"EKS-Anywhere\"],\"ContainerImages\": [\"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1\"],\"HelmChartUri\": \"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:helmchart1.1\",\"Description\": \"Helm chart description\",\"UsageInstructions\": \"Usage instructions\",\"MarketplaceServiceAccountName\": \"Service account name\",\"ReleaseName\": \"Optional release name\",\"Namespace\": \"Optional Kubernetes namespace\",\"OverrideParameters\": [{\"Key\": \"HelmKeyName1\",\"DefaultValue\": \"${AWSMP_LICENSE_SECRET}\"},{\"Key\": \"HelmKeyName2\",\"DefaultValue\": \"${AWSMP_SERVICE_ACCOUNT}\"}]}}}]}",
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "1.1",
          "ReleaseNotes": "Minor bug fix"
        },
        "DeliveryOptions":
        [
          {
            "DeliveryOptionTitle": "EKSDelivery",
            "Details":
            {
              "EcrDeliveryOptionDetails":
              {
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "DeploymentResources":
                [
                  {
                    "Name": "HelmDeploymentTemplate",
                    "Url": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
                  }
                ],
                "CompatibleServices":
                [
                  "EKS"
                ],
                "Description": "Sample Description",
                "UsageInstructions": "helm pull 111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
              }
            }
          },
          {
            "DeliveryOptionTitle": "HelmChartDeliveryOption",
            "Details":
            {
              "HelmDeliveryOptionDetails":
              {
                "CompatibleServices":
                [
                  "EKS",
                  "EKS-Anywhere"
                ],
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "HelmChartUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:helmchart1.1",
                "Description": "Helm chart description",
                "UsageInstructions": "Usage instructions",
                "MarketplaceServiceAccountName": "Service account name",
                "ReleaseName": "Optional release name",
                "Namespace": "Optional Kubernetes namespace",
                "OverrideParameters":
                [
                  {
                    "Key": "HelmKeyName1",
                    "DefaultValue": "${AWSMP_LICENSE_SECRET}"
                  },
                  {
                    "Key": "HelmKeyName2",
                    "DefaultValue": "${AWSMP_SERVICE_ACCOUNT}"
                  }
                ]
              }
            }
          }
        ]
      },
      "ErrorDetailList":
      []
    }
  ]
}
```

The `Status` field shows the current status of the request, in this case, `SUCCEEDED`.

If there are failures, the result can include two types of errors. For most errors, the error message is included directly. However, errors found while scanning the product for security vulnerabilities instead include a URL to a file that lists all of the errors found, in the `ErrorMessage` field. Errors found while scanning have the `ErrorCode` "`SCAN_ERROR`".

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef",
  "ChangeSetName": "Submitted by 123456789012",
  "StartTime": "2020-10-27T22:21:26Z",
  "EndTime": "2020-10-27T22:32:19Z",
  "Status": "FAILED",
  "FailureDescription": "Change set preparation has failed. For details see 'ErrorDetailList'.",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Type": "ContainerProduct@1.0",
        "Identifier": "example-1234-abcd-56ef-abcdef12345678@4"
      },
      "Details": "{\"Version\": {\"VersionTitle\": \"1.1\",\"ReleaseNotes\": \"Minor bug fix\"},\"DeliveryOptions\": [{\"DeliveryOptionTitle\": \"EKSDelivery\",\"Details\": {\"EcrDeliveryOptionDetails\" : {\"ContainerImages\": [\"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1\"],\"DeploymentResources\": [{\"Name\": \"HelmDeploymentTemplate\",\"Url\": \"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1\"}],\"CompatibleServices\": [\"EKS\"],\"Description\": \"Sample Description\",\"UsageInstructions\":\"helm pull 111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1\"}}},{\"DeliveryOptionTitle\": \"HelmChartDeliveryOption\",\"Details\": {\"HelmDeliveryOptionDetails\": {\"CompatibleServices\": [\"EKS\", \"EKS-Anywhere\"],\"ContainerImages\": [\"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1\"],\"HelmChartUri\": \"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:helmchart1.1\",\"Description\": \"Helm chart description\",\"UsageInstructions\": \"Usage instructions\",\"MarketplaceServiceAccountName\": \"Service account name\",\"ReleaseName\": \"Optional release name\",\"Namespace\": \"Optional Kubernetes namespace\",\"OverrideParameters\": [{\"Key\": \"HelmKeyName1\",\"DefaultValue\": \"${AWSMP_LICENSE_SECRET}\"},{\"Key\": \"HelmKeyName2\",\"DefaultValue\": \"${AWSMP_SERVICE_ACCOUNT}\"}]}}}]}",
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "1.1",
          "ReleaseNotes": "Minor bug fix"
        },
        "DeliveryOptions":
        [
          {
            "DeliveryOptionTitle": "EKSDelivery",
            "Details":
            {
              "EcrDeliveryOptionDetails":
              {
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "DeploymentResources":
                [
                  {
                    "Name": "HelmDeploymentTemplate",
                    "Url": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
                  }
                ],
                "CompatibleServices":
                [
                  "EKS"
                ],
                "Description": "Sample Description",
                "UsageInstructions": "helm pull 111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
              }
            }
          },
          {
            "DeliveryOptionTitle": "HelmChartDeliveryOption",
            "Details":
            {
              "HelmDeliveryOptionDetails":
              {
                "CompatibleServices":
                [
                  "EKS",
                  "EKS-Anywhere"
                ],
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "HelmChartUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:helmchart1.1",
                "Description": "Helm chart description",
                "UsageInstructions": "Usage instructions",
                "MarketplaceServiceAccountName": "Service account name",
                "ReleaseName": "Optional release name",
                "Namespace": "Optional Kubernetes namespace",
                "OverrideParameters":
                [
                  {
                    "Key": "HelmKeyName1",
                    "DefaultValue": "${AWSMP_LICENSE_SECRET}"
                  },
                  {
                    "Key": "HelmKeyName2",
                    "DefaultValue": "${AWSMP_SERVICE_ACCOUNT}"
                  }
                ]
              }
            }
          }
        ]
      },
      "ErrorDetailList":
      [
        {
          "ErrorCode": "DUPLICATE_VERSION_TITLE",
          "ErrorMessage": "The version title must be different from any other version titles of this product."
        },
        {
          "ErrorCode": "SCAN_ERROR",
          "ErrorMessage": "https://123sample456.cloudfront.net/example-1234-abcd-5678-abcdef12345678/1234abcdef567890"
        }
      ]
    }
  ]
}
```

In this example, there is one error directly reported (`DUPLICATE_VERSION_TITLE`). The other error has a file with error messages (a single `SCAN_ERROR` can have multiple found errors in the file that is linked). 

**Note**  
The link returned in the `ErrorMessage` is valid for 60 days.

# Work with AMI-based products
<a name="work-with-single-ami-products"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with Amazon Machine Image (AMI)-based products. 

For information about creating a AMI-based product using the Catalog API, see [Create a product](work-with-seller-products.md#create-product).

The following topics describe how to use the Catalog API to perform actions on your AMI-based products:

**Topics**
+ [Add a new version](#ami-add-version)
+ [Update version information](#ami-update-version)
+ [Restrict a version](#ami-restrict-version)
+ [Update future AWS Region support](#update-future-region-support)
+ [Add a supported AWS Region](#add-regions)
+ [Restrict an AWS Region](#restrict-regions)
+ [Add a new instance type](#add-instance-types)
+ [Restrict an instance type](#restrict-instance-types)

## Add a new version
<a name="ami-add-version"></a>

You can use the Catalog API to add a new version to an existing AMI-based product in AWS Marketplace. For more information about adding new AMI versions to your product using the AWS Marketplace Management Portal, see [ Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the *AWS Marketplace Seller Guide*.

 When you create a request that includes adding a new AMI to AWS Marketplace, the AMI must be copied into the AWS Marketplace system and then scanned for security issues. You must give AWS Marketplace access to the AMI by creating an AWS Identity and Access Management (IAM) role with permissions to perform actions on your AMI. For more information on the required permissions, see [Giving AWS Marktplace access to your AMI](https://docs.aws.amazon.com/marketplace/latest/userguide/single-ami-marketplace-ami-access.html) in the *AWS Marketplace Seller Guide*.

To add a new version, call the `StartChangeSet` API operation with the `AddDeliveryOptions` change type for AMI-based products, as shown in the following example. To test your API call without actually creating a new version, set the `Intent` parameter to `VALIDATE`. For more information, see [Intent](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_StartChangeSet.html#API_StartChangeSet_RequestBody).

**Note**  
For AMI products, a version is made up of one or more delivery options. All delivery options in the same version must have the same `AmiSource` object with the same details. All delivery options must be added to a version when the version is created. It is not possible to add delivery options to an existing version.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Type": "AmiProduct@1.0",
        "Identifier": "prod-example12345"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "My new title",
          "ReleaseNotes": "My new Release notes"
        },
        "DeliveryOptions":
        [
          {
            "Details":
            {
              "AmiDeliveryOptionDetails":
              {
                "AmiSource":
                {
                  "AmiId": "ami-1234567890abcdef",
                  "AccessRoleArn": "arn:aws:iam::12345678901:role/AwsMarketplaceAmiIngestion",
                  "UserName": "ec2-user",
                  "OperatingSystemName": "AMAZONLINUX",
                  "OperatingSystemVersion": "Amazon Linux 2 AMI 2.0.20210126.0 x86_64 HVM gp2",
                  "AfiIds": ["afi-1234567890abcdefg", "afi-abcdefg1234567890"] //Optional (Required only for FPGA products)
                },
                "UsageInstructions": "Easy to use AMI",
                "RecommendedInstanceType": "m4.xlarge",
                "SecurityGroups":
                [
                  {
                    "IpProtocol": "tcp",
                    "FromPort": 443,
                    "ToPort": 443,
                    "IpRanges":
                    [
                      "0.0.0.0/0"
                    ]
                  }
                ]
              }
            }
          },
          {
            "DeliveryOptionTitle": "My new AMI with CFTdelivery option",
            "Details":
            {
              "DeploymentTemplateDeliveryOptionDetails":
              {
                "ShortDescription": "My new short description",
                "LongDescription": "My new long description",
                "UsageInstructions": "My new usage instructions",
                "RecommendedInstanceType": "m4.xlarge",
                "ArchitectureDiagram": "https://my-bucket.s3.amazonaws.com/my-folder/diagram.png",
                "Template": "https://my-bucket.s3.amazonaws.com/my-folder/cft.template",
                "TemplateSources":
                [
                  {
                    "ParameterName": "MyAmiParam",
                    "AmiSource":
                    {
                      "AmiId": "ami-1234567890abcdef",
                      "AccessRoleArn": "arn:aws:iam::12345678901:role/AwsMarketplaceAmiIngestion",
                      "UserName": "ec2-user",
                      "OperatingSystemName": "AMAZONLINUX",
                      "OperatingSystemVersion": "Amazon Linux 2 AMI 2.0.20210126.0 x86_64 HVM gp2"
                    }
                  }
                ]
              }
            }
          }
        ]
      }
    }
  ],
  "Intent": "APPLY"
}
```

The following list provides information about the input fields you use with the `AddDeliveryOptions` change type. All fields are required unless otherwise noted. For more information about these fields, see [Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the AWS Marketplace Seller Guide.
+ **DeliveryOptions** (array of objects) – A list of delivery option objects, including the details of each. You must include at least one.
  + For *AMI (standalone)* delivery option, specify an object with the following details. You can only have one delivery option with this type.
    + **Details** (object) – Holds the details of this delivery option. Note that this nested details object does not need to be double-escaped.
      + **AmiDeliveryOptionDetails** (object) – Use to provide the details of each AMI delivery option.
        + **AmiSource** (object) – Details about the AMI to be used for the added version.
          + **AmiId** (string) – ID for the source AMI, located in the AWS Region where the API is being called. This must always be US East (N. Virginia) because that is the only region where the Catalog API is available. Must belong to the caller account.
          + **AccessRoleArn **(string) – IAM role Amazon Resource Name (ARN) used by AWS Marketplaceto access the provided AMI. For details about creating and using this ARN, see [Giving AWS Marketplace access to your AMI](https://docs.aws.amazon.com//marketplace/latest/userguide/ami-single-ami-products.html#single-ami-marketplace-ami-access) in the *AWS Marketplace Seller Guide*.
          + **UserName** (string) – Login user name to access the operating system (OS) in the AMI. Typically ec2-user for Linux AMIs or Administrator for Windows.
          + **ScanningPort** (integer) – SSH or RDP port used to access the OS. Used for scanning the provided AMI for security vulnerabilities. Defaults to 22.
          + **OperatingSystemName** (string) – Name of the operating system displayed to buyers.
          + **OperatingSystemVersion** (string) – Operating system version string displayed to buyers.
          + **AfiIds** (array of strings) (optional) – Amazon FPGA Image (AFI) IDs to enable FPGA support for this version. When provided, this enables your product to run on FPGA-enabled F2 instance types. You can provide up to 15 AFI IDs per version. All AFI IDs you provide must originate from the US East (N. Virginia) region, reside within your AWS Marketplace seller account, and the provided IAM access role should have permissions to share this AFI with AWS Marketplace. For more details about the required permissions, see [Giving AWS Marketplace access to your FPGA images](https://docs.aws.amazon.com/marketplace/latest/userguide/single-ami-marketplace-ami-access.html#single-ami-marketplace-afi-access) in the *AWS Marketplace Seller Guide*.
        + **UsageInstructions** (string) – Instructions for using the AMI, or a link to more information about the AMI.
        + **AccessEndpointUrl** (object) (optional) – Used to create a path to access the AMI after it is used.
          + **Port** (string) – The port number used to access the service running on the AMI.
          + **Protocol** (string) – The protocol (http or https) used to access the service running on the AMI.
          + **RelativePath** (string) – The path from the web root to access the service running on the AMI (for example /index.html).
        + **RecommendedInstanceType** (string) – The instance type that is recommended to run the service with the AMI and is the default for 1-click installs of your service. For a list of instance types, see [Instance types](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon Elastic Compute Cloud User Guide for Linux Instances*.
        + **SecurityGroups** (array of objects) – A list of objects representing ingress rules for the automatically created groups for the version.
          + **IpProtocol** (string) – The protocol to use (tcp or udp).
          + **FromPort** (integer) – The source port.
          + **ToPort** (integer) – The destination port.
          + **IpRanges** (array of strings) – IP ranges to allow, in CIDR format (in the form xxx.xxx.xxx.xxx/nn, for example, *192.0.2.0/24*).
  + For *AMI with CloudFormation* delivery option, specify an object with the following details. You can have up to three delivery options of this type.
    + **DeliveryOptionTitle** (string) – Title for delivery option.
    + **Details** (object) – Holds the details of an AMI delivery option. Note that this nested details object does not need to be double-escaped.
      + **DeploymentTemplateDeliveryOptionDetails** (object) – Use to provide the details of each CFT delivery option.
        + **ShortDescription** (string) – Brief description of your CloudFormation template delivery option.
        + **LongDescription** (string) – Detailed description of your CloudFormation template delivery option.
        + **UsageInstructions** (string) – Instructions for using the AMI, or a link to more information about the AMI.
        + **RecommendedInstanceType** (string) – The instance type that is recommended to run the service with the AMI and is the default for 1-click installs of your service. For a list of instance types, see [Instance types](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon Elastic Compute Cloud User Guide for Linux Instances*.
        + **ArchitectureDiagram** (string) – URL to the location of your architectural diagram in Amazon S3. 
        + **Template** (string) – URL to the location of your CloudFormation Template in Amazon S3. 
        + **TemplateSources** (array of objects)
          + **ParameterName** (string) – Name of the parameter in the CloudFormation Template that the AMI in this version should be passed in to. For more information, see [Requirements for AMI details](https://docs.aws.amazon.com//marketplace/latest/userguide/cloudformation.html#ami-requirements-sse).
          + **AmiSource** (object)
            + **AmiId** (string) – ID for the source AMI, located in the AWS Region where the API is being called (currently must always be US East (N. Virginia) because that is the only region where the Catalog API is available). Must belong to the caller account.
            + **AccessRoleArn** (string) – IAM role Amazon Resource Name (ARN) used by AWS Region to access the provided AMI. For details about creating and using this ARN, see [Giving AWS Marketplace access to your AMI](https://docs.aws.amazon.com//marketplace/latest/userguide/ami-single-ami-products.html#single-ami-marketplace-ami-access) in the *AWS Marketplace Seller Guide*.
            + **UserName** (string) – Login user name to access the operating system (OS) in the AMI. Typically `ec2-user` for Linux AMIs or `Administrator` for Windows.
            + **OperatingSystemName** (string) – Name of the operating system displayed to buyers.
            + **OperatingSystemVersion** (string) – Operating system version string displayed to buyers.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

When the request is complete, the version is added, and any existing subscribers will receive an email message telling them about the new version. For more information about the process of adding a new version, see [ Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the *AWS Marketplace Seller Guide*.

**Asynchronous Errors**

The following errors are specific to `AddDeliveryOptions` 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\$1AMI\$1NAME | The prefix (x) in the AMI name is invalid. Provide a new name using your company or brand name as a prefix. | 
|  INVALID\$1PRODUCT  | Use an existing limited or public product. | 
|  DUPLICATE\$1VERSION\$1TITLE  | The version title must be different from any other version titles of this product. | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces before the trademark symbol. | 
|  INVALID\$1VERSION\$1TITLE  | Remove unsupported characters: [x, y, z] | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces from the beginning of the version title. | 
|  INVALID\$1VERSION\$1TITLE  | Provide version title with fewer than [x] characters. | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces before the trademark symbol. | 
|  INVALID\$1RELEASE\$1NOTES  | Remove unsupported characters: [x, y, z] | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces from the beginning of release notes. | 
|  INVALID\$1RELEASE\$1NOTES  | Provide release notes with fewer than (x) characters. | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove spaces before the trademark symbol. | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove unsupported characters: [x, y, z] | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove spaces from the beginning of release notes. | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Provide usage instructions with fewer than (x) characters. | 
|  RECOMMENDED\$1INSTANCE\$1TYPE\$1NOT\$1AVAILABLE  | Provide an existing, available instance type. | 
|  INVALID\$1RECOMMENDED\$1INSTANCE\$1TYPE  | Provide a valid instance type. | 
|  INVALID\$1SECURITY\$1GROUP  | Security group ports must be between 1 and [max]. | 
|  INVALID\$1SECURITY\$1GROUP  | Provide a value for CIDR IP ranges. | 
|  INVALID\$1SECURITY\$1GROUP  | Provide security group start port that is not greater than end port. | 
|  INVALID\$1SECURITY\$1GROUP\$1PROTOCOL  | Security group protocol must either be ‘tcp’ or ‘udp’. | 
|  INVALID\$1CIDR\$1IP  | Provide standard CIDR IP range in form '0.0.0.0/0'. | 
|  INVALID\$1ACCESS\$1ENDPOINT\$1PORT  | Provide endpoint port less than [x]. | 
|  INVALID\$1ACCESS\$1ENDPOINT\$1PORT  | Provide endpoint port between 1 and [max]. | 
|  INVALID\$1ACCESS\$1ENDPOINT\$1PORT  | Provide endpoint port. | 
|  INVALID\$1ACCESS\$1ENDPOINT\$1RELATIVE\$1PATH  | Remove spaces in the relative path. | 
|  INVALID\$1ACCESS\$1ENDPOINT\$1RELATIVE\$1PATH  | Remove preceding '/' from relative path. | 
|  INCOMPATIBLE\$1OPERATING\$1SYSTEM  | Provide operating system name and version that is compatible with instance types: [x] | 
|  INCOMPATIBLE\$1OPERATING\$1SYSTEM\$1NAME  | Provide name with fewer than (x) characters. | 
|  INCOMPATIBLE\$1OPERATING\$1SYSTEM\$1NAME  | Provide operating system name that is supported. | 
|  INCOMPATIBLE\$1OPERATING\$1SYSTEM\$1VERSION  | Provide version with fewer than (x) characters. | 
|  INVALID\$1SCANNING\$1PORT  | Provide scanning port between 1 and [max]. | 
|  INVALID\$1AMI\$1ID  | Provide valid AMI ID. | 
|  EXISTING\$1AMI\$1PRODUCT\$1CODE  | Remove product code attached to image X. | 
|  INVALID\$1AMI\$1ARCHITECTURE  | Provide new AMI with architecture [x]. | 
|  INVALID\$1AMI\$1VIRTUALIZATION\$1TYPE  | Provide new AMI with virtualization type [x]. | 
|  INVALID\$1AMI\$1VIRTUALIZATION\$1TYPE  | Provide expected [z] volume on image [x]. | 
|  INCOMPATIBLE\$1AMI  | Provide new AMI as architecture [x] on [y] is not supported by following instance types: [z] | 
|  INCOMPATIBLE\$1AMI  | Provide new AMI as virtualization type [x] on [y] is not supported by following instance types: [z] | 
|  INCOMPATIBLE\$1AMI  | Enable ENA support for image x because following instance types require ENA support: [y] | 
|  ASSET\$1NOT\$1FOUND  | Check if [ami-id] exists in us-east-1 Region of [account-id] AWS account and the AccessARN provided [ARN] has permissions to share this AMI with AWS Marketplace. | 
|  ASSET\$1ACCESS\$1EXCEPTION  | Unable to copy AMI [x] into AWS Marketplace account. | 
|  SCAN\$1ERROR  | Fix security vulnerability [y] on Image [x]. | 
|  ASSET\$1NOT\$1FOUND  | Check if [afi-id] exists in us-east-1 Region of [account-id] AWS account and the AccessARN provided [ARN] has permissions to share this AFI with AWS Marketplace. | 
|  ASSET\$1ACCESS\$1EXCEPTION  | Unable to access AFI. Check if AccessARN provided [ARN] has permissions to share this AFI with AWS Marketplace and access role Account is AFI owner. | 
|  MISSING\$1FPGA\$1INSTANCE\$1TYPE  | No FPGA based instance type found. Use AddInstanceTypes change type to add FPGA based instance type. | 

You can also create a AMI-based product using the AWS Marketplace Management Portal. For more information, see [ AMI products](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html) in the *AWS Marketplace Seller Guide*.

For a walk-through showing how to automate updating your AMI-based product, you can also refer to the video, [ Automating updates to your product listings in AWS Marketplace with Catalog API](https://www.youtube.com/watch?v=7KpUJ6Wcqrg) (5:08).

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

You can use the Catalog API to update the details of an existing version of your AMI-based product in AWS Marketplace. 

**Note**  
For more information about updating version information using the AWS Marketplace Management Portal, see [ Updating version information](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-updating-version) in the *AWS Marketplace Seller Guide*. 

You cannot update the AMI for the version. If you need to update the AMI, create a new version instead.

To add a new version, call the `StartChangeSet` API operation with the `UpdateDeliveryOptions` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "ReleaseNotes": "*My new Release notes*"
        },
        "DeliveryOptions":
        [
          {
            "Id": "example1-2222-cccc-2222-cccccccccccc",
            "Details":
            {
              "AmiDeliveryOptionDetails":
              {
                "UsageInstructions": "Easy to use AMI"
              }
            }
          },
          {
            "Id": "example1-2222-dddd-2222-dddddddddddd",
            "Details":
            {
              "DeploymentTemplateDeliveryOptionDetails":
              {work with ami
                "DeliveryOptionTitle": "My updated delivery option title",
                "UsageInstructions": "Updated usage instructions here."
              }
            }
          }
        ]
      }
    }
  ]
}
```

The following is information about the input fields you provide for adding the `UpdateDeliveryOptions` change type. For more information about these fields, see [ Updating version information](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-updating-version) in the AWS Marketplace Seller Guide.
+ **Entity** (object) (required) – Your AMI-based product. 
  + **Identifier** (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + **Type** (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ **DetailsDocument** (object) (required) – Details of the request. It includes any information about the version of your AMI-based product that you would like to update. The included fields are all optional, but you must include at least one field to update.
  + **Version** (object) – Details about the software version.
    + **ReleaseNotes** (string) – Notes for buyers to tell them about changes from one version to the next. 
  + **DeliveryOptions** (array of objects) – List of delivery option objects. Include only the delivery options you want to update.
    + For *AMI (standalone)* delivery option, specify an object with the following details. Include only the fields you want to update. All fields are optional unless otherwise noted.
      + **Id** (string) (required) – Unique identifier for the delivery option (you can get the unique identifier for the delivery option by calling the `DescribeEntity` action on the product you are updating).
      + **Details** (object) – Holds the details of an AMI delivery option. Note that this nested details object does *not* need to be double-escaped.
        + **AmiDeliveryOptionDetails** (object) – The details of one AMI delivery option.
          + **UsageInstructions** (string) – Instructions for using the AMI, or a link to more information about the AMI.
          + **AccessEndpointUrl** (object) – Used to create a path to access the AMI after it is used.
            + **Port** (string) – The port number used to access the service running on the AMI.
            + **Protocol** (string) – The protocol (`http` or `https`) used to access the service running on the AMI.
            + **RelativePath** (string) – The path from the web root to access the service running on the AMI (for example */index.html*).
          + **RecommendedInstanceType** (string) – The instance type that is recommended to run the service with the AMI and is the default for 1-click installs of your service.
          + **SecurityGroups** (array of objects) – A list of objects representing ingress rules for the automatically created groups for the version:
            + **FromPort** (integer) – The source port.
            + **IpProtocol** (string) – The protocol to use (`tcp` or `idp`).
            + **IpRanges** (array of strings) – IP ranges to allow, in CIDR format (in the form *xxx.xxx.xxx.xxx/nn*, for example, *192.0.2.0/24*).
            + **ToPort** (integer) – The destination port.
    + For *AMI with CloudFormation* delivery option, specify an object with the following details. Include only the fields you want to update. All fields are optional unless otherwise noted.
      + **Id** (string) (required) – Unique identifier for the delivery option (you can get the unique identifier for the delivery option by calling the `DescribeEntity` action on the product you are updating).
      + **Details** (object) – Holds the details of an AMI delivery option. Note that this nested details object does *not* need to be double-escaped.
        + **DeploymentTemplateDeliveryOptionDetails** (object) – Use to provide the details of each CFT delivery option.
          + **DeliveryOptionTitle** (string) – Title for delivery option.
          + **ShortDescription** (string) – Brief description of your CloudFormation template delivery option.
          + **LongDescription** (string) – Detailed description of your CloudFormation template delivery option.
          + **UsageInstructions** (string) – Instructions for using the AMI, or a link to more information about the AMI.
          + **RecommendedInstanceType** (string) – The instance type that is recommended to run the service with the AMI and is the default for 1-click installs of your service. For a list of instance types, see [Instance types](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/instance-types.html) in the *Amazon Elastic Compute Cloud User Guide for Linux Instances*.
          + **ArchitectureDiagram** (string) – URL to the location of your architectural diagram in Amazon S3. 
          + **Template** (string) – URL to the location of your CloudFormation Template in Amazon S3. 
          + **TemplateSources** (array of objects)
            + **ParameterName** (string) – Name of the parameter in the CloudFormation Template that the AMI in this version should be passed in to. For more information, see [Requirements for AMI details](https://docs.aws.amazon.com//marketplace/latest/userguide/cloudformation.html#ami-requirements-sse).
            + **AmiSource** (object)
              + **AmiId** (string) – ID for the source AMI, located in the AWS Region where the API is being called (currently must always be US East (N. Virginia) because that is the only region where the Catalog API is available). Must belong to the caller account.
              + **AccessRoleArn** (string) – IAM role Amazon Resource Name (ARN) used by AWS Region to access the provided AMI. For details about creating and using this ARN, see [Giving AWS Marketplace access to your AMI](https://docs.aws.amazon.com//marketplace/latest/userguide/ami-single-ami-products.html#single-ami-marketplace-ami-access) in the *AWS Marketplace Seller Guide*.
              + **UserName** (string) – Login user name to access the operating system (OS) in the AMI. Typically `ec2-user` for Linux AMIs or `Administrator` for Windows.
              + **OperatingSystemName** (string) – Name of the operating system displayed to buyers.
              + **OperatingSystemVersion** (string) – Operating system version string displayed to buyers.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets). For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

**Asynchronous Errors**

The following errors are specific to `UpdateDeliveryOptions` 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).

You can retrieve `UpdatePricingTerms` actions by using the `DescribeChangeSet` operation after the change set begins processing. For more information about error details and troubleshooting, refer to [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors), earlier in this guide.


| Error code | Error message | 
| --- | --- | 
| INVALID\$1PRODUCT | Use an existing limited or public product. | 
| MISSING\$1DELIVERY\$1OPTION\$1IDS | Provide at least one delivery option ID. | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| INVALID\$1DELIVERY\$1OPTIONS | Provide delivery option IDs that belong to the same version. | 

## Restrict a version
<a name="ami-restrict-version"></a>

You can use the Catalog API to restrict a version of your AMI-based product. This prevents new buyers from using that version, but keeps it available to existing buyers. Restricting all delivery options from a version restricts the version. Restricting one or more, but not all, delivery options from a version restricts just the delivery options in that version. You must always have at least one unrestricted version of a product available, so you cannot restrict the last publicly available version of a product.

**Note**  
For more information about restricting AMI versions in AWS Marketplace via the AWS Marketplace Management Portal, see [Restricting a version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-restricting-version) in the *AWS Marketplace Seller Guide*.

To restrict a version, call the `StartChangeSet` API operation with the `RestrictDeliveryOptions` change type, as shown in the following example.

**Note**  
All subscribers can use the current version regardless of the restriction status. AWS Marketplace guidelines require that you continue to offer support to existing buyers for 90 days after restricting the version. Your AMI will be marked as deprecated after the version is restricted. For more information, see [Deprecate an AMI](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ami-deprecate.html) in the *Amazon Elastic Compute Cloud User Guide for Windows Instances*.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "RestrictDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptionIds":
        [
          "example1-2222-cccc-2222-cccccccccccc"
        ]
      }
    }
  ]
}
```

The following is information about the input fields you provide for adding the `RestrictDeliveryOptions` change type:
+ **Entity** (object) (required) – Your AMI-based product. 
  + **Identifier** (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + **Type** (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ **DetailsDocument** (object) (required) – Details of the request. It includes IDs for the versions of your AMI-based product that you would like to restrict. 
  + **DeliveryOptionIds** (array of objects) – List of `DeliveryOption` IDs for the versions that you want to restrict. You can get the unique identifier for the `DeliveryOption` by calling the `DescribeEntity` action on the version you are restricting.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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**

The following errors are specific to `RestrictDeliveryOptions` 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\$1PRODUCT  | Use an existing public product. | 
|  MISSING\$1DELIVERY\$1OPTION\$1IDS  | Provide at least one delivery option ID. | 
|  INVALID\$1DELIVERY\$1OPTION\$1IDS  | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
|  INVALID\$1DELIVERY\$1OPTION  | Provide delivery option IDs that are in a public state. IDs not in public state: [x] | 
|  ALL\$1DELIVERY\$1OPTIONS\$1RESTRICTED  | Provide fewer delivery options to restrict as at least one must remain in public state. | 

## Update future AWS Region support
<a name="update-future-region-support"></a>

You can use the Catalog API to change future AWS Region support preferences for your AMI-based product in AWS Marketplace. 

**Note**  
For more information about changing future Region support using the AWS Marketplace Management Portal, see [ Update support for future AWS Regions](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-updating-future-region-support) in the *AWS Marketplace Seller Guide*. 

**Note**  
The `UpdateFutureRegionSupport` change type is only available on `AmiProduct@1.0`.

To change future AWS Region support preferences, call the `StartChangeSet` API operation with the `UpdateFutureRegionSupport` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateFutureRegionSupport",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "FutureRegionSupport":
        {
          "SupportedRegions":
          [
            "All"
          ]
        }
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateFutureRegionSupport` change type:
+ `Entity` (object) (required) – Your AMI-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ `DetailsDocument` (object) (required) – The details required to execute the ChangeSet.
  + `FutureRegionSupport` – Object
    + `SupportedRegions` – Single-element array of strings

      Element supported values: one of [`"All"`, `"US"`, `"None”`]

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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**

The following errors are specific to `UpdateFutureRegionSupport` 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\$1REGIONS | Currently, only 1 value is supported for FutureRegionSupport: All, US, or None | 
| INVALID\$1REGIONS | Requested Regions [a, b, c] are invalid or unavailable. Only supported values are [x, y, z]. | 
| INVALID\$1INPUT | SupportedRegions can't be empty. | 

## Add a supported AWS Region
<a name="add-regions"></a>

You can use the Catalog API to add new supported AWS Regions for your AMI-based product in AWS Marketplace. 

**Note**  
For more information about adding new supported Regions using the AWS Marketplace Management Portal, see [ Add an AWS Region](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-regions) in the *AWS Marketplace Seller Guide*. 

**Note**  
The `AddRegions` change type is only available on `AmiProduct@1.0`.

To add new supported Regions, call the `StartChangeSet` API operation with the `AddRegions` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "AddRegions",
      "DetailsDocument": {
        "Regions": [
          "us-east-1",
          "ap-northeast-2"
        ]
      },
      "Entity": {
        "Identifier": "prod-123456@1",
        "Type": "AmiProduct@1.0"
      }
    }
  ]
}
```

Provide information for the fields to add the `AddRegions` change type. 
+ `Entity` (object) (required) – Your AMI-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+   
**Example**  
  + `Regions`: Array of strings

    Element supported values: Valid AWS Region code strings. 

    For example, [`"us-east- 1"`].

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.
+ If the change set execution status is `SUCCEEDED`: A new Entity `Identifier` (or `EntityId`) is generated. You can use the [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html) API operation on the product entity to check the result. 
+ If the change set execution status is `CLIENT_ERROR`: The `DescribeChangeSet` response gives the details of the error, as well as corresponding actions to take to fix the error.

**Asynchronous Errors**

The following errors are specific to `AddRegions` 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\$1REGIONS | Requested regions [a, b, c] are invalid or unavailable. Only supported values are [x, y, z]. | 
| INVALID\$1INPUT | Regions can't be empty. | 

## Restrict an AWS Region
<a name="restrict-regions"></a>

You can use the Catalog API to restrict previously supported AWS Regions for your AMI-based product in AWS Marketplace. 

**Note**  
For more information about restricting previously supported Regions using the AWS Marketplace Management Portal, see [ Restrict an AWS Region](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-restricting-regions) in the *AWS Marketplace Seller Guide*. 

**Note**  
The `RestrictRegions` change type is only available on `AmiProduct@1.0`.

To restrict previously supported Regions, call the `StartChangeSet` API operation with the `RestrictRegions` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "RestrictRegions",
      "DetailsDocument": {
        "Regions": [
          "us-east-1",
          "ap-northeast-2"
        ]
      },
      "Entity": {
        "Identifier": "prod-123456@1",
        "Type": "AmiProduct@1.0"
      }
    }
  ]
}
```

Provide information for the fields to add the `AddRegions` change type. 
+ `Entity` (object) (required) – Your AMI-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ **DetailsDocument** (object) (required) – The details required to execute the ChangeSet.
  + `Regions` – Array of strings

    Element supported values: Valid AWS Region code strings, such as `"us-east-1"`.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.
+ If the change set execution status is `SUCCEEDED` – A new Entity `Identifier` (or `EntityId`) is generated. You can use `DescribeEntity` on the product entity to check the result. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html).
+ If the change set execution status is `CLIENT_ERROR`: The `DescribeChangeSet` response gives the details of the error, as well as corresponding actions to take to fix the error.

**Asynchronous Errors**

The following errors are specific to `AddRegions` 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\$1REGIONS | Requested regions [a, b, c] are invalid or unavailable. Only supported values are [x, y, z]. | 
| INVALID\$1INPUT | Regions can't be empty. | 

## Add a new instance type
<a name="add-instance-types"></a>

You can use the Catalog API to add new instance types for your AMI-based product in AWS Marketplace. 

**Note**  
For more information about adding instance types using the AWS Marketplace Management Portal, see [ Add an instance](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-instance-types) in the *AWS Marketplace Seller Guide*. 

`AddInstanceTypes` will add new instance types to existing products and newly created products when creating a product. The change type will update all versions in product document with a new instance type.

**Note**  
The `AddInstanceTypes` change type is only available on `AmiProduct@1.0`.

When adding a restricted instance type, the instance type can be removed from the restricted list and added to the available instance type list. This gives sellers more control to change their product restriction. The instance type list is interchangeable and not a permanent restricted status for a product.

For internally metered products, sellers need to call separate change types `AddDimensions` and `UpdatePricingTerms` to update pricing for the instance type.

To add new instance types, call the `StartChangeSet` API operation with the `RestrictRegions` change type, as shown in the following example.

**Request Syntax**

Only `AddInstanceTypes` change type is shown below. Although internally metered AMI sellers are required to call `AddInstanceTypes` and `UpdatePricingTerms` change types for their AMI.

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddInstanceTypes",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "InstanceTypes":
        [
          "m1.medium"
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `AddInstanceTypes` change type:
+ `Entity` (object) (required) – Your AMI-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ **DetailsDocument** (object) (required) – The details required to execute the `ChangeSet`, in this case `InstanceTypes`.
  + `InstanceTypes` (array of strings) (required) – List of `InstanceTypes` to add to the product. These instances will be added to the existing `InstanceTypes`.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The following schema validations are specific to `AddInstanceTypes` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP | 
| --- | --- | --- | 
| InstanceTypes | Required | 422 | 
| InstanceTypes | Must not be empty | 422 | 
| InstanceTypes | Entries must be between 1 to 24 characters long. Must match ^[A-Za-z0-9\$1.-]\$1\$1 | 422 | 
| InstanceTypes | Entries must be unique | 422 | 
| InstanceTypes | Must not be more than 1500 entries | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `AddInstanceTypes` 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\$1INSTANCE\$1TYPES | The following instance types are not valid: [x] | 
| INVALID\$1INSTANCE\$1VIRTUALIZATION | Virtualization of the product is [x]. It is not supported by the following instance types: [x] | 
| INVALID\$1AMI\$1ARCHITECTURE | CPU architecture of the product is '%s'." \$1 "It is not supported by the following instance types: [x] | 
|  INCOMPATIBLE\$1OPERATING\$1SYSTEM  | The instance types are incompatible with the OS defined in the product. Provide instance types that are compatible with the OS defined in the product. | 
| INVALID\$1PRODUCT\$1TYPE | Use an existing single AMI product. | 
| INVALID\$1ENA\$1SETTING | The product does not support ENA. ENA support is required by the following instance types: [x] | 
| INVALID\$1DIMENSIONS | No internally metered dimensions found for instance types: [x] | 
| UPDATE\$1PRICING\$1REQUIRED | UpdatePricingTerms change type is required when internally metered dimensions are available on the product. | 

## Restrict an instance type
<a name="restrict-instance-types"></a>

You can use the Catalog API to limit or restrict the instance types available for your AMI-based product in AWS Marketplace. 

**Note**  
For more information about limiting or restrict the instance types available using the AWS Marketplace Management Portal, see [ Restrict an instance](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-restricting-instance-types) in the *AWS Marketplace Seller Guide*. 

Existing subscribers won't be impacted by this change and they are able to use the restricted instance types. However, no new buyers will be able to use restricted instance types. To stop current instance types subscriptions (once instance types are restricted), you must contact the AWS Marketplace Seller Operations Team.

`RestrictInstanctTypes` restricts instance types to all the versions in the product document. In the `AddInstanceTypes` change type, you are updating all versions of the product. You won’t be able to restrict the recommended instance types. The recommended instance type is at the version level, so it’s possible that the seller won’t be able to restrict multiple instance types.

For an internally metered product, you need to call separate change types when calling `RestrictDimensions`. This prevents new offers being created for the restricted instance types.

**Note**  
The `RestrictInstanceTypes` change type is only available on `AmiProduct@1.0`.

To limit or restrict the instance types available for your AMI-based product, call the `StartChangeSet` API operation with the `RestrictInstanceTypes` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "RestrictInstanceTypes",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "AmiProduct@1.0"
      },
      "DetailsDocument":
      {
        "InstanceTypes":
        [
          "m1.medium"
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `RestrictInstanceTypes` change type. 
+ `Entity` (object) (required) – Your AMI-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `AmiProduct@1.0`. 
+ **DetailsDocument** (object) (required) – The details required to execute the `ChangeSet`, in this case `InstanceTypes`.
  + `InstanceTypes` (array of strings) (required) – List of `InstanceTypes` to restrict to the product. These instances are added to the current (or if there are no existing instance types, it will add) to restricted `InstanceTypes`.

**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 included validating information to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The following schema validations are specific to `RestrictInstanceTypes` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP | 
| --- | --- | --- | 
| InstanceTypes | Required | 422 | 
| InstanceTypes | Must not be empty | 422 | 
| InstanceTypes | Entries must be between 1 to 24 characters long. Must match ^[A-Za-z0-9\$1.-]\$1\$1 | 422 | 
| InstanceTypes | Entries must be unique | 422 | 
| InstanceTypes | Must not be more than 1500 entries | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `RestrictInstanceTypes` 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\$1 INSTANCE\$1TYPES | The following instance types are not valid: [x] | 
| INVALID\$1 PRODUCT\$1TYPE | Use an existing single AMI product. | 
| DUPLICATE\$1INSTANCE\$1TYPE | Provide instance types with no duplicates. | 
| UNAVAILABLE\$1INSTANCE\$1TYPE | Provide an available instance type. | 
|  RECOMMENDED\$1INSTANCE\$1TYPE\$1RESTRICTED  | The following instance types cannot be restricted. Recommended instance type must be changed to a different one before being restricted. Delivery Options Id [X] Instance Type[X] | 
|  DIMENSIONS\$1NOT\$1RESTICTED  | Restrict dimensions before restricting internally metered instance types: [x] | 
|  REGION\$1NO\$1INSTANCES  | Your restricted instance types would cause product launch failure in region: X. Consider restricting fewer instances. | 
| INCOMPATIBLE\$1RESTRICTION | Your restricted instance types would cause product with no FPGA based instance types for AFIs. Product needs to support at least one FPGA based instance type. | 

# Work with EC2 Image Builder component products
<a name="work-with-ec2-image-builder-products"></a>

As an AWS Marketplace seller, you can list AMI-based products delivered to AWS Marketplace buyers using EC2 Image Builder components. To create your component and publish an AWS Marketplace listing, proceed sequentially through the following sections.

**Topics**
+ [Building and testing your Image Builder component](#build-and-test-ib-component)
+ [Copying the component ARN](#ib-copy-component-arn)
+ [Creating AWS Marketplace IAM policies](#ib-create-iam-policies)
+ [Creating the AWS Marketplace IAM role](#ib-create-iam-role)
+ [Prepare your Image Builder component listing](#prepare-ec2-ib-listing)
+ [Publishing your Image Builder component product listing](#publishing-ib-component-listing)
+ [Updating Image Builder component product information](#updating-ec2-image-builder-product)
+ [Adding a new version to an existing Image Builder component product](#adding-new-ec2-ib-version-existing-product)
+ [Updating information about an existing version](#updating-ec2-ib-product-version)
+ [Restricting an Image Builder component product version](#restricting-ec2-ib-product-version)
+ [Monitoring a change set](#monitor-changeset)
+ [Securing software downloads](#securing-software-downloads)

## Building and testing your Image Builder component
<a name="build-and-test-ib-component"></a>

Build and test your component on Image Builder. For instructions, refer to [Develop custom components for your Image Builder image](https://docs.aws.amazon.com//imagebuilder/latest/userguide/create-custom-components.html) in the *Image Builder User Guide*. When creating your component using Image Builder, ensure that you do the following:
+ The component and all of its underlying dependencies, such as an Amazon Simple Storage Service (Amazon S3) bucket, secrets, or parameters, must be created in the US East (N. Virginia) (`us-east-1`) AWS Region.
+ Include supported architecture and any software dependencies in the component description.
+ Test your component in your AWS account by creating an [image pipeline](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html) and deploying the AMI created by the pipeline.
+ If your component contains instructions to copy binaries, packages, or files from an S3 bucket, use the `S3Download` action module. In the `S3Download` module, for `source`, enter the static location of your file in the S3 bucket. The following example copies a binary from an S3 bucket as part of the component installation.

  ```
  - name: DownloadMyFile
      action: S3Download
      inputs:
        - source: s3://amzn-s3-demo-source-bucket/path/to/package.zip
          destination: C:\myfolder\package.zip
  ```
+ Components can ingest files of up to 2 GB when using the `S3Download` action.
+ If your component uses [parameters](https://docs.aws.amazon.com/imagebuilder/latest/userguide/toe-user-defined-variables.html#user-defined-vars-parameters), ensure that all parameters have default values. For example, if you have a parameter named `region`, ensure that you have a valid default value such as `us-east-1`. These default values are for AWS Marketplace processing and testing. Testing may fail if you do not include default values.
+ If your component uses AWS Secrets Manager, Parameter Store, or a capability of AWS Systems Manager to store parameters, do the following:
+ 
  + To retrieve values as a step in your component, embed AWS Command Line Interface commands in your YAML configuration file.
  + Create a corresponding entry in Secrets Manager or Parameter Store in your AWS account. Use the default key and provide a valid value that will assist in building the component during the AWS Marketplace testing process. For example, say you have a parameter called `saas_token` with a default value of `token` that uses Parameter Store. In this case, create a key-value pair in Parameter Store. Use `token` as the key. For the value, enter a valid SaaS token for your application.

    Note that values stored in your AWS Marketplace seller account will only be used for AWS Marketplace testing purposes. These values will not be shared with buyers.
  + AWS Marketplace automatically generates Amazon Machine Images (AMIs) for your component across all compatible operating system versions you choose during the component creation process. When building your component, choose at least one compatible operating system version. Validate your component's compatibility with all chosen operating system versions by using EC2 Image Builder pipelines to create and test AMIs.

## Copying the component ARN
<a name="ib-copy-component-arn"></a>

After creating and testing the component on Image Builder, copy and save the component ARN. You will use the ARN when you publish the product listing using the AWS Marketplace Catalog API.

**To copy the Image Builder component ARN**

1. Sign in to the AWS Management Console and open the Image Builder console at [https://console.aws.amazon.com/imagebuilder/](https://console.aws.amazon.com/imagebuilder/).

1. In the left navigation bar, under **Saved resources**, choose **Components**.

1. On the **Components** page, for **Filter owner**, choose **Owned by me**.

1. Choose the component name.

1. On the component detail page, in the **Summary** section, copy the ARN.

## Creating AWS Marketplace IAM policies
<a name="ib-create-iam-policies"></a>

Create the following IAM policies to grant AWS Marketplace access to your Image Builder component and related resources like Amazon S3 buckets and secrets. Use the example policies provided. You attach these policies to an [AWS Marketplace IAM role](#ib-create-iam-role). For help creating policies, see [Creating policies using the JSON editor](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) in the *IAM User Guide*.
+ Image Builder get-component policy, to allow AWS Marketplace to access your component on Image Builder. This policy is required. Name the policy `mp_ib_ingest`.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "VisualEditor0",
              "Effect": "Allow",
              "Action": "imagebuilder:GetComponent",
              "Resource": "*"
          }
      ]
  }
  ```

------
+ Amazon S3 read-access policy, to allow AWS Marketplace to retrieve binaries from an S3 bucket. This policy is only required if your component uses the `S3Download` action module and stores associated binaries in an S3 bucket. Name the policy `mp_ib_s3_read_only`.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ListObjectsInBucket",
              "Effect": "Allow",
              "Action": [
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::bucket_name"
              ]
          },
          {
              "Sid": "ReadObjectsInBucket",
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject",
                  "s3:GetObjectAttributes"
              ],
              "Resource": [
                  "arn:aws:s3:::bucket_name/*"
              ]
          }
      ]
  }
  ```

------
+ Secrets Manager read-access policy, to allow AWS Marketplace to retrieve secrets stored in Secrets Manager. This policy is only required if your component uses Secrets Manager to store secrets. Name the policy `mp_ib_sm_read_only`. To restrict the policy to just your secret, replace the `*` in the `Resource` section with your secret.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "VisualEditor0",
              "Effect": "Allow",
              "Action": [
                  "secretsmanager:GetSecretValue"
              ],
              "Resource": [
                  "*"
              ]
          }
      ]
  }
  ```

------
+ Parameter Store read-access policy, to allow AWS Marketplace to retrieve secrets stored in Parameter Store. This policy is only required if your component uses Parameter Store to store secrets. Name the policy `mp_ib_ssm_parameter_read_only`. To restrict the policy to just your secret, replace the `*` in the `Resource` section with your secret.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "Statement1",
              "Effect": "Allow",
              "Action": [
                  "ssm:getParameter"
              ],
              "Resource": [
                  "*"
              ]
          }
      ]
  }
  ```

------

## Creating the AWS Marketplace IAM role
<a name="ib-create-iam-role"></a>

Use the following procedure to create an AWS Marketplace IAM role with policies to grant AWS Marketplace access to your component and its dependencies.

**To create the AWS Marketplace IAM role**

1. Sign in to the AWS Management Console and open the IAM console at [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. In the left navigation bar, choose **Roles**.

1. Choose **Create role**.

1. Select **Custom trust policy**.

1. Enter the following statement:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Statement1",
               "Effect": "Allow",
               "Principal": {
                   "Service": "assets.marketplace.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. Choose **Next**.

1. Add the Image Builder get-component policy you created previously. The get-component policy is required. Add the relevant policies for S3, Secrets Manager, and Parameter Store if your component uses these AWS services.

1. Choose **Next**.

1. Enter a role name, such as `MPEC2IBIngestion`.

1. Choose **Create role**.

### Copy AWS Marketplace IAM role ARN
<a name="copy-ib-role-arn"></a>

After creating the AWS Marketplace IAM role, copy and save the role ARN. You will use the ARN when publishing the listing using the AWS Marketplace Catalog API.

**To copy the AWS Marketplace IAM role ARN**

1. In the IAM console, in the left navigation bar, choose **Roles**.

1. Choose the AWS Marketplace IAM role you created previously, such as `MPEC2IBIngestion`.

1. On the role detail page, in the **Summary** section, copy the ARN.

## Prepare your Image Builder component listing
<a name="prepare-ec2-ib-listing"></a>

Before publishing your AWS Marketplace listing, ensure that you have the following information ready:
+ **Product metadata – **Metadata includes the product logo, product title, End User License agreement, supported instance types, and AWS Region.
+ **Pricing information – ** You can offer your product for free, at an hourly rate, or at an hourly rate with an initial free trial period. Bring your own license (BYOL) is not supported.
+ **Component details – **Details include the component Amazon Resource Number (ARN), usage details, and AWS Identity and Access Management (IAM) role that AWS Marketplace will assume to process your component.

## Publishing your Image Builder component product listing
<a name="publishing-ib-component-listing"></a>

This topic contains instructions to publish your EC2 Image Builder component listing on AWS Marketplace using the AWS Marketplace Catalog API.

### Prerequisites
<a name="publish-ib-component-listing-capi-prerequisites"></a>

Ensure that you have the following before publishing your Image Builder component product listing:
+ Registration as a seller in AWS Marketplace. For more information, refer to [Register as an AWS Marketplace seller](https://catalog.workshops.aws/mpseller/en-US/pre-requisite-register-as-seller).
+ An IAM user with `AWSMarketplaceSellerFullAccess` permission.
+ A publicly accessible Amazon Simple Storage Service (Amazon S3) bucket to host your company logo and EULA, if used in your component. You will enter the URL for the S3 bucket in your `ChangeSet` JSON file.
+ AWS Command Line Interface (AWS CLI). For more information, refer to [What is the AWS Command Line Interface?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) in the *AWS Command Line Interface User Guide*.

### Creating an Image Builder component product on AWS Marketplace
<a name="ib-create-json"></a>

To create an EC2 Image Builder component product on AWS Marketplace using the Catalog API, refer to [Create a product](work-with-seller-products.md#create-product).

## Updating Image Builder component product information
<a name="updating-ec2-image-builder-product"></a>

You can update information about a Image Builder component product on the AWS Marketplace Management Portal.

**To update Image Builder component product information**

1. Open the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour/) and sign in to your seller account.

1. On the **Products** menu, choose **Server**.

1. On the **Server products** page, select the product.

1. On the product detail page, on the **Request changes** menu, choose the item that corresponds to the information you want to update.

1. After submitting any changes, the request will appear on the **Requests** tab in "Under review" status, and will change to "Succeeded" once completed. 

## Adding a new version to an existing Image Builder component product
<a name="adding-new-ec2-ib-version-existing-product"></a>

You can add a new version to an Image Builder component product on AWS Marketplace using the AWS Marketplace Catalog API.

**To add a new version**

1. From the AWS Marketplace Management Portal, obtain the Product ID.

   1. Open the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour/) and sign in to your seller account.

   1. On the **Products** menu, choose **Server**.

   1. On the **Server products** page, select the product.

   1. In the **Product summary**, copy the **Product ID**.

1. Using the following code example, create a changeset file in JSON format. In the example, replace *your-product-ID* with the product ID you obtained in step 1. Replace *new-version-name* with your version title. Replace *new-delivery-option-title* with your delivery option title.

   ```
   [
       {
           "ChangeType": "AddDeliveryOptions",
           "Entity": {
               "Identifier": "your-product-ID",
               "Type": "AmiProduct@1.0"
           },
           "DetailsDocument": {
               "Version": {
                   "VersionTitle": "new-version-name",
                   "ReleaseNotes": "Release notes goes here."
               },
               "DeliveryOptions": [
                   {
                       "DeliveryOptionTitle": "new title",
                       "Details": {
                           "Ec2ImageBuilderComponentDeliveryOptionDetails": {
                               "UsageInstructions": "Test usage instructions for IB",
                               "AccessRoleArn": "arn:aws:iam::123456789:role/sample",
                               "ComponentArn": "arn:aws:imagebuilder:us-east-1:123456789:component/sample/2.0.0/1"
                           }
                       }
                   }
               ]
           }
       }
   ]
   ```

1. Save the changeset file with the name `addIBversion.json`.

1. In your terminal or AWS CloudShell, run the following command:

   ```
   aws marketplace-catalog start-change-set --catalog AWSMarketplace --region us-east-1 --change-set file://addIBversion.json
   ```

The `start-change-set` command will return a `ChangeSetId` value. To monitor a change set, see [Monitoring a change set](#monitor-changeset).

**Asynchronous Errors**

The following errors are specific to `AddDeliveryOptions` 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).

**Note**  
The following error codes are specific to the Image Builder delivery method. For existing error messages on fields such as `Usage Instructions`, `Recommended Instance type`, and `AccessRoleArn`, see [Add a new version](work-with-single-ami-products.md#ami-add-version).


| Error code | Error message | 
| --- | --- | 
| ASSET\$1NOT\$1FOUND | Check if [component arn] exists in [account-id] AWS account and the AccessARN provided [ARN] has permissions to share this Image Builder component with AWS Marketplace. | 
| ASSET\$1NOT\$1FOUND | The specified S3 link [x] within the component[x] does not exist. Provide a valid S3 link within the component. | 
| DUPLICATE\$1COMPONENT\$1NAME | The component name [x] already exists within the same version. Provide a different component name. | 
| DUPLICATE\$1COMPONENT\$1NAME | The component name [x] you provided is already in use by a different product. Provide a different component name. | 
| DUPLICATE\$1COMPONENT\$1ARN | The component Arn [x] must be different from Component Arn used in other delivery options of the same version of this product. | 
| DUPLICATE\$1COMPONENT\$1ARN | The component ARN [x] must be different from component ARN used in other versions of this product. | 
| SCAN\$1ERROR | Fix security vulnerability [y] on Component [x]. | 
| ASSET\$1ACCESS\$1EXCEPTION | We don't have the necessary permissions to read the contents from the specified S3 bucket[x]. Ensure the S3 bucket has the appropriate read permissions. | 
| ASSET\$1ACCESS\$1EXCEPTION | We don't have the necessary permissions to read the contents of the specified component ARN[x]. Ensure the component ARN has the appropriate read permissions. | 
| ASSET\$1ACCESS\$1EXCEPTION | We don't have the necessary permissions to read the contents of the specified package URI [x]. Ensure the package URI has the appropriate read permissions. | 
| ASSET\$1ACCESS\$1EXCEPTION | Failed to read from the HTTP source [x]. Verify that the provided HTTP source is correct. | 
| INVALID\$1IMAGE\$1BUILDER\$1COMPONENT\$1PACKAGE | Component assets exceed the size limit for ingestion. Reduce the size of S3/web downloads or eliminate unnecessary downloads to proceed. | 
| INVALID\$1IMAGE\$1BUILDER\$1COMPONENT\$1PACKAGE | Component assets are taking too long to ingest. Ensure that your network connection is stable and has adequate bandwidth. | 
| TOO\$1MANY\$1IMAGE\$1BUILDER\$1COMPONENTS | Max of 5 unique component names are supported per product, restrict the additional delivery option. | 
| INCOMPLETE\$1SELLER\$1PUBLIC\$1PROFILE | Your seller public profile is not complete. Complete your public profile before adding versions to the product. | 
| INVALID\$1DESCRIPTION | The description is missing. Provide a description with fewer than 1024 characters in component [x]. | 
| INVALID\$1COMPONENT\$1NAME | Provide a component name with fewer than [x] characters. | 
| INVALID\$1SUPPORTED\$1OS\$1VERSION | The OS version is missing. Provide a valid supported OS version in component [x]. | 
| INVALID\$1PATH\$1FORMAT | Step [STEP\$1NAME] in phase [PHASE\$1NAME] is not allowed to use S3 or web URLs for the InstallMSI/UninstallMSI actions. Ensure that the path specified is a valid local path accessible from the system executing the action. | 
| INCOMPATIBLE\$1OS\$1TYPE | The specified component OS type[x] is not compatible with the platform of the base image. Provide an OS type that is compatible with the base image. | 
| ASSET\$1ACCESS\$1EXCEPTION | We don't have the necessary permissions to read the contents from the specified SSM parameter [x]. Ensure that the IAM access role provided in the API input has the required read permissions. | 
| ASSET\$1ACCESS\$1EXCEPTION | We don't have the necessary permissions to read the contents from the specified SecretsManager secret [x]. Ensure that the IAM access role provided in the API input has the required read permissions. | 
| INVALID\$1IB\$1COMPONENT\$1BUILD\$1VERSION | Component ARN [x] has a build version of [y]. AWS Marketplace only supports build version 1. Create a new EC2 Image Builder version with Build versions 1, and try again on AWS Marketplace | 
| INVALID\$1IB\$1COMPONENT\$1PARAMETER | Unable to parse the SSM parameter in input [x] for component [y]. | 
| INVALID\$1IB\$1COMPONENT\$1PARAMETER | Unable to parse the SecretsManager secret in input [x] for component [y]. | 
| MISSING\$1IB\$1COMPONENT\$1PARAMETER | Parameter not found in component [x] for input [y] | 
| INVALID\$1IB\$1COMPONENT\$1PARAMETER | Provide a default value for parameter [x] in component [y]. | 
| FAILED\$1LAUNCH\$1TEST | The launch test for component [x] has failed. Error message: [z] | 
| SSHAuthFailedForUserAndKeypair | Unable to log into the instance with OS default username [X]. | 
| INVALID\$1IB\$1COMPONENT | A component build phase is required. Add a valid build phase to component [x] | 
| DUPLICATE\$1VERSION\$1TITLE | The version title must be different from any other version titles of this product. | 
| INVALID\$1VERSION\$1TITLE | Remove spaces before the trademark symbol. | 
| INVALID\$1VERSION\$1TITLE | Remove unsupported characters: [x, y, z] | 
| INVALID\$1VERSION\$1TITLE | Remove spaces from the beginning of the version title. | 
| INVALID\$1VERSION\$1TITLE | Provide version title with fewer than [x] characters. | 
| INVALID\$1RELEASE\$1NOTES | Remove spaces before the trademark symbol. | 
| INVALID\$1RELEASE\$1NOTES | Remove unsupported characters: [x, y, z] | 
| INVALID\$1RELEASE\$1NOTES | Remove spaces from the beginning of release notes. | 
| INVALID\$1RELEASE\$1NOTES | Provide release notes with fewer than (x) characters. | 
| INVALID\$1USAGE\$1INSTRUCTIONS | Remove spaces before the trademark symbol. | 
| INVALID\$1USAGE\$1INSTRUCTIONS | Remove unsupported characters: [x, y, z] | 
| INVALID\$1USAGE\$1INSTRUCTIONS | Provide usage instructions with fewer than (x) characters. | 
| DUPLICATE\$1DELIVERY\$1OPTION\$1TITLES | Provide unique delivery option title. | 
| INVALID\$1DELIVERY\$1OPTION\$1TITLES | Delivery option title already exists, retry with a different title. | 

## Updating information about an existing version
<a name="updating-ec2-ib-product-version"></a>



**To update information about an existing version**

1. From the AWS Marketplace Management Portal, obtain the Product ID.

   1. Open the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour/) and sign in to your seller account.

   1. On the **Products** menu, choose **Server**.

   1. On the **Server products** page, select the product.

   1. In the **Product summary**, copy the **Product ID**.

1. In your terminal, run the following command. In the command, replace *your-product-ID* with the ID you obtained in step 1.

   ```
   aws marketplace-catalog describe-entity --catalog AWSMarketplace --region us-east-1 --entity-id 'your-product-ID'
   ```

1. In the output returned, go to the `DetailsDocument`, `Versions` section. Copy the `DeliveryOptions`, `Id` value for the version you want to update.

1. Using the following code example, create a changeset file in JSON format. In the example, replace *your-product-ID* with the product ID you obtained in step 1. Replace *your-release-notes* with your release notes. Replace *your-delivery-option-ID* with the ID of the delivery option you obtained in step 3. Replace *your-usage-instructions* with your usage instructions.

   ```
   [
       {
           "ChangeType": "UpdateDeliveryOptions",
           "Entity": {
               "Identifier": "your-product-ID",
               "Type": "AmiProduct@1.0"
           },
           "DetailsDocument": {
               "Version": {
                   "ReleaseNotes": "your-release-notes"
               },
               "DeliveryOptions": [
                   {
                       "Id": "your-delivery-option-ID",
                       "Details": {
                           "Ec2ImageBuilderComponentDeliveryOptionDetails": {
                               "UsageInstructions": "your-usage-instructions"
                           }
                       }
                   }
               ]
           }
       }
   ]
   ```

1. Save the changeset file with the name `updateVersionInfo.json`.

1. In your terminal or AWS CloudShell, run the following command:

   ```
   aws marketplace-catalog start-change-set --catalog AWSMarketplace --region us-east-1 --change-set file://updateVersionInfo.json
   ```

The `start-change-set` command will return a `ChangeSetId` value. To monitor a change set, see [Monitoring a change set](#monitor-changeset).

## Restricting an Image Builder component product version
<a name="restricting-ec2-ib-product-version"></a>

Restricting a version makes it unavailable to buyers. You can restrict a version of your Image Builder component product on AWS Marketplace using the AWS Marketplace Catalog API. You must keep at least one version of your product unrestricted on AWS Marketplace. You can't restrict access to the only public version.

**To update information about an existing version**

1. From the AWS Marketplace Management Portal, obtain the Product ID.

   1. Open the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/tour/) and sign in to your seller account.

   1. On the **Products** menu, choose **Server**.

   1. On the **Server products** page, select the product.

   1. In the **Product summary**, copy the **Product ID**.

1. In your terminal, run the following command. In the command, replace *your-product-ID* with the ID you obtained in step 1.

   ```
   aws marketplace-catalog describe-entity --catalog AWSMarketplace --region us-east-1 --entity-id 'your-product-ID'
   ```

1. In the output returned, go to the `DetailsDocument`, `Versions` section. Copy the `DeliveryOptions`, `Id` value for the version you want to update.

1. Using the following code example, create a changeset file in JSON format. In the example, replace *your-product-ID* with the product ID you obtained in step 1. Replace *your-delivery-option-ID* with the ID of the delivery option you obtained in step 3.

   ```
   [
       {
           "ChangeType": "RestrictDeliveryOptions",
           "Entity": {
               "Identifier": "your-product-ID",
               "Type": "AmiProduct@1.0"
           },
           "DetailsDocument": {
               "DeliveryOptionIds": [
                   "your-delivery-option-ID"
               ]
           }
       }
   ]
   ```

1. Save the changeset file with the name `restrictec2ibversion.json`.

1. In your terminal or AWS CloudShell, run the following command:

   ```
   aws marketplace-catalog start-change-set --catalog AWSMarketplace --region us-east-1 --change-set file://restrictec2ibversion.json
   ```

The `start-change-set` command will return a `ChangeSetId` value. To monitor a change set, see [Monitoring a change set](#monitor-changeset).

## Monitoring a change set
<a name="monitor-changeset"></a>

The `start-change-set` command will return a `ChangeSetId` value. You can monitor change set progress in the following ways:
+ Run the following command in your terminal. In the command. replace *changeset-ID* with the `ChangeSetId` value returned by the `start-change-set` command.

  ```
  aws marketplace-catalog describe-change-set ‐‐catalog AWSMarketplace ‐‐change-set-id changesetID
  ```
+ View the request status on the **Requests** tab in the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management/).

## Securing software downloads
<a name="securing-software-downloads"></a>

To safeguard ISV software intellectual property and ensure stable, consistent software delivery to AWS Marketplace buyers, AWS Marketplace automatically parses `S3Download` and `WebDownload` action modules in your component. The referenced files are then securely stored in a private Amazon S3 bucket managed by AWS Marketplace. To opt out of this ingestion process and manage software downloads independently, run bash scripts that use the `wget` or `curl` download commands.

# Work with container-based products using the AWS Marketplace APIs
<a name="work-with-container-products"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with container-based products. 

For information about creating a container-based product using the Catalog API, see [Create a product](work-with-seller-products.md#create-product).

The following topics describe how to use the Catalog API to perform actions on your container-based products:

**Topics**
+ [Add a new version](#container-add-version)
+ [Update the visibility for an Amazon EKS add-on](#update-delivery-option-visibility)
+ [Create repositories and resources](#container-repos)
+ [Update version information](#container-update-version)
+ [Restrict a version](#container-restrict-version)

## Add a new version
<a name="container-add-version"></a>

If you already have a container-based product in AWS Marketplace, you can use the AWS Marketplace Catalog API to add a new version. This requires that you have already created repositories in AWS Marketplace for each container image or artifact that is part of your product, and that you can copy them from your local Docker and Helm files.

**Note**  
For details about creating a container-based product using the AWS Marketplace Management Portal, see [Getting started with container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html) in the *AWS Marketplace Seller Guide*.  
For details about adding a new version, including creating repositories and building Docker and Helm files into those repositories, by using the AWS Marketplace Management Portal, see [Add a new version of your product](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-add-version) in the *AWS Marketplace Seller Guide*.  
If you have not already created new repositories, you can create them using the Catalog API, see [Create repositories and resources](#container-repos).

To add a new version, call the `StartChangeSet` API operation with the `AddDeliveryOptions` change type, as shown in the following example.

**Note**  
A version of a container-based product is made up of one or more delivery options. For example, you might have two delivery options, one that works with a noSQL database, and another that works with MySQL, so that your users can choose how they want to work with your product. You create the version of your product and add multiple delivery options in a single request with `AddDeliveryOptions`.

**Container Image Delivery Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "1.1",
          "ReleaseNotes": "Minor bug fix"
        },
        "DeliveryOptions":
        [
          {
            "DeliveryOptionTitle": "EKS Container image only delivery option",
            "Details":
            {
              "EcrDeliveryOptionDetails":
              {
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "DeploymentResources":
                [
                  {
                    "Name": "HelmDeploymentTemplate",
                    "Url": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
                  }
                ],
                "CompatibleServices":
                [
                  "EKS"
                ],
                "Description": "Sample Description",
                "UsageInstructions": "helm pull 111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame2:mychart1.1"
              }
            }
          }      
        ]
      }
    }
  ]
}
```

**Amazon Bedrock AgentCore Runtime delivery request syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "1.1",
          "ReleaseNotes": "Minor bug fix"
        },
        "DeliveryOptions":
        [
          {
            "DeliveryOptionTitle": "Amazon Bedrock AgentCore Runtime Delivery Option",
            "Details":
            {
              "EcrDeliveryOptionDetails":
              {
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "CompatibleServices":
                [
                  "Bedrock-AgentCore"
                ],
                "AgenticType":
                [
                  "AGENT" 
                ], 
                "Description": "Sample Description",
                "UsageInstructions": "To launch and invoke this agent on Amazon Bedrock AgentCore Runtime",
                "EnvironmentVariables":
                [
                  {
                    "Name": "HTTP_PORT",
                    "Description": "Port of the server",
                    "DefaultValue": "8080"
                  },
                  {
                    "Name": "API_KEY",
                    "Description": "Provide your unique API key here."
                  }
                ]
              }
            }
          }      
        ]
      }
    }
  ]
}
```

**Helm Chart Delivery Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "VersionTitle": "1.1",
          "ReleaseNotes": "Minor bug fix"
        },
        "DeliveryOptions":
        [
          {
            "DeliveryOptionTitle": "HelmChartDeliveryOption",
            "Details":
            {
              "HelmDeliveryOptionDetails":
              {
                "CompatibleServices":
                [
                  "EKS",
                  "EKS-Anywhere"
                ],
                "ContainerImages":
                [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:1.1"
                ],
                "HelmChartUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/reponame1:helmchart1.1",
                "Description": "Helm chart description",
                "UsageInstructions": "Usage instructions",
                "MarketplaceServiceAccountName": "Service account name",
                "ReleaseName": "Optional release name",
                "Namespace": "Optional Kubernetes namespace",
                "OverrideParameters":
                [
                  {
                    "Key": "HelmKeyName1",
                    "DefaultValue": "${AWSMP_LICENSE_SECRET}"
                  },
                  {
                    "Key": "HelmKeyName2",
                    "DefaultValue": "${AWSMP_SERVICE_ACCOUNT}"
                  }
                ]
              }
            }
          }
        ]
      }
    }
  ]
}
```

**Amazon EKS Add-On Delivery Request Syntax**

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json
{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "AddDeliveryOptions",
      "Entity": {
        "Type": "ContainerProduct@1.0",
        "Identifier": "$CreateProductChange.Entity.Identifier"
      },
      "DetailsDocument": {
        "Version": {
          "VersionTitle": "1.1",
          "ReleaseNotes": "New Add-on Release"
        },
        "DeliveryOptions": [
          {
            "DeliveryOptionTitle": "AWS Marketplace Test AddOn from CAPI 1",
            "Visibility": "Limited",
            "Details": {
              "EksAddOnDeliveryOptionDetails": {
                "ContainerImages": [
                  "111122223333.dkr.ecr.us-east-1.amazonaws.com/test-seller/canary-test-repo-product-6:mongo"
                ],
                "HelmChartUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/rocket/rocket-product-helm:1.0",
                "Description": "Description for delivery option provided by ISV",
                "UsageInstructions": "Usage instructions with launch instructions",
                "AddOnName": "aws-mp-test",
                "AddOnVersion": "1.2.1",
                "AddOnType": "networking",
                "CompatibleKubernetesVersions": [
                  "1.25",
                  "1.26"
                ],
                "SupportedArchitectures": [
                  "amd64",
                  "arm64"
                ],
                "Namespace": "my-test-namespace",
                "EnvironmentOverrideParameters": [
                  {
                    "Key": "cluster-name",
                    "Value": "${AWS_EKS_CLUSTER_NAME}"
                  },
                  {
                    "Key": "region-name",
                    "Value": "${AWS_REGION}"
                  }
                ]
              }
            }
          }
        ]
      },
      "ChangeName": "PublishAddonNew"
    }
  ]
}
```

Provide information for the fields to add the `AddDeliveryOptions` change type:
+ `Entity` (object) (required) – Your container-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `ContainerProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request. It includes all the information about the version that you are adding. This field is a string field.
  + `Version` (object) – Details about the version that you are adding to your product.
    + `VersionTitle` (string) – The title of the version that you are creating. Typically this is a description of the version, like **Version 1.1** or simply **1.1**. Your buyers will be able to choose the version to deploy from a list of version titles.
    + `ReleaseNotes` (string) – The detailed notes about this version. Must be less than 30,000 characters.
  + `DeliveryOptions` (array of objects) – An array of delivery options, where each is a method of delivery for your product version. For example, if you have one delivery option for Amazon Elastic Container Service (Amazon ECS) and another for Amazon Elastic Kubernetes Service (Amazon EKS), you must have two delivery options.
    + `DeliveryOptionTitle` (string) – A short description that helps your buyer to choose between your delivery options.
    + `Details` (object) – The resources used for this delivery option. This is a details field within the details field. You do not need to doubly escape characters in this field.
      + `AddOnName – `A unique add-on name that buyers will see in the Amazon EKS catalog. This name will add a prefix later using `SellerAlias`. For example, where `isv-alias_` is the ISV provided add-on name.
      + `AddOnType – `The type of add-on chosen from a list of supported values from Amazon EKS: Gitops \$1 monitoring \$1 logging \$1 cert-management \$1 policy-management \$1 cost-management \$1 autoscaling \$1 storage \$1 kubernetes-management \$1 service-mesh \$1 etcd-backup \$1 ingress-service-type \$1 load-balancer \$1 local-registry\$1 networking \$1 Security \$1 backup \$1 ingress-controller \$1 observability
      + `AddOnVersion – `A semantic version so that buyer can choose a specific version of AddOn they need to install or upgrade.
      + `CompatibleKubernetesVersions` – The Amazon EKS Kubernetes versions that this software is compatible with.
      + `CompatibleServices` (array of strings) – An array of services that the release is compatible with. Valid options: `ECS`, `EKS`, `ECS-Anywhere`, `EKS-Anywhere`, and `Bedrock-AgentCore`.
      + `ContainerImages` (array of strings) – An array of container image URLs used by this version. The path will be the repository that you have uploaded the image to, with the tag for the image used by this version. The list must include all needed images, even images that have not changed from previous versions. See the next section for information about creating repositories using the Catalog API.
      + `Description` (string) – A longer description of the delivery option to give details to your buyer. You can also include a link to more instructions provided elsewhere.
      + `EcrDeliveryOptionDetails` – `AgenticType` – The type of runtime agent. Valid options: `AGENT`, `MCP_SERVER`, or `A2A_SERVER`.
      + `EcrDeliveryOptionDetails` – `EnvironmentVariables` – List of environment variables that are required by the AgentCore Runtime container and that will be pre-populated for buyers upon deployment. For each variable, provide an object with the *name* as expected by your container, a *description*, and an optional *defaultValue*. For variables such as credentials or API keys that are unique, do not provide a default value. You can use the description to specify details about the variable as well as possible values. All of the provided variables with their default values will be pre-populated when buyers launch your product.
      + `EcrDeliveryOptionDetails – ``DeploymentResources (array of objects)` – An array of other resources needed for the version, such as Helm charts. Each resource includes a `Name` to describe it, and a `URL` that points at the resource.
      + `EnvironmentOverrideParameters – `List of system parameters to be used by the add-on. Some of the ISV provided AddOn (HelmChart) might require configurations with information derived from the Amazon EKS execution environment state (/system information). For example, `EksClusterRegion`, `EKSClusterName`, and others. You can avoid additional actions from Buyer by dynamically substituting these values at Amazon EKS AddOn launch. Amazon EKS System already supports automatic substitutions of system param for add-ons. AWS Marketplace ISV experience can be extended to collect this params which would require substitution.

        The generic system information to be substituted can be indicated by providing a AWS Marketplace specified constant following convention similar to Helm substitution. The supported values are `${AWS_REGION}` and `${AWS_EKS_CLUSTER_NAME}`.

        ```
         "EnvironmentOverrideParameters" : [ {
           "Key" : "my-field.region"
           "Value" : "${AWS_REGION}"
           },
           {
           "Key" : "my-second-field"
           "Value" : "${AWS_EKS_CLUSTER_NAME}"
           },
        ```
      + `HelmDeliveryOptionDetails` – `HelmChartUri (string)` – The URL to the Helm chart hosted in Amazon ECR that the buyer will install to launch the software.
      + `HelmDeliveryOptionDetails – ``MarketplaceServiceAccountName (string)` – *Optional * – The name of the Kubernetes service account. The service account will be used to connect to AWS Identity and Access Management (IAM) for permissions to call AWS services.
      + `HelmDeliveryOptionDetails – ``ReleaseName (string)` – *Optional * – The name for the Helm release provided to the `helm install` command that buyers use to launch the software. If not included, Helm will provide an automatically generated release name for you.
      + `HelmDeliveryOptionDetails – ``Namespace (string)` – *Optional * – The Kubernetes namespace where the Helm chart will be installed.
      + `HelmDeliveryOptionDetails – ``OverrideParameters (array of objects)` – Parameters that will be used in the Helm commands that launch the application. Buyers can override the default values.
**Note**  
For Amazon EKS Anywhere products, provide at least 1 override parameter for the license secret. Provide `DefaultValue` of `"${AWSMP_LICENSE_SECRET}"`.  
For paid products, provide at least 1 override parameter for service account configuration. Provide `DefaultValue` of `"${AWSMP_SERVICE_ACCOUNT}"`.
        + `Key` (string) – The key for the parameter in dot notation (override.example.key).
        + `DefaultValue` (string) – The default value for this override parameter.
      + `Namespace – `The ISV provided namespace for add-on installation.
      + `SupportedArchitectures – `The list of supported architectures, like amd64 and arm64.
      + `UsageInstructions` (string) – Provide instructions about the usage for this delivery option. Can be up to 4,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, including scanning the container images and other information to ensure that it meets the [AWS Marketplace guidelines for container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html). This process can take a few minutes to hours, depending on the number and size of your containers. 

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.

For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets). For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

**Asynchronous Errors**

The following errors are specific to `AddDeliveryOptions` 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\$1PRODUCT\$1STATUS  | Use an existing limited or public product. | 
|  INCOMPATIBLE\$1SERVICES  | The service list contains incompatible services. [incompatible\$1services] Provide a valid list of compatible services. | 
|  NO\$1SERVICE\$1SPECIFIED  | Provide at least 1 compatible service.  | 
|  DUPLICATE\$1COMPATIBLE\$1AWS\$1SERVICES  | The service list contains duplicate entries. Remove them. Each entry must be unique.  | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1VERSION\$1TITLE  | Remove the following unsupported characters: [x, y, z]  | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces from the beginning of the version title.  | 
|  INVALID\$1VERSION\$1TITLE  | Provide version title with fewer than [x] characters.  | 
|  DUPLICATE\$1VERSION\$1TITLE  | The version title [duplicate\$1version\$1title] is a duplicate. Remove or change the title. | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1RELEASE\$1NOTES  | Remove unsupported characters: [x, y, z]  | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces from the beginning of release notes.  | 
|  INVALID\$1RELEASE\$1NOTES  | Provide release notes with fewer than (x) characters.  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove unsupported characters: [x, y, z]  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Provide usage instructions with fewer than (x) characters. | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Provide usage instructions.  | 
|  MISSING\$1CONTAINER\$1IMAGES  | Provide at least 1 container image.  | 
|  NO\$1LICENSE\$1SECRET\$1KEYS  | For Amazon EKS Anywhere products, provide 1 override parameter for license secret. Needs DefaultValue of "\$1\$1AWSMP\$1LICENSE\$1SECRET\$1", see example in section.  | 
|  TOO\$1MANY\$1CONTAINER\$1IMAGES  | Provide fewer than 50 container images.  | 
|  DUPLICATE\$1CONTAINER\$1IMAGES  | The container image list contains duplicate images: [duplicate\$1images]. Provide a list with unique images.  | 
|  INVALID\$1CONTAINER\$1IMAGES  | Provide a valid URI for the container image.  | 
|  INVALID\$1CONTAINER\$1IMAGE\$1URI  | The image [invalid\$1image\$1uri] doesn't have access to this product. Upload the image to its corresponding product repository. For information about uploading, see [Getting started with container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html). | 
|  INVALID\$1CONTAINER\$1IMAGE\$1TAG  | Avoid using 'latest' tag.  | 
|  DUPLICATE\$1DELIVERY\$1OPTION\$1TITLES  | Duplicate delivery option titles: [duplicate\$1titles]. Remove the duplicates | 
|  INVALID\$1DELIVERY\$1OPTION\$1TITLES  | The delivery option titles [existing\$1titles] already exist. Provide a different title. | 
|  INVALID\$1FULFILLMENT\$1OPTION\$1TITLE  | Provide delivery option title with fewer than (x) characters.  | 
|  NO\$1SERVICE\$1ACCOUNT\$1CONFIGURATION  | For paid products, provide 1 override parameter for service account configuration. Needs DefaultValue of "\$1\$1AWSMP\$1SERVICE\$1ACCOUNT\$1", see example in section.  | 
|  INVALID\$1DETAILS   | Provided Details is not valid. | 
|  EMPTY\$1RESOURCE\$1NAME  | Provide resource name.  | 
|  EMPTY\$1RESOURCE\$1URL  | Provide resource URL.  | 
|  INVALID\$1RESOURCE\$1NAME  | Provide resource name with fewer than 256 characters.  | 
|  INVALID\$1RESOURCE\$1URL  | Provide resource URL with fewer than 256 characters.  | 
|  INVALID\$1SHORT\$1DESCRIPTION  | Provide a short description with fewer than 1,000 characters.  | 
|  INVALID\$1SHORT\$1DESCRIPTION  | Provide short description.  | 
|  SCAN\$1ERROR  | Fix security vulnerability ""[y]"" on Image ""[x]"".  | 
|  IMAGE\$1NOT\$1FOUND  | The public image URI [invalid\$1image\$1uri] is invalid. Provide a valid URI. | 
|  INVALID\$1ARN  | Provide a valid ARN for image access.  | 
|  IMAGE\$1INACCESSIBLE  | Provide a valid ARN for image access.  | 
|  DUPLICATE\$1ADDON\$1NAME  | The AddOn name you provided is already in use by a different product. Provide a different name.  | 
|  DUPLICATE\$1ADDON\$1VERSION  | The add-on version title [duplicate\$1version\$1title] is already in use. Provide a different title. | 
|  INVALID\$1ADDON\$1TYPE  | The add-on types [invalid\$1types] are invalid. Provide a type from the supported list: [eks\$1addon\$1do\$1supported\$1types]. | 
|  INVALID\$1KUBERNETES\$1VERSION  | The Kubernetes versions [invalid\$1versions] are invalid. Provide versions from the supported list: [eks\$1addon\$1do\$1supported\$1kubernetes\$1versions]. | 
|  DUPLICATE\$1KUBERNETES\$1VERSIONS  | Duplicate Kubernetes versions: [duplicate\$1versions]. Provide a list with unique versions. | 
|  INVALID\$1ARCHITECTURE  | The architectures [invalid\$1architectures] are invalid. Provide architectures from the Amazon EKS supported architectures : [eks\$1addon\$1do\$1supported\$1architectures]. | 
|  DUPLICATE\$1SUPPORTED\$1ARCHITECTURES  | Duplicate architectures: [duplicate\$1architectures]. Provide a list of unique, supported architectures. | 
|  INVALID\$1VISIBILITY\$1STATE  | The states [invalid\$1states] are invalid for the \$1EKS\$1DO\$1 delivery option. Provide a valid visibility state from the following allowed values: Limited. | 
|  INVALID\$1ENVIRONMENT\$1OVERRIDE\$1PARAMETER\$1VALUE  | The override parameter values [invalid\$1values] are invalid. Provide a valid value from the following list: [eks\$1addon\$1do\$1environment\$1override\$1parameter\$1values]. | 
|  DUPLICATE\$1ENVIRONMENT\$1OVERRIDE\$1PARAMETER\$1KEY  | The environment override parameters contain duplicate keys: [duplicate\$1keys]. Remove them. | 
|  TOO\$1MANY\$1EKS\$1ADDON\$1DELIVERY\$1OPTIONS  | Provide only one Amazon EKS add-on delivery option for the version.  | 
|  INCOMPATIBLE\$1ADDON\$1NAME  | The add-on name [provided\$1name] does not match the existing name. Reuse the existing name from the public version, or previous versions, of this add-on. You can only use one add-on name for each product. | 
|  INCOMPATIBLE\$1ADDON\$1TYPE  | The add-on type [provided\$1type] does not match the existing type. Reuse the existing type from the public version, or previous versions, of this add-on. You can only use one add-on type for each product. | 
|  INCOMPATIBLE\$1ADDON\$1NAMESPACE  | The add-on namespace [provided\$1namespace] does not match the existing namespace . Reuse the existing namespace from the public version, or previous versions, of this add-on. You can only use one add-on namespace for each product. | 
|  INVALID\$1HELM\$1CHART\$1URI  | The Helm chart URI [invalid\$1uri] is invalid. Provide a URI in the SemVer 2 format. | 
|  INCOMPATIBLE\$1HELM\$1OBJECTS(INVALID\$1HELM\$1OBJECTS)  | Provide a Helm chart without using the following unsupported Helm Objects: <unsupported-objects>.  | 
|  INVALID\$1DEPENDENT\$1HELM\$1CHARTS  | Provide a Helm chart that contains the following dependent charts directly in the parent chart directory and not externally sourced: <invalid-subcharts>.  | 
|  INVALID\$1HELM\$1SENSITIVE\$1CONFIG  | Provide an advanced configuration schema without sensitive information or secrets. Keywords: <sensitive-parameters-identified>  | 
|  INVALID\$1HELM\$1UNDECLARED\$1IMAGES  | Provide the following Helm chart images within the delivery option of the request: <list-of-images>.  | 
|  INVALID\$1HELM\$1CHART\$1IMAGES  | Provide a Helm chart containing images within repositories created via the AddRepositories change type. External images: <images-identified>.  | 
|  INVALID\$1HELM\$1LINT  | Provide a Helm chart that successfully passes Helm lint.  | 
|  INVALID\$1HELM\$1TEMPLATE  | Provide a Helm chart that successfully passes Helm template.  | 
|  INVALID\$1HELM\$1CHART  | Provide a Helm chart that adheres to AWS Marketplace guidance identified in [Helm Charts bulleted list](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html) in the AWS Marketplace Seller Guide.  | 
|  INVALID\$1ADDON\$1NAME  | Provide an AddOn name that follows the following regex pattern: xx  | 
|  INVALID\$1ADDON\$1NAMESPACE  | The namespace values [invalid\$1namespaces] are invalid. The namespace must follow the  \$1EKS\$1ADD\$1ON\$1NAMESPACE\$1REGEX\$1 regular expression. For example, namespace, namespace-test. | 
|  INVALID\$1ADDON\$1NAME\$1PATTERN  | Provide an add-on name that starts with a letter or digit, and then a combination of letters, digits, and hyphens. For example, test-addon, eksaddon  | 
|  INVALID\$1ADDON\$1VERSION\$1PATTERN  | Provide an add-on version using the following pattern: "<major>.<minor>.<patch>" (for example, 1.2.3, 0.1.2, 0.1.1)  | 
|  EMPTY\$1DELIVERY\$1OPTION\$1IDS  | Provide a list of delivery option IDs.  | 
|  INVALID\$1DELIVERY\$1OPTIONS\$1INPUT  | The list contains one or more invalid delivery options. Provide a valid list, and ensure that each option has a single delivery method. | 
|  OVERRIDE\$1PARAMETER\$1KEYS\$1CONTAINS\$1SPECIAL\$1CHARS  | The override parameter keys [invalid\$1keys] contain invalid characters. You keys must use only letters, numbers, double quotes (“ ”) and plus signs (\$1). | 
|  INVALID\$1CONTAINER\$1IMAGE\$1REPOSITORY  | The repositories [invalid\$1repositories] are invalid. Provide repositories created through the AddRepositories change type. | 
|  INVALID\$1CONTAINER\$1IMAGE\$1TAG\$1FORMAT  | The container image tag [invalid\$1image\$1tag] is invalid. Provide a tag conforming to the \$1CONTAINER\$1IMAGE\$1TAG\$1REGEX\$1 regular expression. | 
|  DUPLICATE\$1OVERRIDE\$1PARAMETER\$1KEYS  | The override parameters contain duplicate keys [duplicate\$1keys]. Remove the duplicates. | 
|  UNSUPPORTED\$1CONTAINER\$1IMAGE\$1URI  | The container image [unsupported\$1image] is unsupported. Provide an image that follows the [Image Manifest V 2, Schema 1](https://docker-docs.uclv.cu/registry/spec/manifest-v2-1/). | 
|  DUPLICATE\$1REPOSITORY\$1NAMES  | Duplicate repository names: [duplicate\$1repo\$1names]. Provide unique names. | 
|  INVALID\$1NAMESPACE  | The namespace values [invalid\$1namespaces] are invalid. Provide values that conform to the \$1HELM\$1RELEASE\$1PARAM\$1REGEX\$1 regular expression. | 
|  INVALID\$1RELEASE\$1NAME  | The releaseName values [invalid\$1release\$1names] are invalid. Provide values that conform to the \$1HELM\$1RELEASE\$1PARAM\$1REGEX\$1 regular expression. | 
|  OVERRIDE\$1PARAMETER\$1KEYS\$1CONTAINS\$1RESERVED\$1PARAMETER\$1KEYS  | The override parameter key for delivery option titles [invalid\$1keys] is reserved. Reserved keys: [reserved\$1param\$1keys]. Provide a different key. | 

## Update the visibility for an Amazon EKS add-on
<a name="update-delivery-option-visibility"></a>

You can use the Catalog API to update visibility for an Amazon EKS add-on delivery option of your product version in AWS Marketplace. Container and Helm delivery options for your container product are automatically created with ‘Public’ visibility status.

**Note**  
The ability to update visibility of your product version is supported only for the Amazon EKS add-on delivery option from the listed versions. If your product isn't 'Public' already, submit a request to publish the product with 'Public' visibility status by using the AWS Marketplace Management Portal.

By default, when you create a version with the Amazon EKS add-on delivery option, it's published in ‘Limited’ status. A ‘Limited’ status means the product isn't publicly available across all the Regions for your buyers to use and deploy in an Amazon EKS cluster. You can update the visibility of the delivery option from ‘Limited’ to ‘Public’ by calling the `StartChangeSet` API operation with the `UpdateDeliveryOptionsVisibility` change type. Specify the `DeliveryOptions Id` from your product version that corresponds to the Amazon EKS add-on delivery option.

**Request Syntax**

```
{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDeliveryOptionsVisibility",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptions":
        [
          {
            "Id": "do-1234567891234567891234",
            "TargetVisibility": "Public"
          }
        ]
      }
    }
  ]
}
```

To add the `UpdateDeliveryOptionsVisibility` change type, provide information for the following fields :
+ `Entity` (object) (required) – Your container-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product uses: `ContainerProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request, including the information about the repositories that you want to create. The following fields are all required.
  + `DeliveryOptions` (list of objects) – List of `DeliveryOption` objects, including the details of each:
    + `Id` (string) – Unique identifier for the `DeliveryOption`. (To get the unique identifier for the `DeliveryOption`, call the `DescribeEntity` action on the product that you're updating.
    + `TargetVisibility` – The intended new visibility of the product.

**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.

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

The change request is added to a queue and processed, including scanning the container images and other information to ensure that it meets the [AWS Marketplace guidelines for container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html). This process can take a few minutes to hours, depending on the number and size of your containers. 

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

For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets). For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

**Asynchronous Errors**

The following table shows errors that are specific to `AddDeliveryOptions` 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 | 
| --- | --- | 
|  EMPTY\$1DELIVERY\$1OPTION\$1IDS  | Provide a list of delivery option IDs. | 
|  INVALID\$1VISIBILITY\$1STATE  | The TargetVisibility option you provided is not supported. Please try again with an allowed option. The allowed option(s) are: Public | 
|  INVALID\$1DELIVERY\$1OPTION\$1IDS  | You provided invalid delivery option details. Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
|  DUPLICATE\$1DELIVERY\$1OPTION\$1IDS  | Duplicate delivery option IDs: [duplicate\$1ids]. Provide unique delivery option IDs. | 
|  AUDIT\$1ERROR  | You haven't completed independent software vendor (ISV) testing for all compatible Amazon EKS cluster versions for your Amazon EKS add-on version(s). You must complete testing before we can release the delivery option(s). | 
|  INVALID\$1DELIVERY\$1OPTION\$1TYPE  | The delivery option type you provided is not valid. Ensure that your delivery option is of type: EksAddOn and try again. | 
|  INCOMPATIBLE\$1HELM\$1OBJECTS  | Provide a Helm chart without unsupported Helm Objects: Unsupported Helm objects are as follows: all Release objects (except .Name and .Namespace), Helm hooks, and lookup functions. | 
|  INCOMPATIBLE\$1ADDON\$1NAME  | The add-on name [provided\$1name] does not match the public version name. Update the public name before releasing. | 
|  NCOMPATIBLE\$1ADDON\$1TYPE  | The add-on types don't match. Reuse the existing add-on type from the public add-on version or previous add-on versions of this product. Only one add-on is supported for each product. | 
|  INCOMPATIBLE\$1ADDON\$1NAMESPACE  | The provided add-on namespace [provided\$1namespace] does not match the public version namespace. Update the add-on namespace before releasing. | 

## Create repositories and resources
<a name="container-repos"></a>

To create a new version of a container-based product, you must have the resources for the version available in AWS Marketplace repositories. You create the repositories and then push (upload) the Docker (and Helm) resources into the repositories. To learn how to create the repositories through the AWS Marketplace Management Portal, see [ Add a new version of your product](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html#container-add-version) in the *AWS Marketplace Seller Guide*.

To create new repositories, call `StartChangeSet` with the `AddRepositories` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "AddRepositories",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "Repositories":
        [
          {
            "RepositoryName": "new-repo-1",
            "RepositoryType": "ECR"
          },
          {
            "RepositoryName": "new-repo-2",
            "RepositoryType": "ECR"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `AddRepositories` change type:

For more information about creating repositories, see [ Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the *AWS Marketplace Seller Guide*.
+ `Entity` (object) (required) – Your container-based product. 
  + **Identifier** (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `ContainerProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request. It includes the information about the repositories that you want to create. The included fields are all required.
  + `Repositories` (array of structures) – A list of repository objects. Each repository object includes a name and type.
    + `RepositoryName` (string) – The name of the repository to create. 
    + `RepositoryType` (string) – The type of the repository to create. The only allowed value is `ECR`. 

**Note**  
You can have up to 70 repositories per product, although you can add multiple resources, and versions of resources, to a single repository by giving them different tags when you push them.

After you create one or more repositories, you add your resources to the repositories. For information about how to push resources to repositories, see [ Pushing an image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html) in the *Amazon Elastic Container Registry User Guide*. For information about the specific push commands needed for one of your repositories, see [ Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the *AWS Marketplace Seller Guide*.

**Asynchronous Errors**

The following errors are specific to `AddRepositories` 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\$1ECR\$1REPOSITORY\$1NAME  | Provide repository name in the format: 'nginx-web-app' | 
|  DUPLICATE\$1ECR\$1REPOSITORY\$1NAME  | The repository [duplicate\$1repo\$1names] already exists. Choose a different name. | 
|  MISSING\$1REPOSITORY\$1INFORMATION  | Provide at least 1 repository name. | 
|  INVALID\$1ECR\$1REPOSITORY\$1NAME  | Maximum character length 256 reached. Character length count is inclusive of the seller namespace. | 

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

You can use the Catalog API to update the details of an existing version of your container-based product in AWS Marketplace.

**Note**  
When a product is publicly available, you cannot update the version title, container images, delivery option title, or deployment resources for the version. If you need to update these aspects of a product, create a new version instead.

To update an existing version of your container-based product, call the `StartChangeSet` API operation with the `UpdateDeliveryOptions` change type, as shown in the following example. This updates the detail information for the delivery options that you specify, as well as the associated version. You must include at least one delivery option.

**Container Image Delivery Request Syntax**

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

{
   "Catalog":"AWSMarketplace",
   "ChangeSet":[
      {
         "ChangeType":"UpdateDeliveryOptions",
         "Entity":{
            "Identifier":"example1-abcd-1234-5ef6-7890abcdef12",
            "Type":"ContainerProduct@1.0"
         },
         "DetailsDocument":{
            "Version":{
               "ReleaseNotes":"New release notes",
               "VersionTitle":"Version 1.2"
            },
            "DeliveryOptions":[
               {
                  "Id":"example4-2222-cccc-2222-cccccccccccc",
                  "Details":{
                     "EcrDeliveryOptionDetails":{
                        "DeliveryOptionTitle":"New Delivery Option Title",
                        "Description":"New description",
                        "UsageInstructions":"New usage instructions",
                        "CompatibleServices":[
                           "EKS"
                        ]
                     }
                  }
               }
            ]
         }
      }
   ]
}
```

**Helm Chart Delivery Request Syntax**

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

{
   "Catalog":"AWSMarketplace",
   "ChangeSet":[
      {
         "ChangeType":"UpdateDeliveryOptions",
         "Entity":{
            "Identifier":"example1-abcd-1234-5ef6-7890abcdef12",
            "Type":"ContainerProduct@1.0"
         },
         "DetailsDocument":{
            "Version":{
               "ReleaseNotes":"New release notes",
               "VersionTitle":"Version 1.2"
            },
            "DeliveryOptions":[
               {
                  "Id":"example5-2222-cccc-2222-cccccccccccc",
                  "Details":{
                     "HelmDeliveryOptionDetails":{
                        "DeliveryOptionTitle":"New Delivery Option Title",
                        "ContainerImages":[
                           "111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/imagename:1.0"
                        ],
                        "HelmChartUri":"111122223333.dkr.ecr.us-east-1.amazonaws.com/sellername/helmname:1.0",
                        "CompatibleServices":[
                           "EKS-Anywhere"
                        ],
                        "Description":"New description",
                        "UsageInstructions":"New usage instructions",
                        "MarketplaceServiceAccountName":"new-service-account-name",
                        "ReleaseName":"new-release-name",
                        "Namespace":"new-cluster-namespace",
                        "OverrideParameters":[
                           {
                              "Key":"new.parameter.key",
                              "DefaultValue":"New parameter default value"
                           }
                        ]
                     }
                  }
               }
            ]
         }
      }
   ]
}
```

**Amazon EKS Add-On Delivery Request Syntax**

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

{
   "Catalog":"AWSMarketplace",
   "ChangeSet":[
      {
         "ChangeType":"UpdateDeliveryOptions",
         "Entity":{
            "Identifier":"example1-abcd-1234-5ef6-7890abcdef12",
            "Type":"ContainerProduct@1.0"
         },
         "DetailsDocument":{
            "Version":{
               "ReleaseNotes":"New release notes",
               "VersionTitle":"Version 1.2"
            },
            "DeliveryOptions":[
               {
                  "Id":"example4-2222-cccc-2222-cccccccccccc",
                  "Details":{
                     "EksAddOnDeliveryOptionDetails":{
                        "ContainerImages":[
                           "709825985650.dkr.ecr.us-east-1.amazonaws.com/test-seller/canary-test-repo-product-6:mongo"
                        ],
                        "Description":"Description for delivery option provided by ISV",
                        "UsageInstructions":"Usage instructions with launch instructions",
                        "HelmChartUri":"709825985650.dkr.ecr.us-east-1.amazonaws.com/rocket/rocket-product-helm:1.0",
                        "AddOnName":"aws-mp-test",
                        "AddOnVersion":"1.2.1",
                        "AddOnType":"networking",
                        "CompatibleKubernetesVersions":[
                           "1.19",
                           "1.20"
                        ],
                        "SupportedArchitectures":[
                           "amd64",
                           "arm64"
                        ],
                        "Namespace":"my-test-namespace",
                        "EnvironmentOverrideParameters":[
                           {
                              "Key":"my-field",
                              "Value":"${AWS_EKS_CLUSTER_NAME}"
                           }
                        ]
                     }
                  }
               }
            ]
         }
      }
   ]
}
```

Provide information for the fields to add the `UpdateDeliveryOptions` change type:

For more information about these fields, see [ Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/ami-single-ami-products.html#single-ami-adding-version) in the *AWS Marketplace Seller Guide*.
+ `Entity` (object) (required) – Your container-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `ContainerProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request. It includes any information about the version of your container-based product that you would like to update. The included fields are all optional, but you must include at least one field to update.
  + `Version` (object) – Details about the software version.
    + `VersionTitle` (string) – The title of the version that you are creating. Typically this is a description of the version, such as **Version 1.1** or simply **1.1**. Your buyers will be able to choose the version to deploy from a list of all version titles.

      This property can't be updated if the product is already published publicly. 
    + `ReleaseNotes` (string) – Notes for buyers to tell them about changes from one version to the next. 
  + `DeliveryOptions` (list of objects) – List of `DeliveryOption` objects, including the details of each:
    + `Id` (string) – Unique identifier for the `DeliveryOption` (you can get the unique identifier for the `DeliveryOption` by calling the `DescribeEntity` action on the product you are updating).
    + `Details` (object) – Holds the details of a delivery option. Note that this nested details object does *not* need to be double-escaped.
      + `EcrDeliveryOptionDetails` (object) – The details of the container image delivery option.
        + `DeliveryOptionTitle` (string) – A short description that allows your buyer to choose between your delivery options.

          This property can't be updated if the product is already published publicly.
        + `ContainerImages` (array of strings) – An array of container image URLs used by this version. The path will be the repository that you have uploaded the image to, with the tag for the image used by this version. If this field is included, the list must include all needed images, even images that are not changing.

          This property can't be updated if the product is already published publicly.
        + `DeploymentResources` (array of objects) – An array of other deployment resources needed for the version, such as links to Helm charts or other documentation. Each resource includes a name to describe it and a URL that points at the resource. On the launch page for your version, this displays as a list of links.

          This property can't be updated if the product is already published publicly.
          + `Name` (string) – The text of the hyperlink that is shown to the buyer.
          + `Url` (string) – The URL of the hyperlink shown to the buyer.
        + `CompatibleServices` (array of strings) – An array of services that the release is compatible with. Valid options: `ECS`, `EKS`, `ECS-Anywhere`, `EKS-Anywhere`, and `Bedrock-AgentCore`.
        + `AgenticType` The type of runtime agent. Valid options: `AGENT`, `MCP_SERVER`, or `A2A_SERVER`.
        + `Description` (string) – A longer description of the delivery option to give details to your buyer. You can also include a link to more instructions hosted elsewhere.
        + `UsageInstructions` (string) – Provide instructions on how to deploy and use your product. You can also add a link to usage instructions hosted elsewhere. Can be up to 4,000 characters.
        + `EnvironmentVariables` – List of environment variables that are required by the AgentCore Runtime container and that will be pre-populated for buyers upon deployment. For each variable, provide an object with the *name* as expected by your container, a *description*, and an optional *defaultValue*. For variables such as credentials or API keys that are unique, do not provide a default value. You can use the description to specify details about the variable as well as possible values. All of the provided variables with their default values will be pre-populated when buyers launch your product.
    + `Id` (string) – Unique identifier for the `DeliveryOption` (you can get the unique identifier for the `DeliveryOption` by calling the `DescribeEntity` action on the product you are updating).
    + `Details` (object) – Holds the details of a delivery option. Note that this nested details object does *not* need to be double-escaped.
      + `HelmDeliveryOptionDetails` (object) – The details of the Helm chart delivery option.
        + `DeliveryOptionTitle` (string) – A short description that allows your buyer to choose between your delivery options.

          This property can't be updated if the product is already published publicly.
        + `ContainerImages` (array of strings) – An array of container image URLs used by this version. The path will be the repository that you have uploaded the image to, with the tag for the image used by this version. The list must include all needed images, even images that have not changed from previous versions. See the next section for information about creating repositories using the Catalog API.
        + `HelmChartUri` (string) – The URL to the Helm chart hosted in Amazon ECR that the buyer will install to launch the software.
        + `CompatibleServices` (array of strings) – An array of services that the release is compatible with. Valid options are `ECS` and `EKS`.
        + `Description` (string) – A longer description of the delivery option to give details to your buyer. You can also include a link to more instructions provided elsewhere.
        + `UsageInstructions` (string) – Provide instructions about the usage for this delivery option. Can be up to 4,000 characters.
        + `MarketplaceServiceAccountName` (string) – The name of the Kubernetes service account. The service account will be used to connect to AWS Identity and Access Management for permissions to call AWS services.
        + `ReleaseName` (string) – The name for the Helm release provided to the `helm install` command that buyers use to launch the software.
        + `Namespace` (string) – The Kubernetes namespace where the Helm chart will be installed.
        + `OverrideParameters` (array of objects) – Parameters that will be used in the Helm commands that launch the application. Buyers can override the default values.
          + `Key` (string)– The key for the parameter in dot notation (override.example.key).
          + `DefaultValue` (string) – The default value for this override parameter.

**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, including scanning the container images and other information to ensure that it meets the [AWS Marketplace guidelines for container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-policies.html). This process can take a few minutes to hours, depending on the number and size of your containers. 

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.

For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets). For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

**Asynchronous Errors**

The following errors are specific to `UpdateDeliveryOptions` 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\$1PRODUCT\$1STATUS  | Use an existing limited or public product.  | 
|  INCOMPATIBLE\$1SERVICES  | The service list contains incompatible services. [incompatible\$1services] Provide a valid list of compatible services.  | 
|  NO\$1SERVICE\$1SPECIFIED  | Provide at least 1 compatible service.  | 
|  DUPLICATE\$1COMPATIBLE\$1AWS\$1SERVICES  | The service list contains duplicate entries. Remove them. Each entry must be unique.  | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1VERSION\$1TITLE  | Remove the following unsupported characters: [x, y, z]  | 
|  INVALID\$1VERSION\$1TITLE  | Remove spaces from the beginning of the version title. | 
|  INVALID\$1VERSION\$1TITLE  | Provide version title with fewer than [x] characters.  | 
|  DUPLICATE\$1VERSION\$1TITLE  | The version title [duplicate\$1version\$1title] is a duplicate. Remove or change the title. | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1RELEASE\$1NOTES  | Remove unsupported characters: [x, y, z]  | 
|  INVALID\$1RELEASE\$1NOTES  | Remove spaces from the beginning of release notes.  | 
|  INVALID\$1RELEASE\$1NOTES  | Provide release notes with fewer than (x) characters.  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove spaces before the trademark symbol.  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Remove unsupported characters: [x, y, z]  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Provide usage instructions with fewer than (x) characters.  | 
|  INVALID\$1USAGE\$1INSTRUCTIONS  | Provide usage instructions.  | 
|  MISSING\$1CONTAINER\$1IMAGES  | Provide at least 1 container image.  | 
|  TOO\$1MANY\$1CONTAINER\$1IMAGES  | Provide fewer than 50 container images.  | 
|  DUPLICATE\$1CONTAINER\$1IMAGES  | The container image list contains duplicate images: [duplicate\$1images]. Provide a list with unique images.  | 
|  INVALID\$1CONTAINER\$1IMAGES  | Provide a valid URI for the container image.  | 
|  INVALID\$1CONTAINER\$1IMAGE\$1URI  | The image [invalid\$1image\$1uri] doesn't have access to this product. Upload the image to its corresponding product repository. For information about uploading, see [Getting started with container products](https://docs.aws.amazon.com/marketplace/latest/userguide/container-product-getting-started.html). | 
|  INVALID\$1CONTAINER\$1IMAGE\$1TAG  | Avoid using 'latest' tag.  | 
|  MISSING\$1DELIVERY\$1OPTION\$1IDS  | Provide delivery option from existing list of Ids.  | 
|  EMPTY\$1DELIVERY\$1OPTION\$1IDS  | Provide non-empty list of delivery option IDs.  | 
|  DUPLICATE\$1DELIVERY\$1OPTION\$1IDS  | Duplicate delivery option IDs: [duplicate\$1ids]. Provide unique delivery option IDs. | 
|  DUPLICATE\$1DELIVERY\$1OPTION\$1TITLES  | Duplicate delivery option titles: [duplicate\$1titles]. Remove the duplicates | 
|  INVALID\$1DELIVERY\$1OPTION\$1TITLES  | The delivery option titles [existing\$1titles] already exist. Provide a different title. | 
|  INVALID\$1FULFILLMENT\$1OPTION\$1TITLE  | Provide delivery option title with fewer than (x) characters.  | 
|  EMPTY\$1RESOURCE\$1NAME  | Provide resource name.  | 
|  EMPTY\$1RESOURCE\$1URL  | Provide resource URL.  | 
|  INVALID\$1RESOURCE\$1NAME  | Provide resource name with fewer than 256 characters.  | 
|  INVALID\$1RESOURCE\$1URL  | Provide resource URL with fewer than 256 characters.  | 
|  INVALID\$1SHORT\$1DESCRIPTION  | Provide a short description with fewer than 1,000 characters.  | 
|  INVALID\$1SHORT\$1DESCRIPTION  | Provide short description.  | 
|  NO\$1LICENSE\$1SECRET\$1KEYS  | For Amazon EKS Anywhere products, provide 1 override parameter for license secret. Needs DefaultValue of "\$1\$1AWSMP\$1LICENSE\$1SECRET\$1", see example in section.  | 
|  NO\$1SERVICE\$1ACCOUNT\$1CONFIGURATION  | For paid products, provide 1 override parameter for service account configuration. Needs DefaultValue of "\$1\$1AWSMP\$1SERVICE\$1ACCOUNT\$1", see example in section.  | 
|  SCAN\$1ERROR  | Fix security vulnerability ""[y]"" on Image ""[x]"".  | 
|  FIELD\$1NOT\$1ALLOWED\$1TO\$1CHANGE  | Field [x] cannot be changed.  | 
|  INVALID\$1DELIVERY\$1OPTIONS\$1STATUS  | The delivery option IDs [invalid\$1ids] are invalid. Provide delivery options in the limited or public state. | 
|  NO\$1CHANGE\$1FOUND  | Provide at least 1 change.  | 
|  MULTIPLE\$1VERSION\$1UPDATE  | Provide delivery option IDs from the same version.  | 
|  OVERRIDE\$1PARAMETER\$1KEYS\$1CONTAINS\$1SPECIAL\$1CHARS  | The override parameter keys [invalid\$1keys] contain invalid characters. You keys must use only letters, numbers, double quotes (“ ”) and plus signs (\$1). | 
|  INVALID\$1CONTAINER\$1IMAGE\$1REPOSITORY  | The repositories [invalid\$1repositories] are invalid. Provide repositories created through the AddRepositories change type. | 
|  INVALID\$1CONTAINER\$1IMAGE\$1TAG\$1FORMAT  | The container image tag [invalid\$1image\$1tag] is invalid. Provide a tag conforming to the \$1CONTAINER\$1IMAGE\$1TAG\$1REGEX\$1 regular expression. | 
|  DUPLICATE\$1OVERRIDE\$1PARAMETER\$1KEYS  | The override parameters contain duplicate keys [duplicate\$1keys]. Remove the duplicates. | 
|  UNSUPPORTED\$1CONTAINER\$1IMAGE\$1URI  | The container image [unsupported\$1image] is unsupported. Provide an image that follows the [Image Manifest V 2, Schema 1](https://docker-docs.uclv.cu/registry/spec/manifest-v2-1/). | 
|  INVALID\$1NAMESPACE  | The namespace values [invalid\$1namespaces] are invalid. Provide values that conform to the \$1HELM\$1RELEASE\$1PARAM\$1REGEX\$1 regular expression. | 
|  INVALID\$1RELEASE\$1NAME  | The releaseName values [invalid\$1release\$1names] are invalid. Provide values that conform to the \$1HELM\$1RELEASE\$1PARAM\$1REGEX\$1 regular expression. | 
|  OVERRIDE\$1PARAMETER\$1KEYS\$1CONTAINS\$1RESERVED\$1PARAMETER\$1KEYS  | The override parameter key for delivery option titles [invalid\$1keys] is reserved. Reserved keys: [reserved\$1param\$1keys]. Provide a different key. | 
|  INCOMPATIBLE\$1ADDON\$1NAME  | The add-on name [provided\$1name] does not match the existing name. Reuse the existing name from the public version, or previous versions, of this add-on. You can only use one add-on name for each product. | 
|  INCOMPATIBLE\$1ADDON\$1NAMESPACE  | The add-on namespace [provided\$1namespace] does not match the existing namespace . Reuse the existing namespace from the public version, or previous versions, of this add-on. You can only use one add-on namespace for each product. | 

## Restrict a version
<a name="container-restrict-version"></a>

You can use the Catalog API to restrict a version of your container-based product in AWS Marketplace. This prevents new buyers from being able to use that version. There must be at least one publicly available version in a product. You cannot restrict the only remaining publicly available version for a product.

To restrict a version, call the `StartChangeSet` API operation with the `RestrictDeliveryOptions` change type, as shown in the following example.

**Note**  
Restricting one or more, but not all, delivery options from a version will remove those options from being available to your buyers. Restricting all delivery options for a version will remove that version from the AWS Marketplace catalog.  
Restricting an Amazon EKS add-on is currently not supported through the Catalog API.  
Restricted versions are still available for existing customers.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "RestrictDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12",
        "Type": "ContainerProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptionIds":
        [
          "example1-2222-cccc-2222-cccccccccccc"
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `RestrictDeliveryOptions` change type:
+ `Entity` (object) (required) – Your container-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `ContainerProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request. It includes IDs for the delivery options of your container-based product that you would like to restrict.
  + `DeliveryOptionIds` (array of strings) – List of `DeliveryOption` IDs for the versions that you want to restrict. You can get the unique identifier for the `DeliveryOption` by calling the `DescribeEntity` action on the product you are restricting.

**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 process can take a few minutes to hours. 

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.

For more information about change sets, see [Working with change sets](catalog-apis.md#working-with-change-sets). For more information about errors in seller product change sets, see [Change set status and errors](work-with-seller-products.md#seller-product-change-set-errors).

**Asynchronous Errors**

The following errors are specific to `RestrictDeliveryOptions` 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\$1PRODUCT\$1STATUS  | Use a public product. | 
|  MISSING\$1DELIVERY\$1OPTION\$1IDS  | Provide delivery option from existing list of IDs. | 
|  INVALID\$1DELIVERY\$1OPTIONS\$1STATUS  | The delivery option IDs [invalid\$1ids] are invalid. Provide delivery options in the public state. | 
|  EMPTY\$1DELIVERY\$1OPTION\$1IDS  | Provide non-empty list of delivery option IDs. | 
|  INVALID\$1MINIMUM\$1PUBLIC\$1DELIVERY\$1OPTIONS  | Cannot restrict all delivery option IDs. | 
|  DUPLICATE\$1DELIVERY\$1OPTION\$1IDS  | Duplicate delivery option IDs: [duplicate\$1ids]. Provide unique delivery option IDs. | 

# Work with SaaS products using the AWS Marketplace APIs
<a name="work-with-saas-products"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with SaaS-based products. For information about creating SaaS-based products, see [Create a product](work-with-seller-products.md#create-product). The following topics describe how to perform Catalog API actions:

**Topics**
+ [Configure Free pricing model for SaaS products](#saas-free-pricing-model)
+ [SaaS Quick Launch options](#saas-quick-launch-resources)
+ [Add delivery options](#add-delivery-options)
+ [SaaSUrlDeliveryOption](#saas-url-delivery-option)

## Configure Free pricing model for SaaS products
<a name="saas-free-pricing-model"></a>

SaaS products can be offered with a Free pricing model, which allows buyers to use your product at no cost. When using the Free pricing model for SaaS products, you must configure pricing dimensions with zero-dollar pricing in either UsageBasedPricingTerm or ConfigurableUpfrontPricingTerm.

**Note**  
The Free pricing model requirement for SaaS products is unique. For SaaS products with Free pricing, you must create at least one dimension with either UsageBasedPricingTerm or ConfigurableUpfrontPricingTerm, and all dimensions must be priced at \$10.00. This requirement does not apply to AMI, container, or machine learning products.

To configure Free pricing for a SaaS product:

1. Create pricing dimensions for your product using the `AddDimensions` change type. For more information, see [Add pricing dimensions](work-with-seller-products.md#add-dimensions) in the seller products documentation.

1. Create an offer with the `PricingModel` set to `Free` and include either `UsageBasedPricingTerm` or `ConfigurableUpfrontPricingTerm` with all dimension prices set to \$10.00. For more information about creating offers, see [Work with offers using the AWS Marketplace APIs](work-with-offers.md).

When configuring the offer, ensure that:
+ All rate card prices in `UsageBasedPricingTerm` are set to "0.00" (string format)
+ All charge amounts in `ConfigurableUpfrontPricingTerm` are set to "0.00" (string format)
+ At least one dimension with \$10.00 pricing is included

## SaaS Quick Launch options
<a name="saas-quick-launch-resources"></a>

For information about Quick Launch options, see the following resources:
+ (Buyers) For Quick Launch options for SaaS products, see [Configuring and launching Saas products using Quick Launch](https://docs.aws.amazon.com/marketplace/latest/buyerguide/saas-quick-launch.html) in the *AWS Marketplace Buyer Guide*.
+ (Sellers) For Quick Launch options for SaaS products, see [Configure Quick Launch](https://docs.aws.amazon.com/marketplace/latest/userguide/saas-product-settings.html#saas-quick-launch) in the *AWS Marketplace Seller Guide*.
+ For a Quick Launch workshop for SaaS products, see [Lab: Enable SaaS Quick Launch](https://catalog.workshops.aws/mpseller/en-US/saas/quick-launch-integration) in the *AWS Marketplace seller workshop*.

## Add delivery options
<a name="add-delivery-options"></a>

You can use the Catalog API to add delivery options for a SaaS product in AWS Marketplace. API delivery options enable sellers to offer API-based services that integrate with AWS services such as Amazon Bedrock for AI agent workflows.

To add API delivery options, call the `StartChangeSet` API operation with the `AddDeliveryOptions` change type to add delivery details, as shown in the following example. 

The following topics explain how to add use the `ApiDeliveryOptionDetails` and `SaaSUrlDeliveryOptionDetails` options.

**Topics**
+ [ApiDeliveryOptionDetails](#api-delivery-option-details)
+ [Update delivery options](#update-delivery-options)
+ [Update delivery option visibility](#update-delivery-options-visibility)

### ApiDeliveryOptionDetails
<a name="api-delivery-option-details"></a>

The example in this section supports the `ApiDeliveryOptionDetails` delivery option type, which allows you to specify API endpoints, authentication methods, and integration protocols for your SaaS product.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1 
Content-type: application/json
   {
  "ChangeType": "AddDeliveryOptions",
  "Entity": {
    "Identifier": "prod-1234567890123",
    "Type": "SaaSProduct@1.0"
  },
  "Details": {
    "DeliveryOptions": [
      {
        "Details": {
          "ApiDeliveryOptionDetails": {
            "ApiType": "AGENT",
            "QuickLaunchEnabled": true,
            "FulfillmentUrl": "https://example.com/fulfillment",
            "UsageInstructions": "# Getting Started\\n\\nTo use this API:\\n1. Register for an API key\\n2. Configure your endpoint\\n3. Start making requests",
            "CompatibleServices": ["Bedrock-AgentCore"],
            "Endpoints": [
              {
                "Name": "GenerateContent",
                "EndpointUrl": "https://api.example.com/v1/generate",
                "Description": "Generate content using AI models",
                "AuthorizationTypes": ["API_KEY"],
                "Schemas": [{
                  "Type": "OPEN_API",
                  "SchemaUrl": "https://example.com/schemas/example-schema.json"
                }],
                "IntegrationProtocols": [
                  {
                    "Type": "MCP",
                    "UsageInstructions": "Connect using Model Context Protocol for seamless integration"
                  }
                ]
              }
            ]
          }
        }
      }
    ]
  }
}
```

Provide information for the fields to add the `AddDeliveryOptions` change type:
+ `Entity` (object) (required) – Your SaaS-based product.
  + `Identifier` (string) (required) – Your product ID. For more information, see Identifier.
  + `Type` (string) (required) – The Type is based on the delivery method (product type) that your product will be using: `SaaSProduct@1.0`.
+ `DetailsDocument` (object) (required) – Details of the request.
  + `DeliveryOptions` (array) – Details of the API delivery options being added.
    + `Details` (object) – Contains the `ApiDeliveryOptionDetails` of a delivery option to be added.
      + `ApiDeliveryOptionDetails` (object) – Contains the API delivery option details for a SaaS product.
        + `ApiType` (string) (required) – Type of API offering. Valid values: `MCP_SERVER`, `KNOWLEDGE_BASE`, `AGENT`, `GUARDRAIL`, `OTHER`.
        + `QuickLaunchEnabled` (boolean) (required) – Determines if buyers can use Quick Launch to configure and launch the software.
        + `FulfillmentUrl` (string) (required) – The URL to the seller's software registration landing page.
        + `UsageInstructions` (string) (required) – Instructions for using this API delivery option. Supports markdown formatting. Maximum 30,000 characters.
        + `CompatibleServices` (array) (optional) – Supported AWS services for this delivery option. Currently supports `Bedrock-AgentCore`.
        + `Endpoints` (array) (required) – The API endpoints available for this offering. Must contain exactly one endpoint.
          + `Name` (string) (optional) – The name of the API endpoint. Must match pattern `^[A-Za-z][a-zA-Z0-9-]+$`. Maximum 100 characters.
          + `EndpointUrl` (string) (required) – The URL of the API endpoint. Must be a valid HTTPS URL.
          + `Description` (string) (optional) – A description of the API endpoint and its functionality. Maximum 4,000 characters.
          + `AuthorizationTypes` (array) (required) – The types of authorization required to access the API endpoint. Valid values: `API_KEY`, `OAUTH2`. Must contain 1-2 unique values.
          + `Schemas` (array) (optional) – The schema specifications for the API endpoint. Maximum 1 schema.
            + `Type` (string) (required) – Schema type. Valid value: `OPEN_API`.
            + `SchemaUrl` (string) (required) – The S3 URL of the schema that has been ingested into a Marketplace owned S3 bucket.
          + `IntegrationProtocols` (array) (optional) – Protocol types supported by the endpoint. Maximum 2 protocols.
            + `Type` (string) (required) – Protocol identifier. Valid values: `MCP`, `A2A`.
            + `UsageInstructions` (string) (required) – Additional instructions for utilizing the protocol with the endpoint. Maximum 30,000 characters.

****Response Syntax****

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

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

**Synchronous Validations**


| Error condition | Message | HTTP code | 
| --- | --- | --- | 
|  Invalid API Type  |  You provided an invalid API type. Valid values are: MCP\$1SERVER, KNOWLEDGE\$1BASE, AGENT, GUARDRAIL, OTHER.  |  422  | 
|  Invalid Fulfillment Url  |  Provide a valid fulfillment URL beginning with "https://".  |  422  | 
|  Missing Required Fields  |  Required parameter is missing. You must provide ApiType, QuickLaunchEnabled, FulfillmentUrl, UsageInstructions, and Endpoints.  |  422  | 
|  Invalid Endpoint URL  |  Provide a valid endpoint URL beginning with "https://".  |  422  | 
|  Missing Authorization Types  |  You must provide at least one authorization type. Valid values are: API\$1KEY, OAUTH2.  |  422  | 
|  Invalid Authorization Types  |  You provided invalid authorization types. Valid values are: API\$1KEY, OAUTH2.  |  422  | 
|  Too Many Endpoints  |  You cannot provide more than 1 endpoint for API delivery options.  |  422  | 
|  Invalid Compatible Services  |  You provided invalid compatible services. Valid values are: Bedrock-AgentCore.  |  422  | 
|  Invalid Schema Type  |  You provided an invalid schema type. Valid value is: OPEN\$1API.  |  422  | 
|  Invalid Schema URL  |  Provide a valid schema URL that points to a Marketplace owned S3 bucket.  |  422  | 
|  Invalid Integration Protocol  |  You provided an invalid integration protocol type. Valid values are: MCP, A2A.  |  422  | 
|  Too Many Integration Protocols  |  You cannot provide more than 2 integration protocols.  |  422  | 
|  Invalid Usage Instructions  |  Usage instructions exceed the maximum length of 30,000 characters.  |  422  | 

**Asynchronous Errors**


| Error code | Error message | 
| --- | --- | 
|  DUPLICATE\$1DELIVERY\$1OPTIONS  |  You provided one or more delivery option types that already exist for this product. Provide a unique delivery option type or use `UpdateDeliveryOptions` if you intended to change an existing delivery option.  | 
|  INVALID\$1FULFILLMENT\$1URL  |  The URL you provided returned HTTP status code [x]. Provide a fulfillment URL that renders with a 200.  | 
|  INVALID\$1ENDPOINT\$1URL  |  The URL you provided returned HTTP status code [x]. Provide an endpoint URL that renders with a 200.  | 
|  INVALID\$1SCHEMA\$1URL  |  The schema URL you provided is invalid or inaccessible. Provide a valid schema URL that points to an Amazon S3 bucket owned by AWS Marketplace.  | 

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

You can use the Catalog API to update the delivery options for a SaaS product in AWS Marketplace. 

To update the delivery options, call the `StartChangeSet` API operation with the `UpdateDeliveryOptions` change type, as shown in the following example.

**Note**  
This supports the `ApiDeliveryOptionDetails` delivery option type. You must provide the delivery option ID to identify which option to update.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1 
Content-type: application/json
{
    "Catalog": "AWSMarketplace",
    "ChangeSet": [
        {
            "ChangeType": "UpdateDeliveryOptions",
            "Entity": {
                "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
                "Type": "SaaSProduct@1.0"
            },
            "DetailsDocument": {
                "DeliveryOptions": [
                    {
                        "Id": "do-1234567891234567891234",
                        "Details": {
                            "ApiDeliveryOptionDetails": {
                                "ApiType": "AGENT",
                                "QuickLaunchEnabled": true,
                                "FulfillmentUrl": "https://example.com/fulfillment-updated",
                                "UsageInstructions": "# Updated Getting Started\\n\\nTo use this updated API:\\n1. Register for an API key\\n2. Configure your endpoint\\n3. Start making requests",
                                "CompatibleServices": ["Bedrock-AgentCore"],
                                "Endpoints": [
                                    {
                                        "Name": "GenerateContent",
                                        "EndpointUrl": "https://api.example.com/v2/generate",
                                        "Description": "Generate content using updated AI models",
                                        "AuthorizationTypes": ["API_KEY", "OAUTH2"],
                                        "Schemas": [{
                                            "Type": "OPEN_API",
                                            "SchemaUrl": "https://example.com/schemas/updated-schema.json"
                                        }],
                                        "IntegrationProtocols": [
                                            {
                                                "Type": "MCP",
                                                "UsageInstructions": "Connect using Model Context Protocol for seamless integration"
                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        }
    ]
}
```

Provide information for the fields to update the `UpdateDeliveryOptions` change type with API delivery options:
+ `Entity` (object) (required) – Your SaaS-based product.
  + `Identifier` (string) (required) – Your product ID. For more information, see Identifier.
  + `Type` (string) (required) – The Type is based on the delivery method (product type) that your product will be using: `SaaSProduct@1.0`.
+ `DetailsDocument` (object) (required) – Details of the request.
  + `DeliveryOptions` (array) – Contains the details of the API delivery options being updated.
    + `Id` (string) (required) – Unique identifier for the DeliveryOption. (Get the unique identifier for the DeliveryOption by calling the `DescribeEntity` action on the product you are updating.)
    + `Details` (object) – Contains the `ApiDeliveryOptionDetails` of the delivery option to be updated.
      + `ApiDeliveryOptionDetails` (object) – Contains the API delivery option details for SaaS product.
        + `ApiType` (string) (required) – Type of API offering. Valid values: `MCP_SERVER`, `KNOWLEDGE_BASE`, `AGENT`, `GUARDRAIL`, `OTHER`.
        + `QuickLaunchEnabled` (boolean) (required) – Determines if buyers can use Quick Launch to configure and launch the software.
        + `FulfillmentUrl` (string) (required) – The URL to be updated for the SaaS product.
        + `UsageInstructions` (string) (required) – Instructions for using this API delivery option. Supports markdown formatting. Maximum 30,000 characters.
        + `CompatibleServices` (array) (optional) – Supported AWS services for this delivery option. Currently supports `Bedrock-AgentCore`.
        + `Endpoints` (array) (required) – The API endpoints available for this offering. Must contain exactly one endpoint.
          + `Name` (string) (optional) – The name of the API endpoint.
          + `EndpointUrl` (string) (required) – The URL of the API endpoint to be updated.
          + `Description` (string) (optional) – A description of the API endpoint and its functionality.
          + `AuthorizationTypes` (array) (required) – The types of authorization required to access the API endpoint. Valid values: `API_KEY`, `OAUTH2`.
          + `Schemas` (array) (optional) – The schema specifications for the API endpoint.
            + `Type` (string) (required) – Schema type. Valid value: `OPEN_API`.
            + `SchemaUrl` (string) (required) – The S3 URL of the updated schema.
          + `IntegrationProtocols` (array) (optional) – Protocol types supported by the endpoint.
            + `Type` (string) (required) – Protocol identifier. Valid values: `MCP`, `A2A`.
            + `UsageInstructions` (string) (required) – Additional instructions for utilizing the protocol with the endpoint.

**Response Syntax**

```
{
"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 it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**


| Error condition | Message | HTTP code | 
| --- | --- | --- | 
| Empty Delivery Option Ids | Provided Details is not valid. String '' at /DeliveryOptions/0/Id does not match required schema regex, '^do-[a-zA-Z0-9]\$1\$1' | 422 | 
| Missing Delivery Option Ids | Provided Details is not valid. JSON at /DeliveryOptions/0 is missing required properties: ['Id']. | 422 | 
| Duplicate Delivery Option Ids | Provide unique delivery option IDs. | 422 | 
| Invalid Fulfillment Url | Provide a valid fulfillment URL beginning with "https://". | 422 | 
| Invalid Delivery Option IDs | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 422 | 
| Multiple URL Delivery Options | You provided more than one URL delivery option. Provide one URL delivery option. | 422 | 
| Missing delivery option ids | The delivery option ID is missing. Provide one or more valid delivery option IDs that you wish to update, or use AddDeliveryOptions if you intended to add a new delivery option. | 422 | 
| Invalid Launch URL | Provide a valid launch URL beginning with "https://". | 422 | 
| Missing Launch Url | Required parameter LaunchUrl is missing. You must provide a LaunchUrl. | 422 | 
| Missing deployment templates | The deployment template is missing. Provide at least one deployment template. | 422 | 
| Too many deployment templates | You cannot provide more than 20 deployment templates. | 422 | 
| Invalid template URL | Quick Start URL is invalid. Provide deployment template URL that is published through AWS QuickStarts to Amazon S3. Invalid deployment templates URL: [x] | 422 | 
| Invalid deployment template stack name | The deployment template stack name is invalid. Provide a valid stack name using only alphanumeric characters and hyphens. It must start with an alphabetical character and can't be longer than 128 characters. | 422 | 
| Duplicate deployment template title | You provided duplicate deployment template titles. Provide unique deployment template titles. | 422 | 
| Duplicate deployment template URL | You provided duplicate deployment template urls. Provide unique deployment template urls. | 422 | 
| Invalid deployment template type | The deployment template type is invalid. Provide a valid deployment template type. Supported values are ["CloudFormation@1.0"]. | 422 | 
| Invalid deployment template IAM policy | The deployment template IAM policy is invalid. Provide a valid IAM policy. | 422 | 
| Invalid usage instructions |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-saas-products.html)  | 422 | 

**Asynchronous Errors**


| Error code  | Error message | 
| --- | --- | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| AUDIT\$1ERROR | AWS MP Catalog Audits List - CQ team | 
| INVALID\$1FULFILLMENT\$1URL | The URL you provided returned HTTP status code [x]. Provide a fulfillment URL that renders with a 200. | 
| INVALID\$1LAUNCH\$1URL | The URL you provided returned HTTP status code [x]. Provide a launch URL that renders with a 200. | 
| INVALID\$1TEMPLATE\$1URL  | Quick Start URL is invalid. Provide deployment template URL that is published through AWS QuickStarts to Amazon S3. Invalid deployment templates URL: [x] | 

### Update delivery option visibility
<a name="update-delivery-options-visibility"></a>

You can use the Catalog API to configure permissions so that only some users can change the visibility for a SaaS product in AWS Marketplace. 

To configure permissions so that only some users can change the visibility for a SaaS product, call the `StartChangeSet` API operation with the `UpdateDeliveryOptionsVisibility` change type, as shown in the following example. 

**Note**  
This is only supported for one delivery option: `SaaSUrlDeliveryOptionDetails`. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDeliveryOptionsVisibility",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "SaaSProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptions":
        [
          {
            "Id": "do-1234567891234567891234",
            "TargetVisibility": "Public"
          },
          {
            "Id": "do-43210987654321",
            "TargetVisibility": "Limited",
            "Targeting":
            {
              "PositiveTargeting":
              {
                "BuyerAccounts":
                [
                  "123456789012"
                ]
              }
            }
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateDeliveryOptionsVisibility` change type:
+ `Entity` (object) (required) – Your SaaS-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `SaaSProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request.
  + `DeliveryOptions` (array) – List of `DeliveryOptions` to be updated.
    + `TargetVisibility` (string) – The delivery option id to be updated.
    + `TargetVisibility` (string) – The intended new visibility of the delivery option.

      Possible values: `Limited`, `Public`, and `Unavailable`.
**Note**  
There is always exactly one `Public` delivery option, and a maximum of one `Limited` delivery option.
    + `Targeting` (object) *optional * – Targeting of the delivery option, used in conjunction with the `Limited` visibility status to be able to test the new delivery option before changing the visibility to `Public`.
      + `PositiveTargeting` (object) – Specifying inclusive targeting.
        + `BuyerAccounts` (array of strings) – The list of buyer AWS account ids who will be able to use the new delivery option. 

          Min size: 0. Max size: 100.

**Response Syntax**

```
{
"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 anywhere from a few minutes to a few hours. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**


| Error condition | Message | HTTP code | 
| --- | --- | --- | 
| Missing delivery option ids | The delivery option ID is missing. Provide one or more valid delivery option IDs that you wish to update, or use AddDeliveryOptions if you intended to add a new delivery option. | 422 | 
| Invalid visibility | You provided invalid option for TargetVisibility. Allowed options are: Limited, Public, Unavailable. | 422 | 
| Invalid targeting | You provided invalid option for PositiveTargeting. You must provide a valid parameter for BuyerAccounts. | 422 | 
| Missing Visibility and Targeting | You provided invalid delivery option visibility details. You must provide a valid parameter for at least one of TargetVisibility or Targeting. | 422 | 
| Too many AWS account ids | You cannot provide more than 100 targeted buyer accounts. | 422 | 

**Asynchronous Errors**


| Error code  | Error message | 
| --- | --- | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | You provided invalid delivery option details. Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| INVALID\$1VISIBILITY | You provided more than one delivery option for the public state. Provide only one public delivery option. | 
| INVALID\$1VISIBILITY | You didn't provide a public delivery option. Provide one public delivery option. | 
| AUDIT\$1ERROR | Varies based on MCO manual review. | 

## SaaSUrlDeliveryOption
<a name="saas-url-delivery-option"></a>

The following example shows how to use the `SaaSUrlDeliveryOptionDetails` to update the `FulfillmentUrl`.

**Request Syntax**

```
POST /StartChangeSet HTTP/1.1 
Content-type: application/json
     
{
    "Catalog": "AWSMarketplace",
    "ChangeSet": [
        {
            "ChangeType": "UpdateDeliveryOptions",
            "Entity": {
                "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
                "Type": "SaaSProduct@1.0"
            },
            "DetailsDocument": {
                "DeliveryOptions": [
                    {
                        "Id": "do-1234567891234567891234",
                        "Details": {
                            "SaaSUrlDeliveryOptionDetails": {
                                "FulfillmentUrl": "https://www.aws.amazon.com/marketplace/management",
                                "LaunchUrl": "URL",
                                "UsageInstructions": "Instructions",
                                "DeploymentTemplates": [
                                    {
                                        "Title": "CloudFormation Template 123",
                                        "Description": "CloudFormation description",
                                        "IamPolicy": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"s3:Get*\",\"s3:List*\"],\"Resource\":\n[\"arn:aws:s3:::amzn-s3-demo-bucket\",\"arn:aws:s3:::amzn-s3-demo-bucket/*\"]}]}"
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        }
    ]
}
```

Provide information for the fields to add the `AddDeliveryOptions` change type:
+ `Entity` (object) (required) – Your SaaS-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `SaaSProduct@1.0`. 
+ **DetailsDocument** (object) (required) – Details of the request.
  + `DeliveryOptions` (array) – Contains the details of the delivery options being updated.
    + `TargetVisibility` (string) – Unique identifier for the `DeliveryOption`. (Get the unique identifier for the `DeliveryOption` by calling the `DescribeEntity` action on the product you are updating.)
    + `Details` (object) – Contains the `SaaSUrlDeliveryOptionDetails` of the delivery option to be updated.
      + `SaaSUrlDeliveryOptionDetails` (object) – Contains the `FulfillmentUrl` of a delivery option for SaaS product.
        + `FulfillmentUrl` (string) – The URL to be updated for the SaaS product.
        + `LaunchUrl` (string) – The URL to your SaaS product’s landing page. This is required if `QuickLaunchEnabled` is set to `True`.
        + `UsageInstructions` (string) – Instructions for using this delivery option. Include documentation for manual steps for customers who won’t use `DeploymentTemplates`.
        + `DeploymentTemplates` (array) – Deployment templates that customers can use to set up and conﬁgure the SaaS product and any related AWS resources.
          + `Title` (string) – The display name of the deployment template.
          + `Description` (string) – A description for what the deployment template contains.
          + `IamPolicy` (string) – An IAM policy describing the permissions needed to deploy the template. Buyers can use this IAM policy to quickly deploy the template.
          + `CloudFormationDetails` (object) – The details of a CloudFormation template.
            + `TemplateUrl` (string) – The URL for the deployment template.
            + `DefaultStackName` (string) – The default name used in CloudFormation when the customer creates the template.

**Response Syntax**

```
{
"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 it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**


| Error condition | Message | HTTP code | 
| --- | --- | --- | 
| Empty Delivery Option Ids | Provided Details is not valid. String '' at /DeliveryOptions/0/Id does not match required schema regex, '^do-[a-zA-Z0-9]\$1\$1' | 422 | 
| Missing Delivery Option Ids | Provided Details is not valid. JSON at /DeliveryOptions/0 is missing required properties: ['Id']. | 422 | 
| Duplicate Delivery Option Ids | Provide unique delivery option IDs. | 422 | 
| Invalid Fulfillment Url | Provide a valid fulfillment URL beginning with "https://". | 422 | 
| Invalid Delivery Option IDs | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 422 | 
| Multiple URL Delivery Options | You provided more than one URL delivery option. Provide one URL delivery option. | 422 | 
| Missing delivery option ids | The delivery option ID is missing. Provide one or more valid delivery option IDs that you wish to update, or use AddDeliveryOptions if you intended to add a new delivery option. | 422 | 
| Invalid Launch URL | Provide a valid launch URL beginning with "https://". | 422 | 
| Missing Launch Url | Required parameter LaunchUrl is missing. You must provide a LaunchUrl. | 422 | 
| Missing deployment templates | The deployment template is missing. Provide at least one deployment template. | 422 | 
| Too many deployment templates | You cannot provide more than 20 deployment templates. | 422 | 
| Invalid template URL | Quick Start URL is invalid. Provide deployment template URL that is published through AWS QuickStarts to Amazon S3. Invalid deployment templates URL: [x] | 422 | 
| Invalid deployment template stack name | The deployment template stack name is invalid. Provide a valid stack name using only alphanumeric characters and hyphens. It must start with an alphabetical character and can't be longer than 128 characters. | 422 | 
| Duplicate deployment template title | You provided duplicate deployment template titles. Provide unique deployment template titles. | 422 | 
| Duplicate deployment template URL | You provided duplicate deployment template urls. Provide unique deployment template urls. | 422 | 
| Invalid deployment template type | The deployment template type is invalid. Provide a valid deployment template type. Supported values are ["CloudFormation@1.0"]. | 422 | 
| Invalid deployment template IAM policy | The deployment template IAM policy is invalid. Provide a valid IAM policy. | 422 | 
| Invalid usage instructions |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-saas-products.html)  | 422 | 

**Asynchronous Errors**


| Error code  | Error message | 
| --- | --- | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| AUDIT\$1ERROR | AWS MP Catalog Audits List - CQ team | 
| INVALID\$1FULFILLMENT\$1URL | The URL you provided returned HTTP status code [x]. Provide a fulfillment URL that renders with a 200. | 
| INVALID\$1LAUNCH\$1URL | The URL you provided returned HTTP status code [x]. Provide a launch URL that renders with a 200. | 
| INVALID\$1TEMPLATE\$1URL  | Quick Start URL is invalid. Provide deployment template URL that is published through AWS QuickStarts to Amazon S3. Invalid deployment templates URL: [x] | 

### Update delivery option visibility
<a name="update-delivery-options-visibility"></a>

You can use the Catalog API to configure permissions so that only some users can change the visibility for a SaaS product in AWS Marketplace. 

To do so, call the `StartChangeSet` API operation with the `UpdateDeliveryOptionsVisibility` change type, as shown in the following example. 

**Note**  
This is only supported for one delivery option: `SaaSUrlDeliveryOptionDetails`. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDeliveryOptionsVisibility",
      "Entity":
      {
        "Identifier": "prod-example12345",
        "Type": "SaaSProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptions":
        [
          {
            "Id": "do-1234567891234567891234",
            "TargetVisibility": "Public"
          },
          {
            "Id": "do-43210987654321",
            "TargetVisibility": "Limited",
            "Targeting":
            {
              "PositiveTargeting":
              {
                "BuyerAccounts":
                [
                  "123456789012"
                ]
              }
            }
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateDeliveryOptionsVisibility` change type:
+ `Entity` (object) (required) – Your SaaS-based product. 
  + `Identifier` (string) (required) – Your product ID. For more information, see [Identifier](catalog-apis.md#identifier).
  + `Type` (string) (required) – The `Type` is based on the delivery method (product type) that your product will be using: `SaaSProduct@1.0`. 
+ `DetailsDocument` (object) (required) – Details of the request.
  + `DeliveryOptions` (array) – List of `DeliveryOptions` to be updated.
    + `TargetVisibility` (string) – The delivery option id to be updated.
    + `TargetVisibility` (string) – The intended new visibility of the delivery option.

      Possible values: `Limited`, `Public`, and `Unavailable`.
**Note**  
There is always exactly one `Public` delivery option, and a maximum of one `Limited` delivery option.
    + `Targeting` (object) *optional * – Targeting of the delivery option, used in conjunction with the `Limited` visibility status to be able to test the new delivery option before changing the visibility to `Public`.
      + `PositiveTargeting` (object) – Specifying inclusive targeting.
        + `BuyerAccounts` (array of strings) – The list of buyer AWS account ids who will be able to use the new delivery option. 

          Min size: 0. Max size: 100.

**Response Syntax**

```
{
"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 anywhere from a few minutes to a few hours. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**


| Error condition | Message | HTTP code | 
| --- | --- | --- | 
| Missing delivery option ids | The delivery option ID is missing. Provide one or more valid delivery option IDs that you wish to update, or use AddDeliveryOptions if you intended to add a new delivery option. | 422 | 
| Invalid visibility | You provided invalid option for TargetVisibility. Allowed options are: Limited, Public, Unavailable. | 422 | 
| Invalid targeting | You provided invalid option for PositiveTargeting. You must provide a valid parameter for BuyerAccounts. | 422 | 
| Missing Visibility and Targeting | You provided invalid delivery option visibility details. You must provide a valid parameter for at least one of TargetVisibility or Targeting. | 422 | 
| Too many AWS account ids | You cannot provide more than 100 targeted buyer accounts. | 422 | 

**Asynchronous Errors**


| Error code  | Error message | 
| --- | --- | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | You provided invalid delivery option details. Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| INVALID\$1VISIBILITY | You provided more than one delivery option for the public state. Provide only one public delivery option. | 
| INVALID\$1VISIBILITY | You didn't provide a public delivery option. Provide one public delivery option. | 
| AUDIT\$1ERROR | Varies based on MCO manual review. | 

# Work with machine learning products using AWS Marketplace APIs
<a name="work-with-ml-products"></a>

 You can use the AWS Marketplace Catalog API to automate tasks for managing machine learning (ML)-based products. This section covers key operations for ML products using the Catalog API.

For information about creating machine learning products using the Catalog API, refer to [ Listing your product in AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-publishing-your-product-in-aws-marketplace.html) in the *AWS Marketplace Seller Guide*.

**Topics**
+ [Prerequisites for publishing ML product listings](cat-ml-prereqs.md)
+ [Add a new version](ml-add-version.md)
+ [Update version information](ml-update-version.md)
+ [Update pricing terms](update-pricing-terms.md)
+ [Restrict a version](ml-restrict-version.md)

# Prerequisites for publishing ML product listings
<a name="cat-ml-prereqs"></a>

Ensure that you have the following before getting started with publishing your machine learning product listing:
+ Registration as a seller in AWS Marketplace. For more information, refer to [Register as an AWS Marketplace seller](https://docs.aws.amazon.com/marketplace/latest/userguide/seller-registration-process.html).
+ An IAM user with `AWSMarketplaceSellerFullAccess` permission.
+ A publicly accessible Amazon Simple Storage Service (Amazon S3) bucket to host your company logo and EULA, if you provide one. You enter the URL for the S3 bucket in your `ChangeSet` JSON file.
+ A valid SageMaker AI ARN of the model package or algorithm resource you want to list.
+ A valid IAM role that has a trust relationship with the AWS Marketplace service principal and provides access to your package. For more information about the role, refer to *IAM role for the AWS Marketplace service principal* in the [Prerequisites](https://docs.aws.amazon.com/marketplace/latest/userguide/ml-publishing-prereq.html) page for machine learning products.

# Add a new version
<a name="ml-add-version"></a>

You can use the Catalog API or the AWS Marketplace Management Portal to add a new version to a machine learning product. For more information about using the portal, refer to [Adding a new version](https://docs.aws.amazon.com/marketplace/latest/userguide/machine-learning-products.html) in the *AWS Marketplace Seller Guide*. 

**Note**  
For ML products, a version consists of a single delivery option, which represents the product you're making available. In the Catalog API, working with delivery options for ML products effectively modifies versions of your product.   
When adding new instance types, include an `UpdatePricingTerms` change type in your change set to specify pricing for new instance types. For new products, `UpdatePricingTerms` must cover all supported instance types. `UpdatePricingDimensions` is not required or supported for ML products, because dimensions are automatically generated for all supported instance types. For more information, refer to [Update pricing dimensions](work-with-seller-products.md#update-dimensions).

**Using `StartChangeSet` to add a version**

 To add a new version, call the `StartChangeSet` operation with the `AddDeliveryOptions` change type: 

1.  To validate your API call without creating a version, set `Intent` to `VALIDATE`. 

1.  For actual version creation, set `Intent` to `APPLY`. 

## Request syntax
<a name="request-syntax"></a>

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json
{
    "Catalog": "AWSMarketplace",
    "ChangeSet": [{
        "ChangeType": "AddDeliveryOptions",
        "Entity": {
            "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
            "Type": "MachineLearningProduct@1.0"
        },
        "DetailsDocument": {
            "Version": {
                "VersionTitle": "version 1.1",
                "ReleaseNotes": "Patch update for small bugfix in version 1.0"
            },
            "DeliveryOptions": [{
                "Details": {
                    "SageMakerAlgorithmDeliveryOptionDetails": {
                       "SageMakerAlgorithmArn": "arn:aws:sagemaker:us-east-2:605142612156:algorithm/scikit-decision-trees-1552343220",
                       "AccessRoleArn": "arn:aws:iam::12345678901:role/AwsMarketplaceSageMakerIngestion",
                        "UsageInstructions":"This is how you use your algorithm", 
                       "SampleNotebookUrl": "https://www.amazon.com",
                        "RepositoryUrl": "https://www,amazon.com",
                        "InputProperties": {
                            "Description": "Input should have all columns in the train/test file except for 'is_fraud' column.",
                            "Limitations": "Can predict on 1 input in the CSV only at a time",
                           "SampleInput": {
                                "RealtimeInferenceText": "{\"prompt\":\"Write summary\",
                                                            \"maxTokens\": 1 }",
                                "BatchTransformUrl": "https://www.sampleData.com",
                            },
                           "Parameters": [{
                                    "Name": "prompt",
                                    "Description": "Represents the instruct-style prompt for the model. DataType is String",
                                    "Constraints": "Minimum length should be 1",
                                    "Required": true
                                },
                                {
                                    "Name": "maxTokens",
                                    "Description": "Denotes the number of tokens to predict per generation. See BPE Tokens for more details.",
                                    "Constraints": "Minvalue: 1, MaxValue: 30"
                                }
                            ],
                            "SageMakerCustomAttributes": [{
                                    "Name": "threshold",
                                    "Description": "Threshold of the confidence score of the detected object",
                                    "Constraints": "Should be an Integer"
                            }]
                    },
                    "OutputProperties": {
                        "Description": "The output is a JSON object that has the generated text along with likelihoods of tokens, if requested. See example json.",
                       "SampleOutput": {
                            "RealtimeInferenceUrl": "https://www.sampledata.com",
                            "BatchTransformUrl": "https://www.sampleData.com",
                        },
                       "Parameters": [{
                                "Name": "id",
                                "Description": "An identifier for response"
                                "AlwaysReturned": true
                            },
                            {
                                "Name": "generations",
                                "Description": "The generated text along with the likelihoods for tokens requested.",
                            }
                        ],
                    },
                   "RecommendedInstanceTypes": {
                        "BatchTransform": "ml.m4.large",
                        "RealtimeInference": "ml.m4.large",
                        "Training": "ml.m4.large"
                   }
                }
            }]
        }
    }],
    "Intent": "APPLY"
}
```

## Required fields
<a name="add-version-required-fields"></a>
+  `Entity` (object)—required 

  Contains information about your ML product.
  +  `Identifier` (string)—required 

    Your product ID. For more information, see [Identifier](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#identifier).
  +  `Type` (string)—required 

    Specifies the delivery method (product type). It must be `MachineLearningProduct@1.0`.
+ `DetailsDocument` (object)—required

  Contains all details about the new version of your product.
  + `Version` (object)—required

    Details about the version being added.
    + `VersionTitle` (string)—required

      The title of the version, such as "Version 1.1" or "1.1". Buyers select versions from these titles.
    + `ReleaseNotes` (string)—required

      Detailed notes about this version. Must be under 30,000 characters.
  + `DeliveryOptions` (array)—required

    Array of delivery methods for your product version. Limited to one delivery option per version.
    + `Details` (object)—required
      + `SagemakerModelPackageDeliveryOptionDetails` or `SageMakerAlgorithmDeliveryOptionDetails` (object)
        + `SageMakerModelPackageArn` or `SageMakerAlgorithmArn` (string)—required

          Amazon Resource Name (ARN) of your model package or algorithm.
        + `AccessRoleArn` (string)—required 

          IAM role ARN for AWS Marketplace to access the SageMaker resource.
        + `SampleNotebookUrl` (string)—required 

          Link to sample Jupyter notebook with usage code. For more information, refer to a [sample notebook template](https://github.com/aws/amazon-sagemaker-examples/blob/master/aws_marketplace/curating_aws_marketplace_listing_and_sample_notebook/ModelPackage/Sample_Notebook_Template/title_of_your_product-Model.ipynb) on GitHub.
        + `RepositoryUrl` (string)—required 

          Git repository URL for notebook and sample data access. For more information, see a [sample Git repository](https://github.com/aws/amazon-sagemaker-examples/tree/master/aws_marketplace/curating_aws_marketplace_listing_and_sample_notebook/ModelPackage/Sample_Notebook_Template) on GitHub. 
        + `UsageInstructions` (string)—required 

          Training information for algorithms or usage details for models.
        + `InputProperties` (object)—required
          + `Description` (string)—required 

            Description of model/algorithm inputs
          + `Limitations` (string) 

            Input limitations
          + `SampleInput` (object)—required

            RealtimeInferenceUrl (string) \$1 RealtimeInferenceText (string) \$1 BatchTransformUrl (string) \$1 BatchTransformText (string)
          + `Parameters` (Array<Object>)

            Name (string)—required \$1 Description (string)—Required \$1 Constraints (string) \$1 Required (boolean)
          + `SageMakerCustomAttributes` (Array<Object>)

            Describes any [CustomAttributes](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html#API_runtime_InvokeEndpoint_RequestParameters) supported by your model.

            `Name` (string)—required \$1 `Description` (string)—Required \$1 `Constraints` (string) \$1 `Required` (boolean)
        + `OutputProperties` (object)—required
          + `Description` (string)—required
          + `SampleOutput` (Array<Object>)—required

            RealtimeInferenceUrl (string) \$1 RealtimeInferenceText (string) \$1 BatchTransformUrl (string) \$1 BatchTransformText (string)
          + `Parameters` (Array)

            Name (string)—required \$1 Description (string)—required \$1 AlwaysReturned (boolean)
        + `RecommendedInstanceTypes` (object)—required
          + `BatchTransform` (string)—Required
          + `RealtimeInference` (string)—Required
          + `Training` (string)—Required for SageMaker Algorithms only

## Response syntax
<a name="response-syntax"></a>

When you submit the request, a change set is created and the API returns:

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

**Change set processing**  
The change request enters a processing queue, where it undergoes several steps:

1. Validation: The system checks to ensure all information meets AWS Marketplace guidelines.
   +  Processing time: Few minutes to several hours 
   +  For validation errors, see [Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html#seller-product-change-set-errors). 

1.  Status monitoring: You can check the status of the request two ways. 
   + Via AWS Marketplace Management Portal
   + Using the `DescribeChangeSet` operation

1.  Completion: When approved, the new version is added. 

## Errors
<a name="errors"></a>

**Asynchronous errors**  
 The following errors are specific to `AddDeliveryOptions` actions in the AWS Marketplace Catalog API. These errors appear when you call `DescribeChangeSet` while a change set is being processed. For more information about using `DescribeChangeSet` to check the status of a change request, see [Working with change sets](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/welcome.html#working-with-change-sets). 




| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1PRODUCT\$1STATUS | We couldn't locate the provided product. Provide a valid product. | 
| DUPLICATE\$1VERSION\$1TITLE | The provided version title is already in use. Create a unique version title. | 
| INVALID\$1RECOMMENDED\$1INSTANCE\$1TYPE | You didn't provide a valid instance type for [x]. Enter a valid instance type and try again. Valid types are: [valids] | 
| INCOMPATIBLE\$1DELIVERY\$1OPTIONS | The delivery option you provided doesn't match your previous selection: [previous selection]. Update your delivery option and try again. | 
| INVALID\$1ASSET\$1ARN | You didn't provide a valid ARN for SageMakerAlgorithmDeliveryOption. Enter a valid ARN and try again. | 
| DUPLICATE\$1ASSET | You didn't provide a unique ARN for this product. Enter a unique ARN and try again. | 
| ASSET\$1NOT\$1FOUND | We couldn't locate the ARN you provided. Verify that the ARN is correct and has the required permissions. | 
| ASSET\$1VALIDATION\$1EXCEPTION | Unable to ingest SagemakerModelArn/SagemakerAlgorithmArn [x] into AWS Sagemaker account | 
| INVALID\$1ACCESS\$1ROLE | We couldn't locate the IAM role ARN you provided. Verify that the ARN is correct and try again. | 
| UPDATE\$1PRICING\$1REQUIRED | UpdatePricingTerms is required. | 

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

 You can use the Catalog API to update details of an existing version of your machine learning product in AWS Marketplace. 

**Important**  
 You cannot update the ARN for a version. If you need to modify the ARN, you must create a new version instead. 

**Using `StartChangeSet` to add a version:**
+  To update version information, call the `StartChangeSet` operation with the `UpdateDeliveryOptions` change type. 

## Request syntax
<a name="ml-update-version-request-syntax"></a>

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
        "Type": "MachineLearningProduct@1.0"
      },
      "DetailsDocument":
      {
        "Version":
        {
          "ReleaseNotes": "Adding support for new parameters"
        },
        "DeliveryOptions":
        [
          {
            "Id": "example1-2222-cccc-2222-cccccccccccc",
            "Details":
            {
              "SagemakerModelPackageDeliveryOptionDetails":
              {
                "SampleNotebookUrl": "https://www.amazon.com",
                "RepositoryUrl":"https://www,amazon.com",
                "InputProperties": 
                { 
                    "SampleInput": {
                        "RealtimeInferenceUrl": "https://www.sampleData.com",
                        "BatchTranformUrl": "https://www.sampleData.com",
                     },
                 },
                 "RecommendedInstanceTypes": {
                        "BatchTransform": "ml.m4.large",
                        "RealtimeInference": "ml.m4.large"
                  }
            }
          }
        ]
      }
    }
  ]
}
```

## Required fields
<a name="ml-update-version-required-fields"></a>
+  `Entity` (object)—required 

  Contains information about your ML product.
  +  `Identifier` (string)—required 

    Your product ID. For more information, see [Identifier](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#identifier).
  +  `Type` (string)—required 

    Specifies the delivery method (product type). It must be `MachineLearningProduct@1.0`.
+  `DetailsDocument` (object)—required 

   Contains the updated version information. 
  + `Version` (object)—required

    Defines version-specific information.
    + `VersionTitle` (string)—required

      The version identifier displayed to buyers, such as "Version 1.1" or "1.1". Buyers use this title to select versions for deployment.
    + `ReleaseNotes` (string)—required 

      Detailed notes about this version, limited to 30,000 characters.
  + `DeliveryOptions` (array)—required 

    Specifies delivery methods for your product version. Limited to one delivery option per version.
    + `Id` (string)—required 

      Unique identifier for the DeliveryOption. Retrieve this using the DescribeEntity action on your product.
    + `Details` (object)—required 

      Contains the delivery option specifications.
      + `SageMakerModelPackageSubscriptionDetails` or `SageMakerAlgorithmSubscriptionDetails` (object)—required 

        Details of the delivery option.
        + `SampleNotebookUrl` (string)—required 

          Sample Jupyter notebook link providing code for buyer usage.
        + `RepositoryUrl` (string)—required 

          Git repository URL for cloning notebook and sample data.
        + `UsageInstructions` (string)—required 

          For algorithms: training information. For models: additional usage information.
        + `InputProperties` (object)—required 

          Details of the model/algorithm's input requirements.
          + `Description` (string)—required 

            Description of required inputs.
          + `Limitations` (string) 

            Any input limitations.
          + `SampleInput` (object)—required 

            Sample input data for different operations.
            + `RealtimeInferenceUrl` (string) 

              Sample input URL for realtime inference.
            + `RealtimeInferenceText` (string) 

              Sample input text for realtime inference.
            + `BatchTransformUrl` (string) 

              Sample input URL for batch transform jobs.
            + `BatchTransformText` (string) 

              Sample input text for batch transform jobs.
          + `Parameters` (Array<Object>) 

            Details for each input parameter.
            + `Name` (string)—required 

              Name of the input parameter.
            + `Description` (string)—required 

              Description of the input parameter.
            + `Constraints` (string) 

              Parameter constraints (MinValue, MaxValue, AllowedValues, MinLength, MaxLength, Pattern, etc.).
            + `Required` (boolean) 

              Indicates if the parameter is required. Default is false.
          + `SageMakerCustomAttributes` (Array<Object>) 

            Details for supported CustomAttributes.
            + `Name` (string)—required 

              Name of the custom attribute.
            + `Description` (string)—required 

              Description of the custom attribute.
            + `Constraints` (string) 

              Attribute constraints (MinValue, MaxValue, AllowedValues, MinLength, MaxLength, Pattern, etc.).
            + `Required` (boolean) 

              Indicates if the attribute is required. Default is false.
        + `OutputProperties` (object)—required 

          Details of the model/algorithm's output.
          + `Description` (string)—required 

            Description of model/algorithm outputs.
          + `SampleOutput` (Array<Object>)—required 

            Sample output data for different operations.
            + `RealtimeInferenceUrl` (string) 

              Sample output URL for realtime inference.
            + `RealtimeInferenceText` (string) 

              Sample output text for realtime inference.
            + `BatchTransformUrl` (string) 

              Sample output URL for batch transform jobs.
            + `BatchTransformText` (string) 

              Sample output text for batch transform jobs.
          + `Parameters` (Array) 

            Details for each output parameter.
            + `Name` (string)—required 

              Name of the output parameter.
            + `Description` (string)—required 

              Description of the output parameter.
            + `AlwaysReturned` (boolean) 

              Indicates if the parameter is always returned. Default is false.
        + `RecommendedInstanceTypes` (object)—required 

          Recommended instance types for optimal performance.
          + `BatchTransform` (string)—required 

            Recommended instance type for batch transform operations.
          + `RealtimeInference` (string)—required 

            Recommended instance type for realtime inference operations.
          + `Training` (string)—required 

            Recommended instance type for algorithm training operations. Required only for SageMaker Algorithms.

## Response syntax
<a name="ml-update-version-response-syntax"></a>

A successful request returns:

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

**Change set processing**  
The change request enters a processing queue, where it undergoes several steps:

1. Validation: The system checks if all information meets AWS Marketplace guidelines.
   +  Processing time: Few minutes to several hours 
   +  For validation errors, see [Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html#seller-product-change-set-errors). 

1.  Status monitoring: You can check the status of the request two ways. 
   + Via AWS Marketplace Management Portal
   + Using the `DescribeChangeSet` operation

1.  Completion: When approved, the new version is updated. 

## Errors
<a name="ml-update-version-errors"></a>

**Asynchronous errors**  
Specific errors for `UpdateDeliveryOptions` actions can be retrieved using the `DescribeChangeSet` operation after the change set begins processing. For error details and troubleshooting, see [ Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets). 


| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1PRODUCT\$1STATUS | Use an existing limited or public product. | 
| INVALID\$1DELIVERY\$1OPTION\$1ID | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| INCOMPATIBLE\$1DELIVERY\$1OPTION\$1STATUS | The delivery option cannot be updated because it's in restricted status. Try adding a new version instead. | 
| INCOMPATIBLE\$1DELIVERY\$1OPTIONS | Product previously used [X ] as delivery option, therefore all the upcoming delivery options should be of type [X] | 
| INVALID\$1RECOMMENDED\$1INSTANCE\$1TYPE | Provide an existing, available instance type for [X] (X can be Batch Transform, Realtime Inference or ALgorithm Training) | 
| DUPLICATE\$1VERSION\$1TITLE | The version title must be different from any other version titles of this product. | 
| FIELD\$1NOT\$1ALLOWED\$1TO\$1CHANGE | Field X is not allowed to be changed. | 

# Update pricing terms
<a name="update-pricing-terms"></a>

You can use the Catalog API to update the pricing of your machine learning products in AWS Marketplace.

**Note**  
You must price all supported instance types of your machine learning products. When creating your first version, the `UpdatePricingTerms` and `AddDeliveryOptions` change types with prices for all supported instances types in order to publish your product. When adding a new version to an existing product with new instance types that were not supported before, you must include those instance types in the `UpdatePricingTerms` and `AddDeliveryOptions` change types.

To update pricing terms, call the `StartChangeSet` operation with the `UpdatePricingTerms` change type.

## Request syntax
<a name="request-syntax"></a>

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json
{
    "Catalog": "AWSMarketplace",
    "ChangeSet": [
        {
            "ChangeType": "UpdatePricingTerms",
            "Entity": {
                "Type": "Offer@1.0",
                "Identifier": "$CreateOfferChange.Entity.Identifier"
            },
            "DetailsDocument": {
                "PricingModel": "Usage",
                "Terms": [
                    {
                        "Type": "UsageBasedPricingTerm",
                        "CurrencyCode": "USD",
                        "RateCards": [
                            {
                                "RateCard": [
                                    {
                                      "DimensionKey": "ml.m4.4xlarge.m.i.b",
                                      "Price": 0.1
                                    },
                                    {
                                      "DimensionKey": "ml.m5.4xlarge.m.i.b",
                                      "Price": 0.1
                                    },
                                    {
                                      "DimensionKey": "ml.m4.16xlarge.m.i.b",
                                      "Price": 0.1
                                    },    
                                    {
                                      "DimensionKey": "m.i.c",
                                      "Price": 0.1
                                    },
                                    {
                                      "DimensionKey": "ml.m4.4xlarge.a.t",
                                      "Price": 0.1
                                    },
                                    {
                                      "DimensionKey": "ml.m5.4xlarge.a.t",
                                      "Price": 0.1
                                    },
                                    {
                                      "DimensionKey": "ml.m4.16xlarge.a.t",
                                      "Price": 0.1
                                    }
                                ]
                            }   
                        ]
                    },
                    {
                        "Type": "FreeTrialPricingTerm",
                        "Duration": "P30D",
                        "Grants": [
                            {
                                "DimensionKey": "ml.m4.4xlarge.m.i.b"
                            },
                              {
                                "DimensionKey": "ml.m5.4xlarge.m.i.b"
                              },
                              {
                                "DimensionKey": "ml.m4.16xlarge.m.i.b"
                              },
                              {
                                "DimensionKey": "m.i.c"
                              },
                              {
                                "DimensionKey": "ml.m4.4xlarge.a.t"
                              },
                              {
                                "DimensionKey": "ml.m5.4xlarge.a.t"
                              },
                              {
                                "DimensionKey": "ml.m4.16xlarge.a.t"
                              }
                        ]
                    }
                ]
            }
        },
    ]
}
```

## Required fields
<a name="pricing-terms-required-fields"></a>
+ `Entity` (object) (required) - Contains information about the offer of your ML product.
  + `Identifier` (string) (required) – The offer id for which you would like to update pricing terms. For more information, see [Identifier](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#identifier).
  + `Type` (string) (required) – The `Type` must be `Offer@1.0` for updating pricing.
+ `DetailsDocument` (object) (required) – Details about the pricing terms of your machine learning product.
  + `PricingModel` (string) (required) - The pricing model for your product - you can choose between Usage, Free, and Contract (for private offers). For more information, see [Machine Learning Product Pricing](https://docs.aws.amazon.com/marketplace/latest/userguide/machine-learning-pricing.html).
  + `Terms` (array of objects) - An array of pricing terms that collectively define the overall pricing of your product.
    + `Type` (string) (required) - The type of pricing term. Valid options are `UsageBasedPricingTerm` or `FreeTrialPricingTerm` or `FixedUpfrontPricingTerm` (for private offers).
    + `CurrencyCode` (string) (required for `UsageBasedPricingTerm` or `FixedUpfrontPricingTerm` - the currency of the pricing term. Valid values are `USD`.
    + `RateCards` (array of objects) (required for `UsageBasedPricingTerm`) - The rate cards that define the pricing for your machine learning product. You must include one `RateCard` only within this array.
      + `RateCard` (array of objects) - The array of dimensions and rates for your machine learning product. All supported instance types must be priced in order to publish your product.
        + `DimensionKey` - The dimension you are pricing. Valid dimension keys are:
          + Instance type followed by the operation for hourly rates:
            + Instance type will start with `ml` followed by the instance name and size. For exampole, `ml.m4.xlarge`
            + Operation will be `m.i.b` for batch transform, `m.i.r` for hourly real-time inference, and `a.t` for algorithm training.
            + Examples: `ml.m4.4xlarge.m.i.b` for batch transform, `ml.m4.xlarge.m.i.r` for real-time inference, or `ml.m4.16xlarge.a.t` for algorithm training
          + `m.i.c` for real-time per inference pricing.
        + `Price` - The rate of the dimension. The rate is either hourly or per-inference, depending on the dimensionKey.
    + `Duration` (string) (required for `FreeTrialPricingTerm` or `FixedUpfrontPricingTerm` - The duration of your free trial or contract. For free trial valid values are between X and Y. For contract, valid values are between X and Y.
    + Grants (array of objects) - Details about which dimensionKeys are eligible for free trial. All supported dimensionKeys must be provided.
      + DimensionKey - The dimension to include as part of the free trial offer.
        + Instance type followed by the operation for hourly rates:
          + Instance type starts with `ml` followed by the instance name and size e.g. `ml.m4.xlarge`
          + Operation is `m.i.b` for batch transform, `m.i.r` for hourly real-time inference, or `a.t` for algorithm training.
          + Examples: `ml.m4.4xlarge.m.i.b` for batch transform, `ml.m4.xlarge.m.i.r` for real-time inference, or `ml.m4.16xlarge.a.t` for algorithm training
        + `m.i.c` for real-time per inference pricing.

## Response syntax
<a name="update-pricing-response-syntax"></a>

A successful request returns:

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

## Change set processing
<a name="update-pricing-change-set-processing"></a>

The change request enters a processing queue, where it undergoes several steps:

1. Validation: The system checks to ensure all information meets AWS Marketplace guidelines.
   + Processing time: Few minutes to several hours
   + For validation errors, see [Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html#seller-product-change-set-errors).

1. Status monitoring: You can check the status of the request two ways.
   + Via AWS Marketplace Management Portal
   + Using the `DescribeChangeSet` operation

1. Completion: When approved, the pricing terms are updated.

## Errors
<a name="update-pricing-errors"></a>

**Asynchronous errors**  
Specific errors for `UpdatePricingTerms` actions can be retrieved using the `DescribeChangeSet` operation after the change set begins processing. For error details and troubleshooting, see [ Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#working-with-change-sets).


| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1PRODUCT\$1STATUS | Use an existing limited or public product. | 

# Restrict a version
<a name="ml-restrict-version"></a>

 You can use the Catalog API to restrict a version of your machine learning product in AWS Marketplace. When restricted, new buyers cannot access that version. Existing subscribers retain access to restricted versions. AWS Marketplace guidelines require continued support for existing buyers for 90 days after restriction. 

**Important**  
 At least one unrestricted version must remain available. You cannot restrict the last publicly available version of a product. 

**To restrict a version:**
+  To restrict a version, call the `StartChangeSet` operation with the `RestrictDeliveryOptions` change type. 

## Request syntax
<a name="ml-restrict-version-request-syntax"></a>

```
POST /StartChangeSet HTTP/1.1
Content-type: application/json
{
"Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "RestrictDeliveryOptions",
      "Entity":
      {
        "Identifier": "example1-abcd-1234-5ef6-7890abcdef12@1",
        "Type": "MachineLearningProduct@1.0"
      },
      "DetailsDocument":
      {
        "DeliveryOptionIds":
        [
          "example1-2222-cccc-2222-cccccccccccc"
        ]
      }
    }
  ]
}
```

## Required fields
<a name="ml-restrict-version-required-fields"></a>

**Required fields**
+  `Entity` (object)—required 

  Contains information about your ML product.
  +  `Identifier` (string)—required 

    Your product ID. For more information, see [Identifier](https://docs.aws.amazon.com/marketplace/latest/APIReference/catalog-apis.html#identifier).
  +  `Type` (string)—required 

    Specifies the delivery method (product type). It must be `MachineLearningProduct@1.0`.
+  `DetailsDocument` (object)—required 

   Contains the updated version information. 
  + `DeliveryOptionIds` (array of objects)—required

    List of DeliveryOption IDs for the versions you want to restrict. Retrieve the unique identifier for each DeliveryOption by calling the DescribeEntity action on the version you're restricting.

## Response syntax
<a name="ml-restrict-version-response-syntax"></a>

A successful request returns:

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

1. Validation: The system checks if all information meets AWS Marketplace guidelines.
   +  Processing time: Few minutes to several hours 
   +  For validation errors, see [Change set status and errors](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-seller-products.html#seller-product-change-set-errors). 

1.  Status monitoring: You can check the status of the request two ways. 
   + Via AWS Marketplace Management Portal
   + Using the `DescribeChangeSet` operation

1.  Completion: When approved, the new version is restricted. 

## Errors
<a name="ml-restrict-version-errors"></a>

**Asynchronous errors**  
The following errors may occur during change set processing and can be retrieved using the `DescribeChangeSet` operation:


| Error code | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1PRODUCT\$1STATUS | Use an existing public or limited product | 
| MISSING\$1DELIVERY\$1OPTION\$1IDS | Provide delivery option from existing list of IDs. | 
| INVALID\$1DELIVERY\$1OPTION\$1IDS | Provide delivery option IDs that can be found in the product. IDs not found: [x] | 
| INVALID\$1DELIVERY\$1OPTION\$1STATUS | The delivery option IDs [invalid\$1ids] are invalid. Provide delivery options in the public state. | 
| ALL\$1DELIVERY\$1OPTIONS\$1RESTRICTED | Provide fewer delivery options to restrict as at least one must remain in public state. | 

# Work with offers using the AWS Marketplace APIs
<a name="work-with-offers"></a>

An offer defines the terms and rules governing the purchase and consumption of a product. It encompasses a collection of agreement terms between two parties. The accepted offer terms are then translated into an agreement, serving as proof of the transaction.

The following sections provide information on how to manage offers as a seller or channel partner.

**Topics**
+ [Work with private offers using the AWS Marketplace APIs](work-with-private-offers.md)
+ [Work with resale authorizations using the AWS Marketplace APIs](work-with-resale-authorizations.md)
+ [Work with channel partner private offers using the AWS Marketplace APIs](work-with-cppos.md)
+ [Work with renewals](work-with-renewals.md)

# Work with private offers using the AWS Marketplace APIs
<a name="work-with-private-offers"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with offers. 

While the *product* describes what is being sold in AWS Marketplace, the *offer* describes the terms and rules of how a product is purchased and consumed. AWS Marketplace products can have multiple offers sold by different sellers. Each AWS Marketplace offer, however, can only be created for one product. An *offer* contains a collection of agreement terms between two parties. The accepted offer terms are translated into an agreement as proof of a transaction.

There are two types of offers:
+ **Private offers** are for sellers and buyers to negotiate pricing. Sellers sign an end-user license agreement (EULA) for software purchases in AWS Marketplace. An offer is visible only to a specified buyer. For more information, see [Private offers](https://docs.aws.amazon.com/marketplace/latest/userguide/private-offers-overview.html) in the *AWS Marketplace Seller Guide*.
+ **Public offers** are for global purchasing programs. Sellers identify customers based on available programs and geographical locations, which makes the offer accessible only to specific customers.

See the following resources:
+ For working code examples, see [Manage offers with API](https://catalog.workshops.aws/mpseller/en-US/manage-offers-with-api) in the *AWS Marketplace seller workshop*. 
+ For API request code examples, see [Python](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/python/src/catalog_api/offers) and [Java](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/java/resources/changeSets/offers) examples in *AWS Samples* on GitHub.
+ For a video on creating private offers, see [Create a Private Offer Using the AWS Marketplace Catalog API](https://www.youtube.com/watch?v=Gg9JR0tB330) on YouTube.
+ For a video on updating AMI pricing, see [Update AMI Product Pricing Using the AWS Marketplace Catalog API](https://www.youtube.com/watch?v=AVIRlzHKEJw) on YouTube.

The following topics describe how to use the Catalog API to create and update offers:

**Topics**
+ [Create an offer](#create-offer)
+ [Create a replacement offer](#create-replacement-offer)
+ [Update offer information](#update-offer-information)
+ [Update targeting configuration](#update-targeting-offers)
+ [Update refund policy](#update-support-terms)
+ [Update legal resources](#update-legal-terms)
+ [Update pricing](#update-pricing-terms)
+ [Update the discoverability of the offer](#update-availability)
+ [Define the expiration date of agreements created using the offer](#update-validity-terms)
+ [Update payment schedule details](#update-payment-schedule-terms)
+ [Modify renewal options](#update-renewal-terms)
+ [Publish an offer](#release-offer)
+ [Describe existing offer details](#describe-entity)

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

You can use the Catalog API to create a new offer in AWS Marketplace. If your request processes successfully, the AWS Marketplace Catalog API creates a `Draft`, which is an incomplete offer that's invisible to buyers. To complete an offer, use the `Update` change type. When the offer is complete, use the [`ReleaseOffer`](#release-offer) change type to create and release it. Releasing an offer validates it and makes it visible to buyers in AWS Marketplace.

To create a new offer, call the `StartChangeSet` API operation with the `CreateOffer` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateOffer",
      "Entity": {
        "Type": "Offer@1.0"
      },
      "DetailsDocument": {
        "ProductId": "prod-ad8EXAMPLE51",
        "Name": "Test Offer",
        "OfferSetId": "offerset-b3f9EXAMPLE27"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateOffer` change type:
+ **Entity** (object) (required) – Your offer.
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **ProductId** (string) (required) – The unique identifier of the product being offered.
  + **Name** (string) (optional) – The name associated with the offer for better readability to you and your customers. It is displayed as a part of the Agreement information as well.
  + **OfferSetId** (string) (optional) – The ID of the offer set to associate this offer with. Only specify this field when creating an offer that will be part of an offer set. If OfferSetId is not provided, an individual offer will be created that can be purchased standalone. Note that specifying an OfferSetId during offer creation only indicates your intent to associate the offer with that offer set. To complete the association, you must [use the AssociateOffers change type](work-with-offer-sets.md#associate-offers) after the offer is created.

**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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

If the `Status` is `SUCCEEDED`, then a new `OfferId` is generated.

The response looks like the following.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef",
  "ChangeSetName": "Submitted by 123456789012",
  "StartTime": "2021-05-27T22:21:26Z",
  "EndTime": "2021-05-27T22:32:19Z",
  "Status": "SUCCEEDED",
  "ChangeSet": [
    {
      "ChangeType": "CreateOffer",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "ProductId": "prod-ad8EXAMPLE51",
        "Name": "Test Offer"
      },
      "ErrorDetailList": []
    }
  ]
}
```

**Synchronous Validations**

The following schema validations are specific to `CreateOffer` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| ProductId |  Required Length must be between 1 and 50 characters  Must not contain illegal characters (\$1, <, >)  | 422 | 
| ProductId | RequiredUser must be authorized to create offer for the given product | 403 | 
| ProductId | RequiredMust be an existing product in the catalog or being created in the same change set | 404 | 
| Name |  Optional Length must be between 1 and 150 characters  Must not contain illegal characters (\$1, <, >)  | 422 | 

**Asynchronous Errors**

The following errors are specific to `CreateOffer` 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\$1PRODUCT | Use an active product in Limited or Public state. | 
| INCOMPATIBLE\$1PRODUCT | Managing offers for your chosen product type isn't currently supported in the AWS Marketplace Catalog API. | 
| INCOMPATIBLE\$1PRODUCT | Managing offers for the product isn't currently supported in the AWS Marketplace Catalog API. | 
| INCOMPATIBLE\$1PRODUCT | OfferSetId isn't supported in offers for the product. | 
| INCOMPATIBLE\$1PRODUCT | CreateOffer change type can't be invoked to create an offer for the product. Use CreateOfferUsingResaleAuthorization change type. | 

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

You can use the Catalog API to create a replacement offer (also known as an agreement-based offer) in AWS Marketplace. 

If your request has been processed successfully, AWS Marketplace Catalog API will have an offer in `Draft` state generated for you, which is an incomplete offer and not visible to buyers on AWS Marketplace. You will use `Update` change types to complete the offer. After the offer is completed, you will use [`ReleaseOffer`](#release-offer) change type to complete offer creation process and release the offer, which will validate the entire offer and make your offer visible to buyers on AWS Marketplace. From there, the buyer has the option to accept the replacement offer or to continue to operate under the original agreement.

To create a replacement offer, call the `StartChangeSet` API operation with the `CreateReplacementOffer` change type and provide a pre-existing agreement id, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateReplacementOffer",
      "Entity": {
        "Type": "Offer@1.0"
      },
      "DetailsDocument": {
        "AgreementId": "agmt-12345",
        "Name": "Offer name"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateReplacementOffer` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **AgreementId** (string) (required) – The unique identifier for the current agreement to be replaced.
  + **Name** (string) (optional) – The name associated with the offer for better readability to you and your customers. It will be displayed as part of Agreement information as well.

**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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

**Synchronous Validations**

The following schema validations are specific to `CreateReplacementOffer` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP Code | 
| --- | --- | --- | 
| AgreementId | RequiredLength must be between 1 and 64 characters | 422 | 
| AgreementId | RequiredUser must be authorized to create offer for the given agreement | 403 | 
| Name | OptionalLength must be between 1 and 150 charactersMust not contain invalid characters (\$1, <, >) | 422 | 

**Asynchronous Errors**

The following errors are specific to `CreateReplacementOffer` 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\$1PRODUCT | Replacement offers aren't supported for the product. | 
| INCOMPATIBLE\$1AGREEMENT | CreateReplacementOffer change type can't be invoked to create a replacement offer for the agreement. Use CreateReplacementOfferUsingResaleAuthorization change type. | 

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

You can use the Catalog API to update the offer information in AWS Marketplace. 

To update the offer information, call the `StartChangeSet` API operation with the `UpdateInformation` change type, as shown in the following example. All other information will remain unchanged.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateInformation",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Name": "New offer name",
        "Description": "New offer description",
        "PreExistingAgreement": {
          "AcquisitionChannel": "External",
          "PricingModel": "Contract"
        }
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateInformation` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Name** (string) (optional) – Name associated with the offer for better readability. It is displayed as part of agreement information.
  + **Description** (string) (optional) – A free-form text that is meant to be used only by you and will never be visible to buyers.
  + **PreExistingAgreement** (object) (optional) – Determines if this offer is a renewal for an existing agreement with an existing customer for the same underlying product. The existing agreement can be within or outside AWS Marketplace. AWS may audit and verify your offer is a renewal. If AWS is unable to verify your offer, then AWS may revoke the offer and entitlements from your customer.
    + **AcquisitionChannel** (string) (required) – Indicates if the existing agreement was signed outside AWS Marketplace or within AWS Marketplace.

      Possible values: `External`, `AwsMarketplace`
    + **PricingModel** (string) (required) – Indicates which pricing model the existing agreement uses.

      Possible values: `Contract`, `Usage`, `Byol`, `Free`

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateInformation` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Properties | At least one of the following properties must be provided | 422 | 
| Name |  Optional Length must be between 1 and 150 characters  Must not contain illegal characters (\$1, <, >)  | 422 | 
| Description |  Optional Length must be between 1 and 255 characters  | 422 | 
| PreExistingAgreement | OptionalCan be null to remove `PreExistingAgreement` from offer | 422 | 
| PreExistingAgreement.PricingModel |  Required Can be one of these values: [`Byol`, `Free`, `Usage`, `Contract`]  | 422 | 
| PreExistingAgreement.AcquisitionChannel |  Required Can be one of these values: [`AwsMarketplace`, `External`]  | 422 | 

**Asynchronous Errors**

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](catalog-apis.md#working-with-change-sets).


| Error code  | Error message | 
| --- | --- | 
| INCOMPATIBLE\$1PRE\$1EXISTING\$1AGREEMENT | PreExistingAgreement can't be changed after the offer is released. | 

## Update targeting configuration
<a name="update-targeting-offers"></a>

You can use the Catalog API to update the targeting configuration of your offer in AWS Marketplace. 

All existing targeting options that aren't included in the latest request and will be removed from the offer.

**Note**  
An offer can optionally include `PositiveTargeting` or `NegativeTargeting`, but not both.  
**Positive Targeting options:**  
**Country codes only** – Creates a public offer available to buyers in the specified countries.
**Buyer accounts only** – Creates a private offer targeted to specific AWS accounts.
**Both country codes and buyer accounts** – Creates a private offer where targeted accounts can only accept the offer if they are located in one of the specified countries.
**Negative Targeting options:**  
**Country codes** – Excludes buyers from the specified countries. This creates a public offer available to all countries except those listed.

To update the targeting configuration of your offer, call the `StartChangeSet` API operation with the `UpdateTargeting` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateTargeting",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "PositiveTargeting": {
          "CountryCodes": [
            "US",
            "CA"
          ],
          "BuyerAccounts": [
            "111122223333"
          ]
        },
        "NegativeTargeting": {
          "CountryCodes": [
            "XX"
          ]
        }
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateTargeting` change type:
+ **Entity** (object) (required) – Your offer.
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **PositiveTargeting** (object) (optional) – Positive targeting defines the criteria which any buyer's profile should fulfill in order to be allowed to access the offer. This field is optional, but at least one targeting option should be provided when this field is present.
    + **CountryCodes** (array of strings) (optional) – List as option for allowing targeting based on country. If the intention isn’t to target the offer to a country, this field should be omitted. If it’s present, the list must contain at least one country code. Each element in this list should be a valid 2-letter country code, using this format: ISO 3166-1 alpha-2.
    + **BuyerAccounts** (array of strings) (optional) – List as an option to allow targeting based on AWS accounts (also known as Private Offer). If the intention is to not target the offer to an AWS account, this field should be omitted.
  + **NegativeTargeting** (object) (optional) – Negative targeting defines the criteria which any customer's profile should fulfill to be restricted to access the offer. Although this field is optional, at least one targeting option should be provided when this field is present.
    + **CountryCodes** (array of strings) (required) – List as option for allowing targeting based on country. If the intention isn’t to target the offer to a specific country, then this field should be omitted. If it’s present, the list must contain at least one country code. Each element in this list should be a valid 2-letter country code using this format: ISO 3166-1 alpha-2.

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateTargeting` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| NegativeTargeting |  Optional Can have either one of the following: [`CountryCodes`]  | 422 | 
| NegativeTargeting.CountryCodes |  Optional List size must be between 1 and 244 Country codes must be valid (ISO 3166-1 alpha-2)  | 422 | 
|  PositiveTargeting |  Optional Can have either one of the following: [`CountryCodes`, `BuyerAccounts`]  | 422 | 
| PositiveTargeting.BuyerAccounts |  Optional List size must be between 1 and 26 AWS account IDs must be in valid format (12-digit number)  | 422 | 
| PositiveTargeting.CountryCodes |  Optional List size must be between 1 and 244 Country codes must be valid (ISO 3166-1 alpha-2)  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateTargeting` 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\$1BUYER\$1ACCOUNTS | Provide valid buyer accounts. Invalid accounts: [x]. | 
| INVALID\$1COUNTRY\$1CODES | Provide supported country codes. | 
| INVALID\$1TARGETING | Use either negative or positive targeting on the same attribute. | 
| INCOMPATIBLE\$1PRODUCT | Country-based targeting isn't supported for the product. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide BuyerAccounts that are compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1TARGETING | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TARGETING | The requested change can't be performed after the offer is expired. | 
| INCOMPATIBLE\$1TARGETING | Targeting can't be updated on a replacement offer. If the buyer isn't associated with the provided AgreementId, then create a new private offer by providing an AgreementId associated with the buyer. | 
| TOO\$1MANY\$1BUYER\$1ACCOUNTS | Provide BuyerAccounts within the allowed limits. | 
| INCOMPATIBLE\$1TARGETING | BuyerAccounts can't be removed after the offer is released. | 
| INCOMPATIBLE\$1TARGETING | BuyerAccounts can't be added after the offer is released. | 
| MISSING\$1COUNTRY\$1CODES | Provide PositiveTargeting with CountryCodes: [x]. | 
| INCOMPATIBLE\$1COUNTRY\$1CODES | Provide CountryCodes that are compatible. | 
| INCOMPATIBLE\$1BUYER\$1ACCOUNTS | Provide BuyerAccounts that are compatible with the agreement. | 

## Update refund policy
<a name="update-support-terms"></a>

You can use the Catalog API to update the refund policy of your offer in AWS Marketplace. 

This change doesn’t affect existing agreements. The support terms that aren't included in the latest request will be removed from the offer.

To update the refund policy, call the `StartChangeSet` API operation with the `UpdateSupportTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateSupportTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "SupportTerm",
            "RefundPolicy": "Updated refund policy description"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateSupportTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) (required) – List of support terms that you would like to update. Accepted support terms are:
    + **SupportTerm** (object) (required) – Defines the customer support available for the acceptors when they purchase the software.
      + **Type** (string) (required) – Type of the term being updated. This is the object value: `"SupportTerm"`.
      + **RefundPolicy** (string) (required) – Free-text field about the refund policy description that will be shown to customers as is on the website and console.

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateSupportTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required  | 422 | 
| Terms[].RefundPolicy |  Required Length must be between 1 and 500 Cannot lead or end with spaces  | 422 | 
| Terms[].Type | RequiredCan only be `SupportTerm` | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateSupportTerms` 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\$1PRODUCT | SupportTerm isn't supported in private offers for the product. | 
| INCOMPATIBLE\$1TERMS | SupportTerm isn't supported for free trial offers. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 

## Update legal resources
<a name="update-legal-terms"></a>

You can use the Catalog API to replace the existing legal documents, such as an end user license agreement (EULA). The legal terms that aren't included in the latest request will be removed from the offer. 

To update legal resources of your offer, call the `StartChangeSet` API operation with the `UpdateLegalTerms` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateLegalTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "LegalTerm",
            "Documents": [
              {
                "Type": "CustomEula",
                "Url": "https://s3.amazonaws.com/EULA/custom-eula-1234.txt"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateLegalTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **LegalTerm** (object) (required) – Defines the list of text agreements to be proposed to the acceptors. One example of such an agreement is the end user license agreement (EULA).
    + **Type** (string) (required) – Type of the term being updated. This is the object value: `"LegalTerm"`.
    + **Documents** (array of structures) (required) – List of references to legal resources to be proposed to the buyers. One example of such a resource is the end user license agreement (EULA). Each reference is made up of a `Type` and a `URL`:
      + **Type** (string) (required) – Type of document. Available document types are:
        + **CustomEula** – A custom EULA provided by you as seller. Either a public S3 URL or a [presigned URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) is required for this document type.
        + **StandardEula** – Standard Contract For AWS Marketplace (SCMP). For more information about SCMP, see the AWS Marketplace Seller Guide. You don’t provide a URL for this type because it is managed by AWS Marketplace.
      + **Url** (string) (conditionally required) – A URL to the legal document for buyers to read. Required when `Type` is one of the following [`CustomEula`].
      + **Version** (string) (conditionally required) – Version of standard contracts provided by AWS Marketplace. Required when `Type` is [`StandardEula`]. Available version:
        + **2022-07-14** – This version of the Standard Contract for AWS Marketplace is available from this Amazon S3 bucket: [https://s3.amazonaws.com/aws-mp-standard-contracts/Standard-Contact-for-AWS-Marketplace-2022-07-14.pdf](https://s3.amazonaws.com/aws-mp-standard-contracts/Standard-Contact-for-AWS-Marketplace-2022-07-14.pdf)

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateLegalTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required Only `LegalTerm` is allowed in the list List size must be 1  | 422 | 
| Terms[].Type | RequiredCan only be `LegalTerm` | 422 | 
| Terms[].LegalTerm.Documents |  Required  | 422 | 
| Terms[].LegalTerm.Documents[].Type |  Required Allowed values: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-private-offers.html)  | 422 | 
| Terms[].LegalTerm.Documents[].Url | Required and must be a valid URL when Type is CustomEula | 422 | 
| Terms[].LegalTerm.Documents[].Version | Required and must be a valid Version when Type is StandardEulaValid `StandardEula` versions: ["2019-04-24", "2022-07-14"] | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateLegalTerms` 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\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide URLs for legal documents stored in accessible S3 buckets. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Only the most recent version of StandardEula is supported for new offers. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide legal documents in the supported file formats. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide legal documents using the supported document types. | 
| LIMIT\$1EXCEEDED\$1LEGAL\$1DOCUMENT\$1SIZE | Provide legal documents within the allowed size limits. | 
| INVALID\$1LEGAL\$1DOCUMENTS | LegalTerm contains password-protected document(s). Provide accessible documents in LegalTerm. | 
| INVALID\$1LEGAL\$1DOCUMENTS | LegalTerm contains invalid PDF document(s). Provide accessible documents in LegalTerm. | 

## Update pricing
<a name="update-pricing-terms"></a>

You can use the Catalog API to replace the existing pricing terms completely. The pricing terms that aren't included in the latest request will be removed from the offer. 

To update pricing terms for your offer, call the `StartChangeSet` API operation with the `UpdatePricingTerms` change type, as shown in the following example.

**Note**  
The following request syntax combines multiple examples. This combination doesn't work as a valid payload. For example, a `Terms` array can't include both the term type `FixedUpfrontPricingTerm` and the term type `ConfigurableUpfrontPricingTerm`. For examples of how different term types are combined for different pricing use cases, see [Manage offers with API](https://catalog.workshops.aws/mpseller/en-US/manage-offers-with-api) in the *AWS Marketplace seller workshop*.

**Note**  
For SaaS products with Free pricing model, you must include either `UsageBasedPricingTerm` or `ConfigurableUpfrontPricingTerm` with at least one RateCard (dimension) where all prices are set to \$10.00. This requirement is unique to SaaS products.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdatePricingTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "PricingModel": "Usage",
        "Terms": [
          {
            "Type": "UsageBasedPricingTerm",
            "CurrencyCode": "USD",
            "RateCards": [
              {
                "RateCard": [
                  {
                    "DimensionKey": "m3.large",
                    "Price": "0.10"
                  },
                  {
                    "DimensionKey": "m4.xlarge",
                    "Price": "0.20"
                  }
                ]
              }
            ]
          },
          {
            "Type": "ConfigurableUpfrontPricingTerm",
            "CurrencyCode": "USD",
            "RateCards": [
              {
                "Selector": {
                  "Type": "Duration",
                  "Value": "P365D"
                },
                "RateCard": [
                  {
                    "DimensionKey": "m3.large",
                    "Price": "300"
                  },
                  {
                    "DimensionKey": "m4.xlarge",
                    "Price": "400"
                  }
                ],
                "Constraints": {
                  "MultipleDimensionSelection": "Allowed",
                  "QuantityConfiguration": "Allowed"
                }
              }
            ]
          },
          {
            "Type": "ByolPricingTerm"
          },
          {
            "Type": "RecurringPaymentTerm",
            "CurrencyCode": "USD",
            "BillingPeriod": "Monthly",
            "Price": "100.0"
          },
          {
            "Type": "FixedUpfrontPricingTerm",
            "CurrencyCode": "USD",
            "Price": "200.00",
            "Grants": [
              {
                "DimensionKey": "Users",
                "MaxQuantity": 10
              }
            ]
          },
          {
            "Type": "FreeTrialPricingTerm",
            "Duration": "P30D",
            "Grants": [
              {
                "DimensionKey": "m3.xlarge",
                "MaxQuantity": 10
              },
              {
                "DimensionKey": "m4.xlarge",
                "MaxQuantity": 10
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePricingTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **PricingModel** (string) (required) – Pricing model for your offer. Possible values for pricing model are:
    + **Usage** – Usage-based pricing model where buyers will be billed for their usage of your product.
    + **Contract** – Contract-based pricing model where buyers are either billed in advance for the use of your product, or offered a flexible payment schedule. Buyers can also pay for an additional usage above their contract.
    + **Free** – Free pricing model where buyers will not be charged for usage of product. When using this pricing model no pricing terms or payment schedule term can have non-zero rates.
    + **Byol** – Byol pricing model where buyers will bring their own license for usage of the product.
  + **Terms** (array of structures) (required) – List of pricing terms that you want to update. Supported pricing terms are:
    + **FreeTrialPricingTerm** (object) – Defines a short-term free pricing model where the buyers are not charged anything within a specified limit.
      + **Type** (string) – Type of the term being updated. This is the object value: `"FreeTrialPricingTerm"`.
      + **Duration** (string) – Duration of the free trial period.
      + **Grants** (array of structures) – Entitlements that will be granted to the acceptor of a free trial as part of an agreement execution.
        + **DimensionKey** (string) – Unique dimension key defined in the product document. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
        + **MaxQuantity** (integer) (optional) – Maximum amount of capacity that the buyer can be entitled to the given dimension of the product. If `MaxQuantity` is not provided, the buyer will be able to use an unlimited amount of the given dimension.
    + **UsageBasedPricingTerm** (object) – Defines a pay-as-you-go (PAYG) pricing model where the customers are charged based on product usage.
      + **Type** (string) (required) – Category of the term being updated. This is the object value: `UsageBasedPricingTerm`.
      + **CurrencyCode** (string) – Defines the currency for prices mentioned in this term. Currently, only USD is supported.
      + **RateCards** (array of structures) – List of rate cards.
        + **RateCard** (array of structures) – A rate card defines the per-unit rates for the product dimensions.
          + **DimensionKey** (string) –Dimension that the given entitlement applies. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
          + **Price** (string) – Per-unit price for the product dimension that will be used for calculating the amount to be charged to the buyer.
    + **ConfigurableUpfrontPricingTerm** (object) – Defines pre-paid payment model which allows buyers to configure the entitlements that they want to purchase and the duration of the entitlements. You can update the list of rates for each contract duration and entitlements for each dimension.
      + **Type** (string) (required) – Type of the term being updated. This is the object value: `ConfigurableUpfrontPricingTerm`.
      + **CurrencyCode** (string) (required) – Defines the currency for the prices mentioned in this term. For public offers, only USD is supported. For private offers, USD, AUD, EUR, GBP, and JPY are supported.
      + **RateCards** (array of structures) (required) – List of rate cards.
        + **Selector** (object) (required) – Selector is used to differentiate between the mutually exclusive rate cards in the same pricing term, to be selected by the buyer.
          + **Type** (string) (required) – Category of Selector. At this time, only `Duration` is supported.
          + **Value** (string) (required) – Contract duration. This field supports the ISO 8601 format.
        + **RateCard** (array of structures) (required) – A rate card defines the per-unit rates for the product dimensions.
          + **DimensionKey** (string) (required) – Unique dimension key defined in the product document. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
          + **Price** (string) (required) – Per-unit price for the product dimension which will be used for calculating the amount to be charged to the buyer.
        + **Constraints** (object) (required) – Defines constraints on how the term can be configured by acceptors.
**Note**  
Currently, **MultipleDimensionSelection** and **QuantityConfiguration** values need to be same.
          + **MultipleDimensionSelection** (string) (required) – Determines if buyers are allowed to select multiple dimensions in the rate card. Possible values are `Allowed` and `Disallowed`.
          + **QuantityConfiguration** (string) (required) – Determines if acceptors are allowed to configure quantity for each dimension in rate card. Possible values are `Allowed` and `Disallowed`.
    + **ByolPricingTerm** (object) – Enables you and your customers to move your existing agreements to AWS Marketplace. The customer won't be charged for product usage in AWS Marketplace because they already paid for the product outside of AWS Marketplace.
      + **Type** (string) (required) – Type of the term being updated. This is the object value: `ByolPricingTerm`.
    + **RecurringPaymentTerm** (object) – Defines a pricing model where customers are charged a fixed recurring price at the end of each billing period.
      + **Type** (string) (required) – Type of the term being updated. This is the object value: `RecurringPaymentTerm`.
      + **BillingPeriod** (string) (required) – Defines the recurrence at which buyers are charged. Only `Monthly` is supported today.
      + **Price** (string) (required) – Amount charged to the buyer every billing period.
      + **CurrencyCode** (string) (required) – Defines the currency for the prices mentioned in this term. Currently, only `USD` is supported.
    + **FixedUpfrontPricingTerm** (object) – Defines a pre-paid pricing model where the customers are charged a fixed upfront amount.
      + **Type** (string) (required) – Type of the term being updated. This is the object value: `FixedUpfrontPricingTerm`.
      + **CurrencyCode** (string) (required) – Defines the currency for the prices mentioned in this term. For public offers, only USD is supported. For private offers, USD, AUD, EUR, GBP, and JPY are supported.
      + **Price** (string) (required) – Fixed amount to be charged to the customer when this term is accepted.
      + **Grants** (array of structures) (required) – Entitlements that will be granted to the acceptor of fixed upfront as part of agreement execution.
        + **DimensionKey** (string) (required) – Unique dimension key defined in the product document. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
        + **MaxQuantity** (integer) (required) – Maximum amount of capacity that the buyer can be entitled to the given dimension of the product. If `MaxQuantity` is not provided, the buyer will be able to use an unlimited amount of the given dimension.
      + **Duration** (string) (optional) – Defines the duration that the term remains active. This ﬁeld supports the ISO 8601 format.

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdatePricingTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP | 
| --- | --- | --- | 
| PricingModel | RequiredAllowed pricing models: ["Byol", "Free", "Usage", "Contract"] | 422 | 
| Terms | RequiredAllowed Terms: ["ConfigurableUpfrontPricingTerm", "ByolPricingTerm", "FreeTrialPricingTerm", "UsageBasedPricingTerm", "RecurringPaymentTerm", "FixedUpfrontPricingTerm"] | 422 | 
| Terms[].ByolPricingTerm | Required | 422 | 
| Terms[].ByolPricingTerm.Type | RequiredCan only be "ByolPricingTerm" | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm | Required | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.Type | RequiredCan only be "ConfigurableUpfrontPricingTerm" | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.CurrencyCode | RequiredSupported currencies: ["USD", "AUD", "EUR", "GBP", "JPN"] | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards | RequiredList size must be between 1 and 5 | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Constraints | Required | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Contraints.MultipleDimensionSelection | RequiredAllowed values: ["Allowed", "Disallowed"] | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Contraints.QuantityConfiguration | RequiredAllowed values: ["Allowed", "Disallowed"] | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].RateCard | RequiredList size must be between 1 and 800 | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].RateCard[].DimensionKey | RequiredLength must be between 1 and 100 | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].RateCard[].Price | RequiredData type is "String"Non-negative decimals with up to 3 decimal places supported | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Selector | Required | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Selector.Type | RequiredAllowed values: ["Duration"] | 422 | 
| Terms[].ConfigurableUpfrontPricingTerm.RateCards[].Selector.Value | RequiredExpected format per Selector type: ISO 8601 duration | 422 | 
| Terms[].FixedUpfrontPricingTerm | Required | 422 | 
| Terms[].FixedUpfrontPricingTerm.Type | RequiredCan only be "FixedUpfrontPricingTerm" | 422 | 
| Terms[].FixedUpfrontPricingTerm.CurrencyCode | RequiredSupported currencies: ["USD", "AUD", "EUR", "GBP", "JPN"] | 422 | 
| Terms[].FixedUpfrontPricingTerm.Duration | RequiredExpected format per Selector type: ISO 8601 duration | 422 | 
| Terms[].FixedUpfrontPricingTerm.Grants | RequiredList size must be between 1 and 200 | 422 | 
| Terms[].FixedUpfrontPricingTerm.Grants[].DimensionKey | RequiredLength must be between 1 and 100 | 422 | 
| Terms[].FixedUpfrontPricingTerm.Grants[].MaxQuantity | RequiredValue must be greater than 0 | 422 | 
| Terms[].FixedUpfrontPricingTerm.Price | RequiredData type is "String"Non-negative decimals with up to 3 decimal places supported | 422 | 
| Terms[].FreeTrialPricingTerm | Required | 422 | 
| Terms[].FreeTrialPricingTerm.Type | RequiredCan only be "FreeTrialPricingTerm" | 422 | 
| Terms[].FreeTrialPricingTerm.Duration | RequiredExpected format: ISO 8601 duration | 422 | 
| Terms[].FreeTrialPricingTerm.Grants | RequiredList size must be between 1 and 800 | 422 | 
| Terms[].FreeTrialPricingTerm.Grants[].DimensionKey | RequiredLength must be between 1 and 100 | 422 | 
| Terms[].FreeTrialPricingTerm.Grants[].MaxQuantity | OptionalValue must be greater than 0 | 422 | 
| Terms[].RecurringPaymentTerm | Required | 422 | 
| Terms[].RecurringPaymentTerm.Type | RequiredCan only be "RecurringPaymentTerm" | 422 | 
| Terms[].RecurringPaymentTerm.BillingPeriod | RequiredAllowed values: ["Monthly"] | 422 | 
| Terms[].RecurringPaymentTerm.CurrencyCode | RequiredSupported currencies: ["USD"] | 422 | 
| Terms[].RecurringPaymentTerm.Price | RequiredData type is "String"Non-negative decimals with up to 3 decimal places supported | 422 | 
| Terms[].UsageBasedPricingTerm | Required | 422 | 
| Terms[].UsageBasedPricingTerm.Type | RequiredCan only be "UsagedBasedPricingTerm" | 422 | 
| Terms[].UsageBasedPricingTerm.CurrencyCode | RequiredSupported currencies: ["USD"] | 422 | 
| Terms[].UsageBasedPricingTerm.RateCards | RequiredMust be size of 1 | 422 | 
| Terms[].UsageBasedPricingTerm.RateCards[].RateCard | RequiredList size must be between 1 and 800 | 422 | 
| Terms[].UsageBasedPricingTerm.RateCards[].RateCard[].DimensionKey | RequiredLength must be between 1 and 100 | 422 | 
| Terms[].UsageBasedPricingTerm.RateCards[].RateCard[].Price | RequiredData type is "String"Non-negative decimals with up to 8 decimal places supported | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdatePricingTerms` 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 | 
| --- | --- | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide Grants with a unique list of dimension keys in [x]. | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide RateCard with a unique list of dimension keys in [x]. | 
| DUPLICATE\$1SELECTORS  | Provide a unique list of Selectors in ConfigurableUpfrontPricingTerm. | 
| DUPLICATE\$1TERM\$1TYPES | Provide a unique list of term types. | 
| INCOMPATIBLE\$1AGREEMENT | The following terms can't be removed from the replacement offer: [x, y, z]. | 
| INCOMPATIBLE\$1AGREEMENT | The following terms can't be added to the replacement offer: [x, y, z]. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1PRODUCT | Usage pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Contract pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Byol pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Free pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | [x] isn't supported in an offer for the product. | 
| INCOMPATIBLE\$1PRODUCT | Provided payment and pricing terms are incompatible. | 
| INCOMPATIBLE\$1PRODUCT | Use existing, available dimensions in the product in [x]. | 
| INCOMPATIBLE\$1PRODUCT | FreeTrialPricingTerm as the offer's only pricing term isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | The following terms aren't supported for the product: [x,y,z]. | 
| INCOMPATIBLE\$1PRODUCT | Replacement offers are only supported for contract pricing model. | 
| INCOMPATIBLE\$1PRODUCT | Provide pricing term(s) that are compatible with the product dimensions. Incompatible pricing terms: [x,y,z]. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set MultipleDimensionSelection and QuantityConfiguration to Allowed in ConfigurableUpfrontPricingTerm for usage pricing model. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set MultipleDimensionSelection and QuantityConfiguration to Disallowed in ConfigurableUpfrontPricingTerm for usage pricing model. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | QuantityConfiguration in ConfigurableUpfrontPricingTerm can't be changed after the offer is released. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | MultipleDimensionSelection in ConfigurableUpfrontPricingTerm can't be changed after the offer is released. | 
| INCOMPATIBLE\$1RATES | Set all charge amounts and prices to zero (0) when using Free pricing model. | 
| INCOMPATIBLE\$1RATES | Only zero (0) prices are allowed in UsageBasedPricingTerm for a free trial offer for the product. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide the same CurrencyCode that is specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure Duration in FixedUpfrontPricingTerm matches duration specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide term(s) that are compatible with the ResaleAuthorization. Incompatible terms: [x, y, z]. | 
| INCOMPATIBLE\$1SELECTOR\$1DURATION | Durations aren't allowed to be removed from rate cards in ConfigurableUpfrontPricingTerm after the offer released. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INCOMPATIBLE\$1TERMS  | [x] isn't supported together with the following terms: [y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms can't be added after the offer is released: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms can't be removed after the offer is released: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | [x] isn't supported for private offers. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't supported with FreeTrialPricingTerm that grants unlimited usage: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't supported with FreeTrialPricingTerm for the product: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | Provide zero (0) price for FixedUpfrontPricingTerm when the offer contains a PaymentScheduleTerm. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't compatible with the PricingModel: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | FixedUpfrontPricingTerm isn't supported when MarkupPercentage is greater than zero (0). | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is expired. | 
| INVALID\$1AGREEMENT\$1DURATION | Provide duration between [x] and [y] months. | 
| INVALID\$1AGREEMENT\$1DURATION | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INVALID\$1DURATION | Ensure Duration in FreeTrialPricingTerm is within the allowed range. | 
| INVALID\$1DURATION | Provide Duration in FixedUpfrontPricingTerm that matches the duration between AgreementStartDate and AgreementEndDate. | 
| INVALID\$1DURATION | Provide duration between [x] and [y] months. | 
| INVALID\$1DURATION | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1GRANTS | Provide the same MaxQuantity for all Grants in FreeTrialPricingTerm. | 
| INVALID\$1GRANTS | Provide Grants for all available metered dimensions in FreeTrialPricingTerm. | 
| INVALID\$1GRANTS | The combination of Dimensions in grants is invalid in FixedUpfrontPricingTerm for the product. | 
| INVALID\$1GRANTS | The combination of Dimensions in grants is invalid in FreeTrialPricingTerm for the product. | 
| INVALID\$1GRANTS | FixedUpfrontPricingTerm with MaxQuantity is not supported for this product. | 
| INVALID\$1PRICE\$1CHANGE | [x] can't be updated until [y] because you have requested a price increase in the past 120 days. To cancel your previous price increase request or for more information, contact the AWS Marketplace Managed Catalog Operations Team. | 
| INVALID\$1PRICE\$1CHANGE | Price increase and dimension addition in [x] isn't supported in the same request. Add dimensions first. | 
| INVALID\$1PRICE\$1CHANGE | Price increase and decrease in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1PRICE\$1CHANGE | Price increase in RecurringPaymentTerm and price decrease in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1PRICE\$1CHANGE | Price decrease in RecurringPaymentTerm and price increase in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1RATE\$1CARD | ConfigurableUpfrontPricingTerm is missing one or more-dimension keys for duration [x]. Provide prices for the same set of dimension keys for all durations. | 
| INVALID\$1RATE\$1CARD | Provide a rate card for only metered dimensions in UsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | Rates can't be removed from [x]. Provide prices for all dimensions in the existing rate card. | 
| INVALID\$1RATE\$1CARD | Provide dimensions that have the same unit in [x]. | 
| INVALID\$1RATE\$1CARD | Provide either all metered or all entitled dimensions in [x]. | 
| INVALID\$1RATE\$1CARD | Provide only entitled dimensions in [x]. | 
| INVALID\$1RATE\$1CARD | Provide usage based rates for all available metered dimensions in UsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | Provide usage based rates for all free trial dimensions. | 
| INVALID\$1RATE\$1CARD | Provide prices with up to 8 decimal places in UsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | The combination of Dimensions in rate card is invalid in UsageBasedPricingTerm for the product. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide duration between [x] and [y] months. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Ensure Duration in ConfigurableUpfrontPricingTerm is within the allowed range. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide one or more supported contract durations. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide one or more supported contract durations or a single custom duration. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide Duration in ConfigurableUpfrontPricingTerm that matches the duration between AgreementStartDate and AgreementEndDate. | 
| MISSING\$1DURATION | Provide Duration in FixedUpfrontPricingTerm. | 
| MISSING\$1MANDATORY\$1TERMS | FixedUpfrontPricingTerm is only supported when paired with ByolPricingTerm or PaymentScheduleTerm. | 
| MISSING\$1MANDATORY\$1TERMS | Provide at least one of [x,y,z]. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a ByolPricingTerm when using Byol pricing model. | 
| TOO\$1MANY\$1GRANTS | Provide up to [x] grants in [y]. | 
| TOO\$1MANY\$1RATE\$1CARDS | Only one rate card in ConfigurableUpfrontPricingTerm is allowed for the product. | 
| TOO\$1MANY\$1RATE\$1CARDS | Up to [x] rate cards are allowed in ConfigurableUpfrontPricingTerm for the product. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in ConfigurableUpfrontPricingTerm. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in UsageBasedPricingTerm. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set both MultipleDimensionSelection and QuantityConfiguration to the same value (Allowed or Disallowed) in ConfigurableUpfrontPricingTerm. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Provide the same constraints for all rate cards in ConfigurableUpfrontPricingTerm. | 
| INVALID\$1UPDATE\$1REQUEST | [x] can't be updated. To request pricing change or for more information, contact the AWS Marketplace Managed Catalog Operations Team. | 
| INCOMPATIBLE\$1PRICING\$1MODEL | PricingModel can't change from [x] to [y]. | 
| INVALID\$1GRANTS | MaxQuantity for the FreeTrialPricingTerm is limited for the product. Provide a MaxQuantity less than or equal to [x]. For more information, contact the AWS Marketplace Managed Catalog Operations Team. | 
| INVALID\$1GRANTS | Provide MaxQuantity for all Grants in FixedUpfrontPricingTerm. | 
| INVALID\$1GRANTS | MaxQuantity isn't supported in FixedUpfrontPricingTerm for the product. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure Grants in FixedUpfrontPricingTerm matches RateCards specified in the ResaleAuthorization. | 

## Update the discoverability of the offer
<a name="update-availability"></a>

You can use the Catalog API to control the discoverability of your offer in AWS Marketplace. 

You can either choose to set a specific date in the future to restrict the discoverability of your offer or in the past to expire your offer. The `UpdateAvailability` change type doesn’t affect existing agreements.

**Note**  
You can use the `UpdateAvailability` change type on a private offer that has already been [published](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#release-offer) (also known as *released*). If buyers have already accepted the private offer, those existing agreements aren't affected.
When modifying the `AvailabilityEndDate` of an existing private offer, the [constraints of the agreement duration](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-validity-terms) must be adhered to. If it's not, include an additional `UpdateValidityTerms` change type in this change set to modify the agreement duration to adhere to the new expiration. The `UpdateValidityTerms` change type can be used on a private offer that is either released or not yet released.
When modifying the `AvailabilityEndDate` of an existing private offer, the [constraints of the payment schedule](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-payment-schedule-terms) must be adhered to. If it's not and the private offer is *not yet released*, include an additional `UpdatePaymentScheduleTerms` change type in this change set to modify the payment schedule to adhere to the new expiration. If the private offer is *already released*, you can only make changes to the `AvailabilityEndDate` as long as the new date adheres to the constraints of the payment schedule.

To control the discoverability of your offer, call the `StartChangeSet` API operation with the `UpdateAvailability` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateAvailability",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "AvailabilityEndDate": "2024-05-31"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateAvailability` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **AvailabilityEndDate** (string) (required) – This is the date until when the offer is discoverable and purchasable in AWS Marketplace. You can choose to set a specific date in the future to restrict the availability or in the past to expire the offer. Dates are represented in `YYYY-MM-DD` format.

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

**Response Syntax**

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

The change request is added to a queue and processed. It 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 in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**

The following schema validations are specific to `UpdateAvailability` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| AvailabilityEndDate |  Required Format: "YYYY-MM-DD"  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateAvailability` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more details 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\$1AVAILABILITY\$1END\$1DATE | AvailabilityEndDate isn't supported for public offers. | 
| INVALID\$1AVAILABILITY\$1END\$1DATE | Provide a future AvailabilityEndDate. | 
| INVALID\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate that is before AgreementEndDate. | 
| MISSING\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate that is before the agreement's end date. | 

## Define the expiration date of agreements created using the offer
<a name="update-validity-terms"></a>

You can use the Catalog API to define the expiration date details of agreements created using the offer in AWS Marketplace. 

This change type doesn’t affect existing agreements.

**Note**  
You can use the `UpdateValidityTerms` change type on a private offer that has already been [published](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#release-offer) (also known as *released*). If buyers have already accepted the private offer, those existing agreements aren't affected.  
For **AMI-based** and **container-based** products, if your private offer [pricing terms](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-pricing-terms) include a term type that has a `Duration` (for example, the term types `FixedUpfrontPricingTerm` or `ConfigurableUpfrontPricingTerm`), your `AgreementDuration` set in this change type must be greater than the following: the number of days from today to the [expiration of the private offer](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-availability) plus the number of days set in the `Duration` of those term types. This is because after a buyer accepts the private offer and the agreement is created, they can optionally purchase additional entitlements specified in those term types until the private offer expires. Furthermore, all additional entitlements must end before the agreement does. For example, if the buyer accepts the private offer on the first available day and then purchases entitlements on the last available day, those entitlements must not end after the agreement end date.

To define the expiration date details of agreements created using the offer, call the `StartChangeSet` API operation with the `UpdateValidityTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateValidityTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "ValidityTerm",
            "AgreementDuration": "P12M",
            "AgreementStartDate": "2021-08-01",
            "AgreementEndDate": "2022-08-01"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateValidityTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) – List of validity terms that you want to update. Supported validity terms are:
    + **ValidityTerm** (object) – Defines the conditions that will keep an agreement, created from this offer, valid.
      + **Type** (string) – Category of the term being updated. `ValidityTerm`
      + **AgreementDuration** (string) – Defines the duration that the agreement remains active. If `AgreementStartDate` isn’t provided, agreement duration is relative to the agreement signature time. The duration is represented in the ISO\$18601 format.
      + **AgreementStartDate** (string) – Defines the date when agreement starts. `AgreementStartDate` is represented in `YYYY-MM-DD` format. The agreement starts at 00:00:00.000 UTC on the date provided. If `AgreementStartDate` isn’t provided, agreement start date is determined based on agreement signature time.
      + **AgreementEndDate** (string) – Defines the date when the agreement ends. The `AgreementEndDate` is represented in `YYYY-MM-DD` format. The agreement ends at 23:59:59.999 UTC on the date provided. If `AgreementEndDate` isn’t provided, the agreement end date is determined by the validity of individual terms.

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateValidityTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required  | 422 | 
| Terms[].Type |  Required Can only be `"ValidityTerm"`  | 422 | 
| Terms[].AgreementDuration |  Optional Expected format per Selector type: ISO 8601 duration Can be stand alone or paired with `AgreementStartDate`  | 422 | 
| Terms[].AgreementEndDate |  Optional Date must be formatted like `"YYYY-MM-DD"`  | 422 | 
| Terms[].AgreementStartDate |  Optional Date must be formatted like `"YYYY-MM-DD"` Can only be paired with `AgreementEndDate` and `AgreementDuration`  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateValidityTerms` 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\$1AGREEMENT | AgreementStartDate can't be in the future when the current agreement to be replaced isn't future dated. | 
| INCOMPATIBLE\$1AGREEMENT\$1END\$1DATE | AgreementEndDate can't be updated after the offer is released. | 
| INCOMPATIBLE\$1AGREEMENT\$1START\$1DATE | AgreementStartDate can't be updated after the offer is released. | 
| INCOMPATIBLE\$1PRODUCT | AgreementStartDate in the future isn't supported. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the duration between AgreementStartDate and AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementStartDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the duration between AgreementStartDate and AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementDuration matches duration specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1TERMS  | ValidityTerm isn't supported for public offers. | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is expired. | 
| INVALID\$1AGREEMENT\$1DURATION | Provide AgreementDuration that is greater than or equal to [x] days. | 
| INVALID\$1AGREEMENT\$1END\$1DATE | Provide a future AgreementEndDate. | 
| INVALID\$1AGREEMENT\$1END\$1DATE | Provide AgreementEndDate that is after or equal to [x]. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is after AvailabilityEndDate. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is before the AgreementEndDate. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is within [x] years from today. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with both AgreementDuration and AgreementEndDate isn't supported. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with both AgreementStartDate and AgreementDuration isn't supported in an offer for the product. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with AgreementStartDate isn't supported in an offer for the product. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with only AgreementStartDate isn't supported. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | AgreementEndDate isn't supported unless it's used in combination with a future AgreementStartDate or for replacement offers. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | Provide AgreementStartDate and AgreementEndDate where the difference is less than or equal to [x] years. | 
| MISSING\$1AGREEMENT\$1START\$1DATE | Ensure AgreementStartDate is present in ValidityTerm when used along with ConfigurableUpfrontPricingTerm. | 
| INVALID\$1AGREEMENT\$1END\$1DATE | Provide an AgreementEndDate that is within [x] years from today. | 
| INCOMPATIBLE\$1AGREEMENT\$1START\$1DATE | Provide the same AgreementStartDate as defined in the agreement when the agreement has a future start date. | 
| INCOMPATIBLE\$1AGREEMENT | AgreementStartDate can't be future dated when the agreement isn't future dated. | 

## Update payment schedule details
<a name="update-payment-schedule-terms"></a>

You can use the Catalog API to update payment schedule details for your offer, such as flexible payment schedule, in AWS Marketplace. 

**Note**  
You cannot use the `UpdatePaymentScheduleTerms` change type on an offer that has already been [published](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#release-offer) (also known as *released*).  
The private offer can be accepted any day between the creation of the private offer and its [expiration](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-availability) (set in the `AvailabilityEndDate`). Only one `ChargeDate` value of the payment schedule can be a date on or before the last day the buyer can accept the private offer (the private offer expiration date). The remaining values of `ChargeDate` must be after the private offer expiration, but no later than the end of the agreement if the private offer was accepted immediately. The end of the agreement is based on when the private offer is accepted (creating the agreement) plus the [duration of the agreement](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/offers.html#update-validity-terms).

To update payment schedule details for your offer, call the `StartChangeSet` API operation with the `UpdatePaymentScheduleTerms` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdatePaymentScheduleTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "PaymentScheduleTerm",
            "Schedule": [
              {
                "ChargeDate": "2021-12-01",
                "ChargeAmount": "200.00"
              },
              {
                "ChargeDate": "2022-03-01",
                "ChargeAmount": "250.00"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePaymentScheduleTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) – List of payment terms that you want to update. Supported payment terms are:
    + **PaymentScheduleTerm** (object) – Defines an installment-based pricing model where customers are charged a fixed price on different dates during the agreement validity period.
      + **Type** (string) – Type of the term being updated. This is the object value: `"PaymentScheduleTerm"`.
      + **Schedule** (array of structures) – List of the payment schedule where each element defines one installment of payment. It contains the information necessary for calculating the price to be paid and the date on which the customer would be charged.
        + **ChargeDate** (string) – The date on which the customer would pay the price defined in this payment schedule term. `ChargeDate` is represented in YYYY-MM-DD format. Invoices are generated on the date provided.
        + **ChargeAmount ** (string) – The price that the customer would pay on scheduled date (`ChargeDate`).

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdatePaymentScheduleTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input Field | Validation Rule | HTTP | 
| --- | --- | --- | 
| Terms |  Required Only `PaymentScheduleTerm` is allowed List size must be less than 2  | 422 | 
| Terms[].Type |  Required Can only be `PaymentScheduleTerm`  | 422 | 
| Terms[].PaymentScheduleTerm.CurrencyCode |  Required Supported currencies: ["USD", "AUD", "EUR", "GBP", "JPY"]  | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[] |  Required  | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[].ChargeAmount | RequiredDate type is "String"Non-negative decimals with up to 2 decimal places supported | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[].ChargeDate |  Required Date must be formatted like "YYYY-MM-DD"  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdatePaymentScheduleTerms` 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 | 
| --- | --- | 
| DUPLICATE\$1CHARGE\$1DATES | Provide unique charge dates in PaymentScheduleTerm. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 
| INCOMPATIBLE\$1MARKUP\$1PERCENTAGE | PaymentScheduleTerm isn't supported when MarkupPercentage is greater than zero (0). | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide term(s) that are compatible with the ResaleAuthorization. Incompatible terms: [PaymentScheduleTerm]. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the total ChargeAmounts in PaymentScheduleTerm is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 
| INVALID\$1CHARGE\$1DATES | Provide charge dates before AgreementEndDate. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| TOO\$1MANY\$1BACKDATED\$1CHARGES | Provide up to 1 scheduled payment before AvailabilityEndDate. | 
| INVALID\$1CHARGE\$1DATES | Provide a last charge date that is before AgreementEndDate. | 
| INVALID\$1CHARGE\$1DATES | Provide a first charge date that isn't in the past. | 
| TOO\$1MANY\$1CHARGES | Provide up to [x] scheduled payments in PaymentScheduleTerm. | 

## Modify renewal options
<a name="update-renewal-terms"></a>

You can use the Catalog API to control renewal options of the agreements that are created using this offer in AWS Marketplace. 

For offers created through Catalog API, auto-renewal remains disabled by default until you call the `UpdateRenewalTerms` change type to allow auto-renewal. This change does not affect existing agreements.

To control renewal options of the agreements that are created using this offer, call the `StartChangeSet` API operation with the `UpdateRenewalTerms` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateRenewalTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "RenewalTerm"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateRenewalTerms` change type:
+ **Entity** (object) (required) – Your offer. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) – List of renewal terms that you want to update. Supported renewal terms are:
    + **RenewalTerm** (object) – Defines that on graceful termination (expiration of the `ValidityTerm`, not buyer or AWS Marketplace cancellation) of the agreement, a new agreement will be created using the accepted terms on the existing agreement. In other words, the agreement will be renewed. Presence of `RenewalTerm` in the offer means that auto-renewal is allowed. Buyers will have the option to accept or decline auto-renewal at the offer acceptance/agreement creation.
      + **Type** (string) – Type of the term being updated. `RenewalTerm`

**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.

**Synchronous Validations**

The following schema validations are specific to `UpdateRenewalTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms | Required | 422 | 
| Terms[].Type | RequiredCan only be "RenewalTerm" | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateRenewalTerms` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more details 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\$1PRODUCT | RenewalTerm isn't supported in private offers for the product. | 
| INCOMPATIBLE\$1TERMS  | RenewalTerm isn't supported together with PaymentScheduleTerm. | 
| INCOMPATIBLE\$1TERMS  | RenewalTerm isn't supported with the PricingModel. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 

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

You can use the Catalog API to merge the information collected from all update change types, and then publish the offer.

Offers remain in a `Draft` state, until `ReleaseOffer` is called. After the offer is released, it’s discoverable in AWS Marketplace.

To publish your offer, call the `StartChangeSet` API operation with the `ReleaseOffer` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "ReleaseOffer",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `ReleaseOffer` change type:
+ **Entity** (object) – The named type of entity being created. The `Identifier` is your offer ID, and the `Type` is always `Offer@1.0`. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) – The JSON value of specifics of the request. It must be empty for `ReleaseOffer`.

**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.

**Synchronous Validations**

The following schema validations are specific to `ReleaseOffer` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| DetailsDocument | Must be empty (\$1\$1) | 

**Asynchronous Errors**

The following errors are specific to `ReleaseOffer` 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\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1PRODUCT | First create a public offer for the product. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INCOMPATIBLE\$1TARGETING | PreExistingAgreement is only supported for buyer targeted offers. | 
| INCOMPATIBLE\$1TARGETING | OfferSetId is only supported for buyer targeted offers. | 
| INVALID\$1TAX\$1INFORMATION | Your tax information is incomplete. To sell professional services on AWS Marketplace, you must complete the DAC7 tax questionnaire. Navigate to the Payment Information section, and select the DAC7 tax form. It can take up to two hours for your tax information to update. | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer is released. | 
| MISSING\$1AGREEMENT\$1END\$1DATE | Provide an AgreementEndDate for replacement offers. | 
| MISSING\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate for private offer. | 
| MISSING\$1BUYER\$1ACCOUNTS | Provide PositiveTargeting with BuyersAccounts for offers created using ResaleAuthorization. | 
| MISSING\$1BUYER\$1ACCOUNTS | All offers for the product must be private. Provide PositiveTargeting with BuyersAccounts. | 
| MISSING\$1DESCRIPTION | Set Description before releasing the offer. | 
| MISSING\$1MANDATORY\$1TERMS | Add [x] to the offer. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a FixedUpfrontPricingTerm when the offer contains a PaymentScheduleTerm. | 
| MISSING\$1NAME | Set Name before releasing the offer. | 
| TOO\$1MANY\$1OFFERS | Only one public free trial offer can be created per product. | 
| TOO\$1MANY\$1OFFERS | Only one public offer can be created per product. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a RenewalTerm for public offers with contract pricing for the product. | 
| MISSING\$1AGREEMENT\$1END\$1DATE | Provide an AgreementEndDate for replacement offers. | 

## Describe existing offer details
<a name="describe-entity"></a>

You can use the Catalog API to describe existing offer details in AWS Marketplace. 

To describe existing offer details, call the `DescribeEntity` API operation with the `Offer@1.0` entity type, as shown in the following example.

**Request Syntax**

```
GET /DescribeEntity?catalog=<Catalog>&entityId=<EntityId> HTTP/1.1
```

Provide information for the fields to add the `DescribeEntity` change type:
+ **catalog** (string) – The catalog related to the request. Fixed value: `AWSMarketplace`.
+ **entityId** (string) – The unique ID of the offer to describe.

**Response Syntax**

The response to this request gives you the offer details and looks like the following.

```
{
  "EntityType": "Offer@1.0",
  "EntityIdentifier": "offer-ad8EXAMPLE51@1",
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:111122223333:AWSMarketplace/Offer/offer-ad8EXAMPLE51",
  "LastModifiedDate": "2021-03-10T21:57:16Z",
  "DetailsDocument": {
    "Id": "offer-3rEXAMPLErn",
    "State": "Released",
    "Name": "Test Offer",
    "Description": "Worldwide offer for Test Product",
    "PreExistingAgreement": {
      "AcquisitionChannel": "External",
      "PricingModel": "Contract"
    },
    "ProductId": "prod-ad8EXAMPLE51",
    "OfferSetId": "offerset-b3f9EXAMPLE27",
    "Terms": [
      {
        "Type": "SupportTerm",
        "RefundPolicy": "If you need to request a refund for software sold by Amazon Web Services, LLC, please contact AWS Customer Service."
      },
      {
        "Type": "LegalTerm",
        "Documents": [
          {
            "Type": "CustomEula",
            "Url": "https://s3.amazonaws.com/EULA/custom-eula-1234.txt"
          }
        ]
      },
      {
        "Type": "FreeTrialPricingTerm",
        "Duration": "P30D",
        "Grants": [
          {
            "DimensionKey": "m3.xlarge",
            "MaxQuantity": 10
          },
          {
            "DimensionKey": "m4.xlarge",
            "MaxQuantity": 10
          }
        ]
      },
      {
        "Type": "ConfigurableUpfrontPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "Selector": {
              "Type": "Duration",
              "Value": "P365D"
            },
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "300.00"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "400.00"
              }
            ],
            "Constraints": {
              "MultipleDimensionSelection": "Allowed",
              "QuantityConfiguration": "Allowed"
            }
          }
        ]
      },
      {
        "Type": "UsageBasedPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "0.10"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "0.20"
              }
            ]
          }
        ]
      },
      {
        "Type": "FixedUpfrontPricingTerm",
        "CurrencyCode": "USD",
        "Price": "200.00",
        "Grants": [
          {
            "DimensionKey": "Users",
            "MaxQuantity": 10
          }
        ]
      },
      {
        "Type": "RecurringPaymentTerm",
        "CurrencyCode": "USD",
        "BillingPeriod": "Monthly",
        "Price": "100.0"
      },
      {
        "Type": "PaymentScheduleTerm",
        "CurrencyCode": "USD",
        "Schedule": [
          {
            "ChargeDate": "2020-12-01T00:00:00.000Z",
            "ChargeAmount": "1000.00"
          },
          {
            "ChargeDate": "2021-06-15T00:00:00.000Z",
            "ChargeAmount": "1250.00"
          }
        ]
      },
      {
        "Type": "ByolPricingTerm"
      },
      {
        "Type": "RenewalTerm"
      }
    ],
    "Rules": [
      {
        "Type": "TargetingRule",
        "PositiveTargeting": {
          "CountryCodes": [
            "US",
            "CA"
          ],
          "BuyerAccounts": [
            "444455556666"
          ]
        },
        "NegativeTargeting": {
          "CountryCodes": [
            "XX"
          ]
        }
      },
      {
        "Type": "AvailabilityRule",
        "AvailabilityEndDate": "2024-08-30T01:56:03.000Z"
      }
    ]
  }
}
```

The following is information about the fields you see in the `DescribeEntity` response.
+ **EntityType** (string) – The named type of the entity, which is `Offer@1.0`.
+ **EntityIdentifier** (string) – The identifier of the entity, in the format of `EntityId@RevisionId`.
+ **EntityArn** (string) – The ARN associated to the unique identifier for the change set referenced in this request.
+ **LastModifiedDate** (string) –The last modified date of the entity, in ISO 8601 format (for example: `2018-02-27T13:45:22Z`).
+ **Details** (string) – This stringified JSON object includes the following details of the entity:
  + **Id** (string) – Unique identifier for an offer entity in AWS Marketplace and is generated during the creation of an offer.
  + **State** (string) – The status of the offer.
  + **Name** (string) – The name associated with the offer for better readability to you and your customers. It will be displayed as part of Agreement information as well.
  + **Description** (string) – Description is a free-form text which is meant to be used only by you and will never be exposed to buyers.
  + **PreExistingAgreement** (string) – Determines if this offer is a renewal for an existing agreement with an existing customer for the same underlying product. The existing agreement can be within or outside AWS Marketplace. AWS may audit and verify your offer is a renewal. If AWS is unable to verify your offer, then AWS may revoke the offer and entitlements from your customer.
    + **AcquisitionChannel** (string) – Indicates if the existing agreement was signed outside AWS Marketplace or within AWS Marketplace. Possible values: `External`, `AwsMarketplace`.

       
    + **PricingModel** (string) – Indicates which pricing model the existing agreement uses. Possible values: `Contract`, `Usage`, `Byol`, `Free`.
  + **ProductId** (string) – The unique identifier of the product being offered.
  + **OfferSetId** (string) – The unique identifier of the offer set to associate this offer with.
  + **Terms** (array of structures) – List of terms.
  + **Rules** (array of structures) – List of rules.

# Work with resale authorizations using the AWS Marketplace APIs
<a name="work-with-resale-authorizations"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with Resale Authorizations. 

While the *product* describes what is being sold in AWS Marketplace, the *Resale Authorization* (also known as an opportunity) describes the terms and rules regarding how this product is authorized to be resold in AWS Marketplace. The *CPPO* is the target of the Resale Authorization.

A Resale Authorization has a collection of terms and rules to be accepted for a reseller agreement between manufacturers and channel partners. Accepting the terms of the Resale Authorization allows the reseller to create offers for the product per the conditions expressed in the terms.

There are two types of rules in a Resale Authorization:
+ **AvailabilityRule** – Controls the lifecycle of the Resale Authorization in AWS Marketplace.
+ **PartnerTargetingRule ** – Specifies whether the Resale Authorization should be accessible to a specific set of channel partners.

See the following resources:
+ For end-to-end labs with working code examples, see [Lab: Authorize a reseller](https://catalog.workshops.aws/mpseller/en-US/manage-offers-with-api/authorize-a-reseller) in the *AWS Marketplace seller workshop*.
+ For code examples of API requests, see [Python](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/python/src/catalog_api/resale_authorization) and [Java](https://github.com/aws-samples/aws-marketplace-reference-code/tree/main/java/resources/changeSets/channel_partner_offers) examples in *AWS Samples* on GitHub.
+ For a video on creating resale authorizations, see [Create Resale Authorizations Using the AWS Marketplace Catalog API](https://www.youtube.com/watch?v=vLIbvFYI974) on YouTube.

The following topics describe how to use the Catalog API to create and update Resale Authorizations:

**Topics**
+ [Resale Authorization prerequisites](#prerequisites)
+ [Create a new Resale Authorization](#create-resale-authorization)
+ [Update buyer targeting](#update-buyer-targeting)
+ [Update availability](#update-availability-resale-auth)
+ [Update the validity of a future dated agreement](#update-validity-fda)
+ [Update legal resources](#update-existing-legal-terms)
+ [Update pricing](#update-existing-pricing-terms)
+ [Update payment schedule](#update-payment-schedule-details)
+ [Update Resale Authorization details](#update-resale-auth-information)
+ [Restrict a Resale Authorization](#restricte-resale-auth)
+ [Release a Resale Authorization and make it visible to a Channel Partner](#release-resale-auth)
+ [Describe an existing Resale Authorization](#describe-entity-resale-auth)

## Resale Authorization prerequisites
<a name="prerequisites"></a>

To use Resale Authorization, both independent software vendors (ISVs) and AWS Marketplace Channel Partners must create a service-linked role that provides resource-sharing permissions to AWS. If both groups don’t perform this prerequisite, AWS can’t share the authorization resource from the ISV to the AWS Marketplace Channel Partner. For more information, see [Using roles for Resale Authorization for AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/using-roles-for-resale-authorization.html) in the *AWS Marketplace Seller Guide*.

## Create a new Resale Authorization
<a name="create-resale-authorization"></a>

You can use the Catalog API to create a new Resale Authorization in AWS Marketplace.

If your request is processed successfully, AWS Marketplace Catalog API generates a Resale Authorization in `Draft` state for you. It’s an incomplete Resale Authorization and not visible to channel partners in AWS Marketplace. 

Use the `Update` change types to complete the Resale Authorization. After the Resale Authorization is completed, use the `ReleaseResaleAuthorization` change type to complete the Resale Authorization creation process and release the Resale Authorization, which will validate the entire Resale Authorization and make your it visible to channel partners in AWS Marketplace.

To create a Resale Authorization in `Draft` state, call the `StartChangeSet` API operation with the `CreateResaleAuthorization` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "CreateResaleAuthorization",
      "ChangeName": "xyz",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0"
      },
      "DetailsDocument":
      {
        "ProductId": "prod-ad8EXAMPLE51",
        "Name": "Test ResaleAuthorization",
        "Description": "Worldwide ResaleAuthorization for Test Product",
        "ResellerAccountId": "777788889999"
      }
    }
  ]
}
```

Provide information for the input fields to add the `CreateResaleAuthorization` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **ProductId** (string) (required) – Product ID for which to create the resale authorization.
  + **Name** (string) (required) – Name associated with the ResaleAuthorization for better readability to you and your channel partners.
  + **Description** (string) (optional) – A free-form text field available to add details about the ResaleAuthorization.
  + **ResellerAccountId** (string) (required) – Add targeted channel partner’s AWS account who can describe and use this `ResaleAuthorization` to create a private offer.

**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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

When the request is complete (if the `Status` is `SUCCEEDED`), a new `ResaleAuthorization` is generated. Although the `SUCCEEDED` status indicates that the `CreateResaleAuthorization` change type call is completed, the `ResaleAuthorization` status is still in `Draft` state.

The following shows the response from the [DescribeChangeSet](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html) API operation.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef",
  "ChangeSetName": "Submitted by 123456789012",
  "StartTime": "2021-05-27T22:21:26Z",
  "EndTime": "2021-05-27T22:32:19Z",
  "Status": "SUCCEEDED",
  "ChangeSet":
  [
    {
      "ChangeType": "CreateResaleAuthorization",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "ProductId": "prod-ad8EXAMPLE51",
        "Name": "Test ResaleAuthorization",
        "Description": "Worldwide ResaleAuthorization for Test Product",
        "ResellerAccountId": "777788889999",
        "BulkRequestId": "84977023-5093-4a66-8b24-ef2c5a2f8b1f"
      },
      "ErrorDetailList":
      []
    }
  ]
}
```

**Synchronous Validations**

The schema validations are specific to `CreateResaleAuthorization` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| ProductId |  Required Must not be null or empty Length must be between 1 and 50 characters   | 422 | 
| ProductId | User must be authorized to create ResaleAuthorization for the given product | 403 | 
| ProductId | Must be an existing product in the catalog and not in Draft state Product should be supported to resell | 404 | 
| Name |  Required Must not be null or empty Length must be between 1 and 100 characters  No special characters allowed  | 422 | 
| Description |  Optional Length must be between 1 and 255 characters  No special characters allowed  | 422 | 
| ResellerAccountId |  Required Must not be empty AWS account IDs must be in valid format (12-digit number)  | 422 | 
| BulkRequestId |  Optional Length must be between 1 and 50 characters  Must be in UUID format  | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `CreateResaleAuthorization ` 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\$1RESELLER\$1ACCOUNT | Provide a valid reseller account. | 

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

You can use the Catalog API to update buyers targeting your Resale Authorization in AWS Marketplace.

Any existing targeting options that aren't included in the latest request are removed from the Resale Authorization. This change type is optional for release of the Resale Authorization.

To update buyers targeting your Resale Authorization, call the `StartChangeSet` API operation with the `UpdateBuyerTargetingTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
   "Catalog": "AWSMarketplace",
   "ChangeSet": [        
      {
         "ChangeType":"UpdateBuyerTargetingTerms",
         "Entity":{
            "Type": "ResaleAuthorization@1.0", 
            "Identifier": "resaleauthz-123456789"
         },
         "DetailsDocument":
         {
           "Terms":
           [
             {
               "Type": "BuyerTargetingTerm",
               "PositiveTargeting":
               {
                 "BuyerAccounts":
                 [
                  "123456789012"
                 ]
               }
             }
           ]
         }
      }
   ]
}
```

Provide information for the fields to add the `UpdateBuyerTargetingTerms` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **Terms** (array of structures) (optional) – List of buyers targeting terms that you want to update. If the intentions aren't to target the `ResaleAuthorization` to any specific buyer, then terms field can be skipped. By default, `ResaleAuthorization` is targeted to all buyers. Supported terms are:
    + **BuyerTargetingTerms** (object) (optional) – Define buyer-specific targeting to your ResaleAuthorization.
      + **Type** (string) (required) – Category of the term being updated.
      + **PositiveTargeting** (object) (required) – Defines the criteria that any buyer’s profile should fulfill to be allowed access to the `ResaleAuthorization`.
        + **BuyerAccounts** (array of strings) (optional) – List as optional. You can add the targeted buyer’s AWS accounts. If the intention isn’t to target `ResaleAuthorization` to specific buyers, then this field should be omitted. By default, all buyers are targeted. Targeted channel partners can choose to create a private offer and target a subset of buyers, if specified.

**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 with the AWS Marketplace Seller Operations team to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The schema validations are specific to `UpdateBuyerTargetingTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| Terms |  Optional Must not be null or empty Only "BuyerTargetingTerm" is allowed in the list  List size must be 1 (there is no use case today that requires multiple buyer terms)  | 
| BuyerTargetingTerm.PositiveTargeting |  Required Must not be empty  | 
| BuyerTargetingTerm.PositiveTargeting.BuyerAccounts |  Optional AWS account IDs must be in valid format (12-digit number) Must not contain more than 25 accounts  | 
| An unknown property | No additional properties are allowed | 

**Asynchronous Errors**

The following errors are specific to `UpdateBuyerTargetingTerms` 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\$1BUYER\$1TARGETING | At least one Buyer account must be present for ResaleAuthorization with PreExistingBuyerAgreement. | 

## Update availability
<a name="update-availability-resale-auth"></a>

You can use the Catalog API to limit the availability of how many private offers are created or until what specific time a private offer can be created.

By default, the value is unlimited usage of this Resale Authorization, although you can check the availability under the rule list.

To control the availability and usability of your Resale Authorization, call the `StartChangeSet` API operation with the `UpdateAvailability` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateAvailability",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "AvailabilityEndDate": "2022-05-31",
        "OffersMaxQuantity": 1
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateAvailability` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **AvailabilityEndDate** (string) (optional) – Define the end date until Channel Partners can leverage the `ResaleAuthorization` to create an offer. Channel Partners can use this `ResaleAuthorization` multiple times until the specified end date. Dates are represented in ISO\$18601 format.
  + **OffersMaxQuantity** (integer) (optional) – Define the maximum number of private offers that can be created using the ResaleAuthorization. This doesn’t define the number of subscriptions.

**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 with the AWS Marketplace Seller Operations team to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The schema validations are specific to `UpdateAvailability` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response


| Input field | Validation rule | 
| --- | --- | 
| OffersMaxQuantity |  Optional Must be non-negative integer Allowed value only "1" (Currently no use case to support multiple quantity)  | 
| AvailabilityEndDate |  Optional Must be ISO\$18601 formatted  Must be date in the future  | 
| Availability | Provide either OffersMaxQuantity or AvailabilityEndDate. | 
| An unknown property | No additional properties are allowed | 

**Asynchronous Errors**

The following errors are specific to `UpdateAvailability` 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\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate that is before all the ChargeDate in ResalePaymentScheduleTerms.  | 
|  INVALID\$1AVAILABILITY\$1END\$1DATE | Provide a future AvailabilityEndDate. | 

## Update the validity of a future dated agreement
<a name="update-validity-fda"></a>

You can use the Catalog API to modify and control a future dated service start date in AWS Marketplace.

This change set is not mandatory to release a Resale Authorization.

To modify and control the product agreement duration of your Resale Authorization, call the `StartChangeSet` API operation with the `UpdateBuyerValidityTerms` change type, as shown in the following example. 

**Note**  
Future-dated agreements are only supported for SaaS product types.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateBuyerValidityTerms",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "Terms":
        [
          {
            "Type": "BuyerValidityTerm",
            "MaximumAgreementStartDate": "2024-05-31"
          }
        ]
      }
    }
  ]
}
```

Provide information for the input fields to add the `UpdateBuyerValidityTerms` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **Terms** (array of structures) – List of agreement validity terms that you want to update. Supported terms are:
    + **BuyerValidityTerm** (object) – Defines the availabilities of a service for a product in your ResaleAuthorization.
      + **Type** (string) – Category of term being updated.
      + **MaximumAgreementStartDate** (string) (required) – Define the agreement start date for the product offered. Future dated offers can’t exceed this service start date. Dates are represented in ISO\$18601 format. 

**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 with the AWS Marketplace Seller Operations team to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The schema validations are specific to `UpdateBuyerValidityTerms` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
|  Terms  |  Required Must not be null or empty Only "BuyerValidityTerm" is allowed in the list List size must be 1 (there’s no use case today that requires multiple service availability terms)  | 
| MaximumAgreementStartDate |  Required Must not be null or empty Must be future date and shouldn't exceed more than 3 years from now  Must be ISO\$18601 formatted  | 
| An unknown property | No additional properties are allowed | 

**Asynchronous Errors**

The following errors are specific to `UpdateBuyerValidityTerms ` 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\$1PRODUCT | BuyerValidityTerm isn't supported for the product. | 
| INVALID\$1MAXIMUM\$1AGREEMENT\$1START\$1DATE | Provide a future MaximumAgreementStartDate with in allowed limit. | 

## Update legal resources
<a name="update-existing-legal-terms"></a>

You can use the Catalog API to replace the existing legal terms completely in AWS Marketplace.

The legal terms that aren't included in the latest request will be removed from the Resale Authorization. `BuyerLegalTerm` contains the EULA which will be included on the final buyer agreement and `LegalTerm` includes the Reseller Contract which will be included in the reseller agreement between the channel partner and the ISV.

To update legal terms of your `ResaleAuthorization`, call the `StartChangeSet` API operation with the `UpdateLegalTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateLegalTerms",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "Terms":
        [
          {
            "Type": "BuyerLegalTerm",
            "Documents":
            [
              {
                "Type": "CustomEula",
                "Url": "https://my-public-bucket.s3.amazonaws.com/eula-example12345.txt"
              }
            ]
          },
          {
            "Type": "ResaleLegalTerm",
            "Documents":
            [
              {
                "Type": "CustomResellerContract",
                "Url": "https://my-public-bucket.s3.amazonaws.com/reseller-example12345.txt"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateLegalTerms` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **Terms** (array of structures) (required) – List of legal terms. Supported legal terms are:
    + **BuyerLegalTerm** (object) (required) – Defines the list of text agreements to be proposed to acceptors. For example, the end user license agreement (EULA).
    + **Type** (string) (required) – Category of the term being updated.
    + **Documents** (array of structures) (required) – List of references to legal resources to be proposed to the buyers. For example, the EULA. Each reference is made up of a `Type` and a `URL`:
      + **Type** (string) (required) – Type of document. Available document types are:
        + **StandardEula** – Standard Contract for AWS Marketplace. For more information, see [SCMP](https://docs.aws.amazon.com/marketplace/latest/userguide/standardized-license-terms.html#standard-contracts) in the *AWS Marketplace Seller Guide*. You don’t need to provide a URL for this type because it’s managed by AWS Marketplace.
        + **EnterpriseEula** – Enterprise Contract for AWS Marketplace. For more information, see DSA in the AWS Marketplace Seller Guide. You don’t need to provide a URL for this type because it’s managed by AWS Marketplace.
        + **CustomEula** – Custom EULA provided by you as a manufacturer. A URL for the EULA stored in an accessible S3 bucket is required for this document type.
      + **Url** (string) (conditionally required) – A URL to the legal document for buyers to read. This is required when category Type is `CustomEula`.
    + **ResaleLegalTerm** (object) (optional) – Defines the list of text agreements to propose only to channel partners. This term won’t be available to buyers.
      + **Type** (string) (required) – Category of term being updated.
      + **Documents** (array of structures) (required) – List of references to the reseller legal resources to be proposed to the channel partners.
        + **Type** (string) (required) – Category of the document. Available document types are:
          + **StandardResellerContract** – Standard Reseller Contract for AWS Marketplace.
          + **CustomResellerContract** – A custom reseller contract by you as a manufacturer. A URL for the reseller contract is stored in an accessible S3 bucket and is required for this document type.
        + **Url** (string) (conditionally required) – URL to the reseller contract document for channel partners to read. It’s required when the Type is CustomResellerContract.

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The schema validations are specific to `UpdateLegalTerms` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required Must not be null or empty  | 422 | 
| Terms[].BuyerLegalTerm |  Required Must not be null or empty  | 422 | 
| Terms[].ResaleLegalTerm |  Optional Must not be null or empty if present  | 422 | 
| Terms[].BuyerLegalTerm.Documents |  Required Must not be null or empty  | 422 | 
| Terms[].BuyerLegalTerm.Documents[].Type |  Required Must not be null or empty  Allowed values: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-resale-authorizations.html)  | 422 | 
| Terms[].BuyerLegalTerm.Documents[].Url | Required and must be a valid URL when "Type" is "CustomEula" Must not be provided when "Type" is one of ["StandardEula", "EnterpriseEula"] | 422 | 
| Terms[].ResaleLegalTerm.Documents |  Required Must not be null or empty  | 422 | 
| Terms[].ResaleLegalTerm.Documents[].Type |  Required Must not be null or empty Allowed values: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-resale-authorizations.html)  | 422 | 
| Terms[].ResaleLegalTerm.Documents[].Url |  Required and must be a valid URL when "Type" is "CustomResellerContract" Must not be provided when "Type" is one of ["StandardContract"]  | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateLegalTerms` 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\$1BUYER\$1LEGAL\$1DOCUMENTS | Provide URLs for buyer legal documents stored in accessible S3 buckets. | 
| INVALID\$1RESALE\$1LEGAL\$1DOCUMENTS | Provide URLs for resale legal documents stored in accessible S3 buckets. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a BuyerLegalTerm. | 

## Update pricing
<a name="update-existing-pricing-terms"></a>

You can use the Catalog API to replace the existing pricing terms completely in AWS Marketplace.

Pricing terms that aren't included in the latest request will be removed from the Resale Authorization. You can update the discounted pricing for your product through this API.

To update pricing details for your Resale Authorizations, call the `StartChangeSet` API operation with the `UpdatePricingTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdatePricingTerms",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "PricingModel": "Contract",
        "Terms":
        [
          {
            "Type": "ResaleUsageBasedPricingTerm",
            "CurrencyCode": "USD",
            "RateCards":
            [
              {
                "RateCard":
                [
                  {
                    "DimensionKey": "m3.large",
                    "Price": "0.10"
                  },
                  {
                    "DimensionKey": "m4.xlarge",
                    "Price": "0.20"
                  }
                ]
              }
            ]
          },
          {
            "Type": "ResaleConfigurableUpfrontPricingTerm",
            "CurrencyCode": "USD",
            "RateCards":
            [
              {
                "Selector":
                {
                  "Type": "Duration",
                  "Value": "P12M"
                },
                "RateCard":
                [
                  {
                    "DimensionKey": "m3.large",
                    "Price": "300"
                  },
                  {
                    "DimensionKey": "m4.xlarge",
                    "Price": "400"
                  }
                ],
                "Constraints":
                {
                  "MultipleDimensionSelection": "Allowed",
                  "QuantityConfiguration": "Allowed"
                }
              }
            ]
          },
          {
            "Type": "ResaleFixedUpfrontPricingTerm",
            "CurrencyCode": "USD",
            "Duration": "P2M",
            "Price": "200.0",
            "Grants":
            [
              {
                "DimensionKey": "Users",
                "MaxQuantity": 10
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePricingTerms` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **PricingModel** (string) (required) – Pricing model for your offer. Possible values for pricing model are:
    + **Usage** – Usage-based pricing model where buyers will be billed for their usage of your product.
    + **Contract** – In the contract-based pricing model, buyers are either billed in advance for the use of your product or offered a flexible payment schedule. Buyers can also pay for additional usage above their contract. Channel partners can add their markup to this payment schedule and pricing for each dimension.
  + **Terms** (array of structures) (required) – List of pricing terms that you want to update. Supported pricing terms are:
    + **ResaleUsageBasedPricingTerm** (object) – Defines a pay-as-you-go (PAYG) pricing model where the customers are charged based on product usage.
      + **Type** (string) (required) – Category of the term.
      + **CurrencyCode** (string) – Defines the currency for prices mentioned in this term. Currently, only USD is supported.
      + **RateCards** (array of structures) – List of rate cards.
        + **RateCard** (array of structures) – A rate card defines the per-unit rates for the product dimensions.
          + **DimensionKey** (string) – Dimension for which the given entitlement applies. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
          + **Price** (string) – Per unit price for the product dimension which is used for calculating the amount to be charged.
        + **Constraints** (object) (optional) – Defines limits on how the term can be configured by acceptors.
          + **MultipleDimensionSelection** (string) (optional) – Determines if buyers are allowed to select multiple dimensions in the rate card. Possible values are `Allowed` and `Disallowed`. Default value is `Allowed`.
          + **QuantityConfiguration** (string) (optional) – Determines if acceptors are allowed to configure quantity for each dimension in rate card. Possible values are `Allowed` and `Disallowed`. Default value is `Allowed`.
    + **ResaleFixedUpfrontPricingTerm** (object) – Defines a pre-paid pricing model where the customers are charged a fixed upfront amount.
      + **Type** (string) (required) – Category of the term being updated.
      + **CurrencyCode** (string) – Defines the currency for prices mentioned in this term. Defines the currency for the prices mentioned in this term. USD, AUD, EUR, GBP, and JPY are supported.
      + **Price** (string) (required) – Fixed amount to be charged to the customer when this term is accepted.
      + **Duration** (string) (required) – Contract duration of the ResaleAuthorization. This field supports the ISO 8601 format.
      + **Grants** (array of structures) (required) – Entitlements that will be granted to the acceptor of fixed upfront pricing as part of agreement execution.
        + **DimensionKey** (string) (required) – Unique dimension key defined in the product document. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
        + **MaxQuantity** (integer) (required) – Maximum amount of capacity that the buyer can be entitled to the given dimension of the product. If MaxQuantity is not provided, the buyer will be able to use an unlimited amount of the given dimension.

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The following schema validations are specific to `UpdatePricingTerms` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| Terms |  Required Must not be null or empty Each term must present only single time Allowed terms: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-resale-authorizations.html)  | 
| Terms[].ResaleUsageBasedPricingTerm.CurrencyCode |  Required  Allowed values: USD  | 
| Terms[].ResaleUsageBasedPricingTerm.Validity |  Required Must not be null or empty Expected format: ISO 8601 duration  | 
| Terms[].ResaleUsageBasedPricingTerm.RateCards |  Required Must not be null or empty  | 
| Terms[].ResaleUsageBasedPricingTerm.RateCards[].DimensionKey |  Required Must not be null or empty  Length must be between 1 and 60  | 
| Terms[].ResaleUsageBasedPricingTerm.RateCards[].Price |  Required Must not be null or empty  Data type is "String"  Must be non-negative  Support up to 8 Decimal No special characters supported  | 
| Terms[].ResaleConfigurableUpfrontPricingTerm.CurrencyCode |  Required  Allowed values: ["USD", "AUD", "EUR", "GBP", "JPN"]  | 
|  Terms[].ResaleConfigurableUpfrontPricingTerm.RateCards[].Selector.Type  |  Required Must not be null or empty  Allowed values: Duration  | 
|  Terms[].ResaleConfigurableUpfrontPricingTerm.RateCards[].Selector.Value  |  Required Must not be null or empty Expected format: ISO 8601 duration  | 
|  Terms[].ResaleConfigurableUpfrontPricingTerm.RateCards[].RateCard.DimensionKey  |  Required Must not be null or empty  Length must be between 1 and 60  | 
|  Terms[].ResaleConfigurableUpfrontPricingTerm.RateCards[].RateCard.Price  |  Required Must not be null or empty  Data type is "String"  Must be non-negative  Support up to 6 Decimal No special characters supported  | 
|  Terms[].ResaleConfigurableUpfrontPricingTerm.RateCards[].Constraints  | Optional | 
| Terms[].ResaleFixedUpfrontPricingTerm.CurrencyCode | Required Allowed values: ["USD", "AUD", "EUR", "GBP", "JPN"] | 
| Terms[].ResaleFixedUpfrontPricingTerm.Price |  Required Must not be null or empty  Data type is "String"  Must be non-negative  Support up to 6 Decimal No special characters supported  Allowed values: 0.0  | 
| Terms[].ResaleFixedUpfrontPricingTerm.Duration |  Required Must not be null or empty Expected format: ISO 8601 duration  | 
| Terms[].ResaleFixedUpfrontPricingTerm.Grants[].DimensionKey |  Required Must not be null or empty  Length must be between 1 and 60  | 
| Terms[].ResaleFixedUpfrontPricingTerm.Grants[].MaxQuantty |  Required Must not be null or empty  | 
| An unknown property | No additional properties are allowed | 

**Asynchronous Errors**

The following errors are specific to `UpdatePricingTerms` 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\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INCOMPATIBLE\$1PRODUCT | Use existing, available dimensions in the product in [x]. | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide rate card with a unique list of dimension keys in [x] | 
| INVALID\$1RATE\$1CARD | Provide dimensions that have the same unit in [x] | 
| INVALID\$1RATE\$1CARD | Provide a rate card for only metered dimensions in ResaleUsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | Provide usage based rates for all available metered dimensions in ResaleUsageBasedPricingTerm. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in ResaleUsageBasedPricingTerm. | 
| DUPLICATE\$1SELECTORS | Provide a unique list of Selectors in ResaleConfigurableUpfrontPricingTerm. | 
| INVALID\$1RATE\$1CARD | ConfigurableUpfrontPricingTerm is missing one or more dimension keys for duration [x]. Provide prices for the same set of dimension keys for all durations. | 
| INVALID\$1RATE\$1CARD | Provide either all metered or all entitled dimensions in [x]. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set MultipleDimensionSelection and QuantityConfiguration to Disallowed in ResaleConfigurableUpfrontPricingTerm for the PricingModel. | 
| TOO\$1MANY\$1RATE\$1CARDS | Only one rate card in ConfigurableUpfrontPricingTerm is allowed for the product. | 
| INCOMPATIBLE\$1TERMS | The following terms aren't compatible with the PricingModel: [x,y,z]. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in [x term]. | 
| TOO\$1MANY\$1GRANTS | Provide up to [N] grants in [x term]. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide duration between [x] and [y] months in ResaleConfigurableUpfront | 
| TOO\$1MANY\$1GRANTS | Provide duration between [x] and [y] months. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Ensure duration granularity is at the day level for metered dimensions in ResaleConfigurableUpfront | 
| INVALID\$1DURATION | Ensure duration granularity is at the day level for metered dimensions in FixedUpfront. | 
| INVALID\$1RATE\$1CARD | Provide only entitled dimensions in [x]. | 
| MISSING\$1DURATION | Provide a Duration in [x]. | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide Grants with a unique list of dimension keys in [x]. | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 

## Update payment schedule
<a name="update-payment-schedule-details"></a>

You can use the Catalog API to change payment-associated details, such as a flexible payment schedule, in AWS Marketplace.

To update payment-associated details for your Resale Authorization, call the `StartChangeSet` API operation with the `UpdatePaymentScheduleTerms` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdatePaymentScheduleTerms",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "Terms":
        [
          {
            "Type": "ResalePaymentScheduleTerm",
            "CurrencyCode": "USD",
            "Schedule":
            [
              {
                "ChargeDate": "2021-12-01",
                "ChargeAmount": "200.00"
              },
              {
                "ChargeDate": "2022-03-01",
                "ChargeAmount": "250.00"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePaymentScheduleTerms` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request.
  + **Terms** (array of structures) – List of payment terms that you want to update. Supported payment terms are:
    + **ResalePaymentScheduleTerm** (object) – Defines an installment-based pricing model where the customers are charged a fixed price on different dates during the agreement validity period.
      + **Type** (string) – Category of the term being updated.
      + **CurrencyCode** (string) (required) – Defines the currency for the payment mentioned in the schedule. USD, AUD, EUR, GBP, and JPY are supported.
      + **Schedule** (array of structures) – List of the payment schedule where each element defines one installment of payment. It contains the information necessary for calculating the price to be paid and the date on which the customer would be charged.
        + **ChargeDate** (string) (required) – The date the customer would pay the price defined in this payment schedule term. This field supports the ISO 8601 format.
        + **ChargeAmount** (string) (required) – The price the customer would pay on a scheduled date (ChargeDate).

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The schema validations are specific to `UpdatePaymentScheduleTerms` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP | 
| --- | --- | --- | 
| Terms.Type |  Required Not supported for [x] product  Allowed terms: ResalePaymentScheduleTerm  | 422 | 
| Terms[].CurrencyCode |  Required Allowed values: USD  | 422 | 
| Terms[].ResalePaymentScheduleTerm.Schedule |  Required Length must be between 1 and 60  | 422 | 
| Terms[].ResalePaymentScheduleTerm.Shedule.ChargeDate |  Required Must be in ISO 8601 format Date must be in the future  | 422 | 
| Terms[].ResalePaymentScheduleTerm.Shedule.ChargeAmount |  Required Must be non-negative  | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdatePaymentScheduleTerms` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. or 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\$1TERMS | OffersMaxQuantity and AvailabilityEndDate must be present with ResalePaymentScheduleTerm.  | 
| TOO\$1MANY\$1SCHEDULED\$1PAYMENTS | Provide up to 60 scheduled payments in ResalePaymentScheduleTerm. | 
| DUPLICATE\$1CHARGE\$1DATES | Provide unique charge dates in ResalePaymentScheduleTerm. | 
| INVALID\$1CHARGE\$1DATES | Provide a future ChargeDate.  | 
| INVALID\$1CHARGE\$1DATES | Provide a last charge date that is before [x]. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a ResaleFixedUpfrontPricingTerm and ResalePaymentScheduleTerm together. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 

## Update Resale Authorization details
<a name="update-resale-auth-information"></a>

You can use the Catalog API to update Resale Authorization details in AWS Marketplace.

To update Resale Authorization details, call the `StartChangeSet` API operation with the `UpdateInformation` change type, as shown in the following example. 

**Note**  
The `UpdateInformation` change type only updates the sections provided in the request; all other information remains unchanged.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "UpdateInformation",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument":
      {
        "Name": "TestResaleAuthorization",
        "Description": "Worldwide ResaleAuthorization for Test Product",
        "PreExistingBuyerAgreement":
        {
          "AcquisitionChannel": "AwsMarketplace",
          "PricingModel": "Contract"
        }
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateInformation` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Details of the request, including the information you want to update information for the Resale Authorization.
  + **Name** (string) (optional) – The name associated with the ResaleAuthorization for better readability to you and your channel partners.
  + **Description** (string) (optional) – The description is free-form text where you can add details about the ResaleAuthorization.
  + **PreExistingBuyerAgreement** (object) (optional) – Determines if this offer is a renewal for an existing agreement with an existing customer for the same underlying product. The existing agreement can be within or outside AWS Marketplace. AWS may audit and verify your offer is a renewal. If AWS is unable to verify your offer, then AWS may revoke the offer and entitlements from your customer.
    + **AcquisitionChannel** (string) (required) – Indicates if the existing buyer agreement was signed outside AWS Marketplace or in AWS Marketplace.

      Possible values: `External`, `AwsMarketplace`
    + **PricingModel** (string) (required) **–** Indicates which pricing model the exiting agreement uses.

      Possible values: `Contract`, `Usage`, `BYOL`, `Free`

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateInformation` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`, and the request will fail with an HTTP error if the input does not meet the following requirements.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Name |  Optional Must not be null or empty Length must be between 1 and 100 characters  Pattern ^[A-Za-z0-9]\$1\$1 No special character or white space allowed  | 422 | 
| Description |  Optional Length must be between 1 and 255 characters  Pattern ^[A-Za-z0-9\$1\$1s]\$1\$1 No special characters allowed  | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

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. or 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\$1BUYER\$1TARGETING | At least one Buyer account must be present for ResaleAuthorization with PreExistingBuyerAgreement. | 

## Restrict a Resale Authorization
<a name="restricte-resale-auth"></a>

You can use the Catalog API to set restrict rules to a Resale Authorization in AWS Marketplace.

A restricted Resale Authorization can no longer be used by a channel partner to create a private offer. An existing private offer won’t be impacted.

To restrict your Resale Authorization, call the `StartChangeSet` API operation with the `RestrictResaleAuthorization` change type, as shown in the following example. 

**Important**  
This is a non-reversible operation. After the Resale Authorization is marked as `Restricted`, it can’t be in an `Active` state again.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "RestrictResaleAuthorization",
      "Entity": {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `RestrictResaleAuthorization` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request. It must be an empty object for `RestrictResaleAuthorization`.

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The schema validations are specific to `RestrictResaleAuthorization` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| DetailsDocument | Must be empty | 422 | 
| RestrictResaleAuthorization |  Expired ResaleAuthorization can't be marked as `Restricted`  | 422 | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `RestrictResaleAuthorization` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. or 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\$1STATUS | Expired ResaleAuthorization can't be marked as restricted.  | 

## Release a Resale Authorization and make it visible to a Channel Partner
<a name="release-resale-auth"></a>

You can use the Catalog API to initiate your `ResaleAuthorization` to an `Active` state.

 `ReleaseResaleAuthorization` makes your Resale Authorization active so that a Channel Partner can use your Resale Authorization to create private offers.

To release your Resale Authorization, call the `StartChangeSet` API operation with the `ReleaseResaleAuthorization` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet":
  [
    {
      "ChangeType": "ReleaseResaleAuthorization",
      "Entity":
      {
        "Type": "ResaleAuthorization@1.0",
        "Identifier": "resaleauthz-123456789"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `ReleaseResaleAuthorization` change type:
+ **Entity** (object) (required) – Your Resale Authorization. 
  + **Type** (string) (required) – The `Type` is always `ResaleAuthorization@1.0`. 
  + **Identifier** (string) (required) – Your Resale Authorization ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – Specifics of the request. It must be empty for `ReleaseResaleAuthorization`.

**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 anywhere from a few minutes to a few hours.

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.

**Synchronous Validations**

The schema validations are specific to `ReleaseResaleAuthorization` actions in the AWS Marketplace Catalog API. The validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| An unknown property | No additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `ReleaseResaleAuthorization` actions in the AWS Marketplace Catalog API. These errors are returned when you call `DescribeChangeSet` after a change set is processing. For more details 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\$1MANDATORY\$1TERMS | Provide a BuyerLegalTerm. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a PricingTerm. | 
| INCOMPATIBLE\$1PRODUCT | Use an active product in limited or public state. | 
| INCOMPATIBLE\$1PRICING\$1TERM | PaymentScheduleTerm and FixedUpfrontPricingTerm must be present together. | 
| INCOMPATIBLE\$1BUYER\$1TARGETING | At least one Buyer account must be present for ResaleAuthorization with PreExistingBuyerAgreement. | 
| MISSING\$1MANDATORY\$1TERMS | Provide at least one of [x,y,z]. | 
| INCOMPATIBLE\$1STATUS | [x] request can't be performed after the resale authorization is released. | 

## Describe an existing Resale Authorization
<a name="describe-entity-resale-auth"></a>

To describe Resale Authorization details, call the `DescribeEntity` API operation with the `ResaleAuthorization@1.0` entity type, as shown in the following example.

**Request Syntax**

```
GET /DescribeEntity?catalog=<Catalog>&entityId=<EntityId> HTTP/1.1
```

Provide information for the fields to add the `DescribeEntity` change type:
+ **catalog** (string) – The catalog related to the request. Fixed value: `AWSMarketplace`.
+ **entityId** (string) – The unique ID of the `ResaleAuthorization` to describe.

**Response Syntax**

The response to this request gives you the offer details and looks like the following.

```
{
  "EntityType": "ResaleAuthorization@1.0",
  "EntityIdentifier": "resaleauthz-123456789",
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:111122223333:AWSMarketplace/ResaleAuthorization/resaleauthz-123456789",
  "LastModifiedDate": "2021-03-10T21:57:16Z",
  "DetailsDocument": {
    "Name": "TestResaleAuthorization",
    "Description": "ResaleAuthorization for Test Product",
    "ProductId": "prod-ad8EXAMPLE51",
    "ProductName": "TestProduct",
    "Status": "Active", /*Draft, Active, Restricted*/
    "PreExistingBuyerAgreement": {
      "AcquisitionChannel": "Unknown",
      "PricingModel": "Unknown"
    },
    "CreatedDate": "2023-07-18T16:39:31.335Z",
    "ManufacturerLegalName": "ChannelCAPI.Inc",
    "ManufacturerAccountId": "123456789012",
    "Dimensions": [
      {
        "Name": "Protected Resources",
        "Description": "Additional 100 protected resources",
        "Key": "hundredresources",
        "Unit": "Units",
        "Types": [
          "Entitled"
        ]
      }
    ],
    "OfferDetails": {
      "OfferExtendedStatus": "Not Started", /* Not Started, Completed-Used, Completed-Usable*/
      "OfferCreatedCount": 0
    },
    "Terms": [
      {
        "Type": "ResaleUsageBasedPricingTerm",
        "Id": "term_id_placeholder",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "RateCard": [
              {
                "DimensionKey": "resource_number",
                "Price": "0.05"
              },
              {
                "DimensionKey": "scanned_data",
                "Price": "0.05"
              }
            ]
          }
        ]
      },
      {
        "Type": "ResaleConfigurableUpfrontPricingTerm",
        "Id": "term_id_placeholder",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "Selector": {
              "Type": "Duration",
              "Value": "P24M"
            },
            "RateCard": [
              {
                "DimensionKey": "hundredresources",
                "Price": "0.04"
              },
              {
                "DimensionKey": "tenTBData",
                "Price": "0.03"
              },
              {
                "DimensionKey": "channel_custom",
                "Price": "0.02"
              }
            ],
            "Constraints": {
              "MultipleDimensionSelection": "Allowed",
              "QuantityConfiguration": "Allowed"
            }
          }
        ]
      },
      {
        "Type": "ResaleFixedUpfrontPricingTerm",
        "Id": "term-sdh27fb2",
        "CurrencyCode": "USD",
        "Duration": "P180D",
        "Price": "0.0",
        "Grants": [
          {
            "DimensionKey": "sdf73rbns93nl120d10xm1",
            "MaxQuantity": 1
          }
        ]
      },
      {
        "Type": "ResalePaymentScheduleTerm",
        "Id": "term-sdh27fb2",
        "CurrencyCode": "USD",
        "Schedule": [
          {
            "ChargeDate": "2018-07-01T00:00:00.000Z",
            "ChargeAmount": "200.00"
          },
          {
            "ChargeDate": "2019-05-01T00:00:00.000Z",
            "ChargeAmount": "200.00"
          }
        ]
      },
      {
        "Type": "BuyerLegalTerm",
        "Id": "term_id_placeholder",
        "Documents": [
          {
            "Type": "StandardEula",
            "Url": "https://resale-auth-legal-terms-iad-beta.s3.us-east-1.amazonaws.com/09ae57d6-c75a-3a4c-aadf-9b866bae64ab/a85cace8-6d9d-40ca-a053-78fc265479bf?isSigned=yes"
          }
        ]
      },
      {
        "Type": "ResaleLegalTerm",
        "Id": "term_id_placeholder",
        "Documents": [
          {
            "Type": "StandardResellerContract",
            "Url": "https://resale-auth-legal-terms-iad-beta.s3.us-east-1.amazonaws.com/09ae57d6-c75a-3a4c-aadf-9b866bae64ab/bed55b56-7ab4-4c4c-b633-3bf4f6efcb98?isSigned=yes"
          }
        ]
      },
      {
        "Type": "BuyerValidityTerm",
        "Id": "term_id_placeholder",
        "MaximumAgreementStartDate": "2023-09-25T23:59:59.000Z"
      },
      {
        "Type": "BuyerTargetingTerm",
        "Id": "term_id_placeholder",
        "PositiveTargeting": {
          "BuyerAccounts": [
            {
              "AwsAccountId": "444455556666"
            }
          ]
        }
      }
    ],
    "Rules": [
      {
        "Type": "AvailabilityRule",
        "Id": "availability_rule_id_placeholder",
        /* If the AvailabilityEndDate and OffersMaxQuantity not present Usage will be Unlimited*/
        "Usage": "Limited",
        "AvailabilityEndDate": "2022-05-31T23:59:59Z",
        "OffersMaxQuantity": 1
      },
      {
        "Type": "PartnerTargetingRule",
        "Id": "partner_targeting_rule_id_placeholder",
        "ResellerAccountId": "777777777777",
        "ResellerLegalName": "ChannelCAPICP.Inc"
      }
    ]
  }
}
```

The following is information about the fields you see in the `DescribeEntity` response.
+ **EntityType** (string) – The named type of the entity, which is ResaleAuthorization@1.0.
+ **EntityIdentifier** (string) – The identifier of the entity, in the format of EntityId@RevisionId.
+ **EntityArn** (string) – The ARN associated to the unique identifier for the change set referenced in this request.
+ **LastModifiedDate** (string) – The last modified date of the entity, in ISO 8601 format (2018-02-27T13:45:22Z).
+ **DetailsDocument** (object) (required) – This JSON string includes the details of the entity.
  + **Name** (string) – Name associated with the ResaleAuthorization for better readability to you and your Channel Partners. It’s displayed as part of the Agreement information.
  + **Description** (string) – Description is a free-form text which is meant to be used only by you and will never be exposed to buyers.
  + **ProductId** (string) – Description is a free-form text which is meant to be used only by you and will never be exposed to buyers.
  + **AgreementToken** (string) – Generated from content in ResaleAuthorization. It contains information about terms, rules, and proposer while creating an agreement. It's used for authorization checks and validations during procurement.
  + **Terms** (array of structures) – List of terms presented for acceptance.
  + **Rules** (array of structures) – List of rules or set of instructions.

# Work with channel partner private offers using the AWS Marketplace APIs
<a name="work-with-cppos"></a>

You can use the AWS Marketplace Catalog API to automate tasks for working with channel partner private offers (CPPOs). 

When you create or update a CPPO, the draft offer will contain the terms and rules from a Resale Authorization and will be invisible to the buyer. It’s possible, but not required, to involve multiple personas in your organization to create a private offer. 

For example, one persona can be responsible for updating prices while a second persona can be responsible for updating the payment schedule. Then, a third persona can be responsible for updating legal terms. You can give a persona permission to update certain parts of an offer. However, you can give only read permissions to Resale Authorizations.

As a prerequisite for calling change types, you must have received one or more Resale Authorizations and be familiar working with AWS Marketplace Catalog API.

For more information, see [ Channel partner private offers](https://docs.aws.amazon.com/marketplace/latest/userguide/channel-partner-offers.html) in the *AWS Marketplace Seller Guide*.

The following topics describe how to use the Catalog API to create and update CPPOs:

**Topics**
+ [CPPO prerequisites](#cppo-prerequisites)
+ [Create a CPPO](#create-offer-using-resale-auth)
+ [Create a channel partner private replacement offer](#create-replacement-offer-using-resale-auth)
+ [Update markup](#update-markup)
+ [Update targeting configuration](#update-targeting-cppo)
+ [Update legal resources](#update-legal-terms-cppo)
+ [Update the discoverability of the CPPO](#update-availability-cppo)
+ [Define the expiration date of agreements](#update-validity-terms-cppo)
+ [Update pricing](#update-pricing-terms-cppo)
+ [Update payment schedule details](#update-payment-schedule-terms-cppo)
+ [Publish the CPPO](#release-offer-cppo)
+ [Define an existing CPPO](#describe-entity-cppo)

## CPPO prerequisites
<a name="cppo-prerequisites"></a>

Service-linked role for ResaleAuthorization (SLR) setup is a mandatory pre-requisite to use resale authorization to create a CPPO. To use Resale Authorization, both independent software vendors (ISVs) and AWS Marketplace Channel Partners must create a service-linked role that provides resource-sharing permissions to AWS. If both groups don’t perform this prerequisite, AWS can’t share the authorization resource from the ISV to the AWS Marketplace Channel Partner. For more information, see [Using roles for Resale Authorization for AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/using-roles-for-resale-authorization.html) in the *AWS Marketplace Seller Guide*.

## Create a CPPO
<a name="create-offer-using-resale-auth"></a>

You use a Resale Authorization targeted to you to create a channel partner private offer (CPPO) in `Draft` state in AWS Marketplace. 

If your request is processed successfully, AWS Marketplace Catalog API generates an offer in `Draft` state for you with Resale Authorization terms. You can use `DescribeEntity` to see the terms applied to the draft offer from Resale Authorization. This is an incomplete offer and not visible to buyers in AWS Marketplace. You then use change types associated with the CPPO to complete the offer.

After the offer is completed, you use the `ReleaseOffer` change type to complete the offer creation process and release the offer. This will validate the entire offer and make your offer visible to buyers in AWS Marketplace.

To create a channel partner private offer, call the `StartChangeSet` API operation with the `CreateOfferUsingResaleAuthorization` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateOfferUsingResaleAuthorization",
      "Entity": {
        "Type": "Offer@1.0"
      },
      "DetailsDocument": {
        "ResaleAuthorizationId": "resaleauthz-123456789",
        "Name": "Test Offer",
        "OfferSetId": "offerset-b3f9EXAMPLE27"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateOfferUsingResaleAuthorization` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **ResaleAuthorizationId** (string) (required) – The unique identifier that includes product, terms, and rules that are being offered. Channel partners can add additional terms and rules using update change types. ResaleAuthorization must be available and targeted to you as a partner.
  + **Name** (string) (optional) – The name associated with the offer for better readability. It is displayed as a part of the agreement information.
  + **OfferSetId** (string) (optional) – The ID of the offer set to associate this offer with. Only specify this field when creating an offer that will be part of an offer set. If OfferSetId is not provided, an individual offer will be created that can be purchased standalone. Note that specifying an OfferSetId during offer creation only indicates your intent to associate the offer with that offer set. To complete the association, you must [use the AssociateOffers change type](work-with-offer-sets.md#associate-offers) after the offer is created.

**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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

The response to this request gives you the status of the request. If the status is `SUCCEEDED`, then a new `OfferId` is generated.

```
{
  "ChangeSetId": "example123456789012abcdef",
  "ChangeSetArn": "arn:aws:aws-marketplace:us-east-1:123456789012:AWSMarketplace/ChangeSet/example123456789012abcdef",
  "ChangeSetName": "Submitted by 123456789012",
  "StartTime": "2021-05-27T22:21:26Z",
  "EndTime": "2021-05-27T22:32:19Z",
  "Status": "SUCCEEDED",
  "ChangeSet": [
    {
      "ChangeType": "CreateOfferUsingResaleAuthorization",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "ResaleAuthorizationId": "resaleauthz-123456789",
        "Name": "Test Offer"
      },
      "ErrorDetailList": []
    }
  ]
}
```

You can use the `GET` `DescribeEntity` request to describe the draft offer rules and terms created from `ResaleAuthorization` in the AWS Marketplace Catalog API Reference. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html).

**Terms and rules from ResaleAuthorization**
+ **LegalTerms** – Provisions describing legal terms, such as the EULA in the ResaleAuthorization will be added to the draft offer. You can add legal terms using the `UpdateLegalTerms` change type. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-legal-terms-cppo](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-legal-terms-cppo).
+ **PricingTerms** – All the pricing terms (`ConfigurableUpfrontPricingTerm`, `FixedUpfrontPricingTerm`, `UsageBasedPricingTerm`, `PaymentScheduleTerms`) described by the Manufacturer in the ResaleAuthorization will be added to the draft offer. You can choose to increase the pricing (for each dimension) for your targeted buyers using the `UpdateMarkup` change type. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-markup](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-markup) in this guide.
+ **PaymentTerms** – If the manufacturer has defined the Future Payment Schedule in the ResaleAuthorization, then you will be able to see the payment terms in the draft offer. You can choose to increase the payment schedule amount for your targeted buyers using the `UpdateMarkup` change type. If you want to set the payment schedule for your buyers, you can use `UpdatePaymentScheduleTerms`. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-payment-schedule-terms-cppo](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-payment-schedule-terms-cppo).
+ **TargetingRule** – If the ResaleAuthorization is targeted to specific buyers, then channel partners can give private offers to a subset of buyers using PositiveTargeting. By default, the rule will include all the buyers from ResaleAuthorization. You can select specific buyers and update the draft offer using the `UpdateTargeting` change type. For more information, see [https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-targeting-cppo](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/cppos.html#update-targeting-cppo).

```
{
  "EntityType": "Offer@1.0",
  "EntityIdentifier": "offer-a5EXAMPLEwzpu@1",
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:444555666777:AWSMarketplace/Offer/offer-a5oEXAMPLEzpu",
  "LastModifiedDate": "2021-03-10T21:57:16Z",
  "DetailsDocument": {
    "Id": "offer-3rb23tu92rn",
    "Name": "Test Offer",
    "Description": "Worldwide private offer for Test Product",
    "ProductId": "prod-0bc848d78b51",
    "ResaleAuthorizationId": "resaleauthz-123456789",
    "Terms": [
      {
        "Type": "LegalTerm",
        "Documents": [
          {
            "Type": "CustomEula",
            "Url": "https://s3.amazonaws.com/EULA/custom-eula-1234.txt"
          }
        ]
      },
      {
        "Type": "ConfigurableUpfrontPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "Selector": {
              "Type": "Duration",
              "Value": "P12M"
            },
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "300.00"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "400.00"
              }
            ],
            "Constraints": {
              "MultipleDimensionSelection": "Allowed",
              "QuantityConfiguration": "Allowed"
            }
          }
        ]
      },
      {
        "Type": "UsageBasedPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "0.10"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "0.20"
              }
            ]
          }
        ]
      },
      {
        "Type": "PaymentScheduleTerm",
        "CurrencyCode": "USD",
        "Schedule": [
          {
            "ChargeDate": "2020-12-01T00:00:00.000Z",
            "ChargeAmount": "1000.00"
          },
          {
            "ChargeDate": "2021-06-15T00:00:00.000Z",
            "ChargeAmount": "1250.00"
          }
        ]
      }
    ],
    "Rules": [
      {
        "Type": "TargetingRule",
        "PositiveTargeting": {
          "BuyerAccounts": [
            "111222333444"
          ]
        }
      }
    ]
  }
}
```

**Synchronous Validations**

The following schema validations are specific to `CreateOfferUsingResaleAuthorization` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Name |  Required Length must be between 1 and 150 characters  | 422 | 
| Description |  Required Length must be between 1 and 255 characters  | 422 | 
| ResaleAuthorizationId |  Required Length must be between 1 and 50 characters  | 422 | 
| ResaleAuthorizationId | ResaleAuthorization must be targeted to the channel partner. | 422 | 
| ResaleAuthorizationId | ResaleAuthorization must be active | 422 | 
| Channel Partner | Channel Partner must be paid seller in AWS Marketplace | 422 | 

**Asynchronous Errors**

The following errors are specific to `CreateOfferUsingResaleAuthorization` 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\$1RESALE\$1AUTHORIZATION | Use a ResaleAuthorization in active state. | 
| INCOMPATIBLE\$1PRODUCT | OfferSetId isn't supported in offers for the product. | 

## Create a channel partner private replacement offer
<a name="create-replacement-offer-using-resale-auth"></a>

You can use the Catalog API to create a channel partner private replacement offer in AWS Marketplace.

You use the `ResaleAuthorization` targeted to you and an Agreement of which you are the proposer to create a channel partner private replacement offer in `Draft` state in the Catalog API by calling `StartChangeSet` with the `CreateReplacementOfferUsingResaleAuthorization` change type, as shown in the following example. Replacement offers can be used to replace an agreement from a previous offer before it ends.

`CreateReplacementOfferUsingResaleAuthorization` will create a draft offer with the agreement acceptor in targeting. This targeting cannot be changed afterwards. The draft offer will also contain the source offer id of the agreement.

To create a channel partner private replacement offer, call the `StartChangeSet` API operation with the `CreateReplacementOfferUsingResaleAuthorization` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "CreateReplacementOfferUsingResaleAuthorization",
      "Entity": {
        "Type": "Offer@1.0"
      },
      "DetailsDocument": {
        "ResaleAuthorizationId": "2bd2c761-3b7f-3771-a9a7-e8ad36517698",
        "Name": "CAPI-saas-abo-contract-fps",
        "AgreementId": "agmt-f2ooEXAMLEamtm7mjj0j59gu"
      }
    }
  ]
}
```

Provide information for the fields to add the `CreateReplacementOfferUsingResaleAuthorization` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **ResaleAuthorizationId** (string) (required) – `ResaleAuthorizationId` is the unique identifier which includes product, terms and rules are being offered. Channel partners can add additional terms and rules using Update change types.

    `ResaleAuthorization` must be available and targeted to you as a partner.
  + **Name** (string) (optional) – `Name` associated with the offer for better readability to you and your customers. It will be displayed as part of Agreement information as well.
  + **AgreementId** (string) (required) – `AgreementId` is the unique identifier of the agreement created when the targeted buyer accepted the previous offer you are trying to replace

**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](https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html)` API operation.

**Synchronous Validations**

The following schema validations are specific to `CreateReplacementOfferUsingResaleAuthorization` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| Name | Length must be between 1 and 150 characters | 
| AgreementId |  Provided agreement must be active Provided agreement must exist Provided agreement must be owned by Channel Partner  | 
| ResaleAuthorizationId |  Required Length must be between 1 and 50 characters  | 
| ResaleAuthorizationId | ResaleAuthorization must be targeted to the channel partner. | 
| ResaleAuthorizationId | ResaleAuthorization must be active | 
| Channel Partner | Channel Partner must be paid seller in AWS Marketplace | 

**Asynchronous Errors**

The following errors are specific to `CreateReplacementOfferUsingResaleAuthorization` 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\$1RESALE\$1AUTHORIZATION | Use a ResaleAuthorization in active state. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | The ResaleAuthorization must be for the same product that is associated with the agreement. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Use a ResaleAuthorization targeted to the acceptor of the agreement. | 

## Update markup
<a name="update-markup"></a>

You can use the Catalog API to update pricing terms by a percentage value in your offer in AWS Marketplace.

This will apply the given percentage markup on all pricing terms and payment terms (for future payment schedules) that are defined by the manufacturer in the ResaleAuthorization. Any existing markup will be overwritten. You can view updated pricing and payment terms using `DescribeEntity`.

To update markup, call the `StartChangeSet` API operation with the `UpdateMarkup` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateMarkup",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Percentage": "5.0"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateMarkup` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Percentage** (string) (required) – Percentage value will be added to the manufacturer pricing or payment terms.

**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 with the AWS Marketplace Seller Operations team to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateMarkup` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| Percentage |  Required Data type is "String"  Must be non-negative  Allow up to 9 decimals  | 

**Asynchronous Errors**

The following errors are specific to `UpdateMarkup` 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\$1MARKUP | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | MarkupPercentage can't be updated when PaymentScheduleTerm or FixedUpfrontPricingTerm are present in offer and not present in ResaleAuthorization. | 
| INCOMPATIBLE\$1TERMS | Use either UpdatePaymentScheduleTerms with specific payment amount or UpdateMarkup with a single markup percentage for the scheduled dates. | 
| INVALID\$1MARKUP\$1PERCENTAGE | UpdateMarkup can only be invoked for offers created using ResaleAuthorization. | 

## Update targeting configuration
<a name="update-targeting-cppo"></a>

You can use the Catalog API to replace the existing targeting configuration completely in AWS Marketplace.

Any existing targeting options that are not included in the latest request will be removed from the offer. Manufacturers can mention specific targeted buyers in `ResaleAuthorization`. Channel partners can give private offers to a subset of buyers using `PositiveTargeting` in the `UpdateTargeting` change type.

To update targeting configurations of your offer, call the `StartChangeSet` API operation with the `UpdateTargeting` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateTargeting",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "PositiveTargeting": {
          "CountryCodes": [
            "US",
            "CA"
          ],
          "BuyerAccounts": [
            "111222333444"
          ]
        },
        "NegativeTargeting": {
          "CountryCodes": [
            "XX"
          ]
        }
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateTargeting` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **PositiveTargeting** (object) (optional) – Positive targeting defines the criteria which any buyer's profile should fulfill in order to be allowed to access the offer. This field is optional, but at least one targeting option should be provided when this field is present.
    + **CountryCodes** (array of strings) (optional) – List as option for allowing targeting based on country. If the intention isn’t to target the offer to a country, this field should be omitted. If it’s present, the list must contain at least one country code. Each element in this list should be a valid 2-letter country code, using this format: ISO 3166-1 alpha-2.
    + **BuyerAccounts** (array of strings) (optional) – List as an option to allow targeting based on AWS accounts (also known as, Private Offer). If the intention is to not target the offer to an AWS account, this field should be omitted.
  + **NegativeTargeting** (object) (optional) – Negative targeting defines the criteria which any customer's profile should fulfill to be restricted to access the offer. Although this field is optional, at least one targeting option should be provided when this field is present.
    + **CountryCodes** (array of strings) (required) – List as option for allowing targeting based on country. If the intention isn’t to target the offer to a specific country, then this field should be omitted. If it’s present, the list must contain at least one country code. Each element in this list should be a valid 2-letter country code using this format: ISO 3166-1 alpha-2.

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateTargeting` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
|  Details  |  Required  | 422 | 
|  PositiveTargeting |  Optional  | 422 | 
| NegativeTargeting |  Optional  | 422 | 
| PositiveTargeting.CountryCodes |  Optional Country codes must be valid (ISO 3166-1 alpha-2)  | 422 | 
| PositiveTargeting.BuyerAccounts |  Optional AWS account IDs must be in valid format (12-digit number) Must not contain more than 25 accounts  | 422 | 
| NegativeTargeting.CountryCodes |  Optional Country codes must be valid (ISO 3166-1 alpha-2)  | 422 | 
| NegativeTargeting.BuyerAccounts | Must not be provided (negative targeting on BuyerAccounts isn’t supported) | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateTargeting` 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\$1BUYER\$1ACCOUNTS | Provide valid buyer accounts. Invalid accounts: [x]. | 
| INVALID\$1COUNTRY\$1CODES | Provide supported country codes. | 
| INVALID\$1TARGETING | Use either negative or positive targeting on the same attribute. | 
| INCOMPATIBLE\$1PRODUCT | Country-based targeting isn't supported for the product. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide BuyerAccounts that are compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1TARGETING | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TARGETING | The requested change can't be performed after the offer is expired. | 
| INCOMPATIBLE\$1TARGETING | Targeting can't be updated on a replacement offer. If the buyer isn't associated with the provided AgreementId, then create a new private offer by providing an AgreementId associated with the buyer. | 
| TOO\$1MANY\$1BUYER\$1ACCOUNTS | Provide BuyerAccounts within the allowed limits. | 

## Update legal resources
<a name="update-legal-terms-cppo"></a>

You can use the Catalog API to merge the Resale Authorization legal terms and replace the existing legal terms completely in AWS Marketplace.

This change doesn’t affect existing agreements. The legal terms that aren't included in the latest request will be removed from the offer. You can view the merged legal terms by calling `DescribeEntity`.

To update legal terms of your offer, call the `StartChangeSet` API operation with the `UpdateLegalTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateLegalTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "LegalTerm",
            "Documents": [
              {
                "Type": "CustomEula",
                "Url": "https://s3.amazonaws.com/EULA/custom-eula-1234.txt"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateLegalTerms` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) (required) – List of legal terms that you want to update. Supported legal terms are:
  + **LegalTerm** (object) (required) – Defines the list of text agreements to be proposed to the acceptors. One example of such an agreement is the end user license agreement (EULA).
    + **Type** (string) (required) – Category of term being updated.
    + **Documents** (array of structures) (required) – List of references to legal resources to be proposed to the buyers. One example of such a resource is the end user license agreement (EULA). Each reference is made up of a Type and a URL:
      + **Type** (string) (required) – Type of document. Available document types are:
        + **CustomEula** – A custom EULA provided by you as seller. A URL for a EULA stored in an accessible S3 bucket is required for this document type.
        + **StandardEula** – Standard Contract For AWS Marketplace (SCMP). For more information about SCMP, see the AWS Marketplace Seller Guide. You don’t provide a URL for this type because it is managed by AWS Marketplace.
      + **Url** (string) (conditionally required) – A URL to the legal document for buyers to read. Required when `Type` is one of the following [`CustomEula`].
      + **Version** (string) (conditionally required) – A version of standard contracts provided by AWS Marketplace. This is required when `Type` is `StandardEula`. Available versions are:
        + **2022-07-14** – This version of the Standard Contract for AWS Marketplace is available from this Amazon S3 bucket: [https://s3.amazonaws.com/aws-mp-standard-contracts/Standard-Contact-for-AWS-Marketplace-2022-07-14.pdf](https://s3.amazonaws.com/aws-mp-standard-contracts/Standard-Contact-for-AWS-Marketplace-2022-07-14.pdf)

A change set is created for your request. The response to this request gives you the ID for the change set.

**Response Syntax**

```
{
"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 with the AWS Marketplace Seller Operations team to ensure it meets the AWS Marketplace guidelines. The validation process can take anywhere from a few minutes to a few hours. You can check the status of the request through the AWS Marketplace Management Portal, or in the Catalog API with the `DescribeChangeSet` action.

**Synchronous Validations**

The following schema validations are specific to `UpdateLegalTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required Only LegalTerm is allowed in the list List size must be 1  | 422 | 
| Terms[].LegalTerm.Documents |  Required  | 422 | 
| Terms[].LegalTerm.Documents[].Type |  Required Allowed values: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-cppos.html)  | 422 | 
| Terms[].LegalTerm.Documents[].Url |  Required and must be a valid URL when "Type" is one of [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-cppos.html)  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateLegalTerms` 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\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide URLs for legal documents stored in accessible S3 buckets. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Only the most recent version of StandardEula is supported for new offers. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide legal documents in the supported file formats. | 
| INVALID\$1LEGAL\$1DOCUMENTS | Provide legal documents using the supported document types. | 
| LIMIT\$1EXCEEDED\$1LEGAL\$1DOCUMENT\$1SIZE | Provide legal documents within the allowed size limits. | 

## Update the discoverability of the CPPO
<a name="update-availability-cppo"></a>

You can use the Catalog API to manage the discoverability of your offer in AWS Marketplace. This change type doesn’t affect existing agreements. 

You can either choose to set a specific date in the future to restrict the discoverability of your offer or in the past to expire your offer.

To manage the discoverability of your offer, call the `StartChangeSet` API operation with the `UpdateAvailability` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateAvailability",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "AvailabilityEndDate": "2024-05-31"
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateAvailability` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **AvailabilityEndDate** (string) – Date until when the offer is discoverable and purchasable in AWS Marketplace. You can choose to set a specific date in the future to restrict the availability or in the past to expire the offer. Dates are represented in `YYYY-MM-DD` format. Offer expires at 23:59:59.999 UTC on the date provided.

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateAvailability` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| AvailabilityEndDate |  Required Format: "YYYY-MM-DD"  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateAvailability` 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\$1AVAILABILITY\$1END\$1DATE | AvailabilityEndDate isn't supported for public offers. | 
| INVALID\$1AVAILABILITY\$1END\$1DATE | Provide a future AvailabilityEndDate. | 
| INVALID\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate that is before AgreementEndDate. | 
| MISSING\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate that is before the agreement's end date. | 

## Define the expiration date of agreements
<a name="update-validity-terms-cppo"></a>

You can use the Catalog API to define the expiration date of the agreements that are created using this offer in AWS Marketplace.

This change does not affect existing agreements. The manufacturer could mention maximum agreement start date in a Resale Authorization. However, channel partners can’t provide an agreement start date later than that date.

To define the expiration date of agreements, call the `StartChangeSet` API operation with the `UpdateValidityTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdateValidityTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "ValidityTerm",
            "AgreementDuration": "P12M",
            "AgreementStartDate": "2021-08-01",
            "AgreementEndDate": "2022-08-01"
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdateValidityTerms` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) **–** List of validity terms that you want to update. Supported validity terms are:
    + **ValidityTerm** (object) **–** Defines the conditions that will keep an agreement, created from this offer, valid.
      + **Type** (string) **–** Category of the term being updated.
      + **AgreementDuration** (string) **–** Defines the duration that the agreement remains active. If `AgreementStartDate` isn’t provided, agreement duration is relative to the agreement signature time. The duration is represented in the ISO\$18601 format.
      + **AgreementStartDate** (string) **–** Defines the date when agreement starts. `AgreementStartDate` is represented in YYYY-MM-DD format. The agreement starts at 00:00:00.000 UTC on the date provided. If `AgreementStartDate` isn’t provided, agreement start date is determined based on agreement signature time.
      + **AgreementEndDate** (string) **–** Defines the date when the agreement ends. The `AgreementEndDate` is represented in YYYY-MM-DD format. The agreement ends at 23:59:59.999 UTC on the date provided. If `AgreementEndDate` isn’t provided, the agreement end date is determined by the validity of individual terms.

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdateValidityTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP code | 
| --- | --- | --- | 
| Terms |  Required Only "ValidityTerm" is allowed in the list  Must be empty or contain only 1 term  | 422 | 
|  Terms[].ValidityTerm  |  Supported use cases: 1. ValidityTerm with only AgreementDuration 2. ValidityTerm with only AgreementStartDate 3. ValidityTerm with only AgreementEndDate 4. ValidityTerm with both AgreementStartDate and AgreementEndDate  | 422 | 
| Terms[].ValidityTerm.AgreementDuration |  Optional Represented in ISO\$18601 format.  | 422 | 
| Terms[].ValidityTerm.AgreementStartDate |  Optional Format: "YYYY-MM-DD"  | 422 | 
| Terms[].ValidityTerm.AgreementEndDate |  Optional Format: "YYYY-MM-DD"  | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdateValidityTerms` 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\$1AGREEMENT | AgreementStartDate can't be in the future when the current agreement to be replaced isn't future dated. | 
| INCOMPATIBLE\$1AGREEMENT\$1END\$1DATE | AgreementEndDate can't be updated after the offer is released. | 
| INCOMPATIBLE\$1AGREEMENT\$1START\$1DATE | AgreementStartDate can't be updated after the offer is released. | 
| INCOMPATIBLE\$1PRODUCT | AgreementStartDate in the future isn't supported. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the duration between AgreementStartDate and AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementStartDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the duration between AgreementStartDate and AgreementEndDate is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure AgreementDuration matches duration specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1TERMS  | ValidityTerm isn't supported for public offers. | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is expired. | 
| INVALID\$1AGREEMENT\$1DURATION | Provide AgreementDuration that is greater than or equal to [x] days. | 
| INVALID\$1AGREEMENT\$1END\$1DATE | Provide a future AgreementEndDate. | 
| INVALID\$1AGREEMENT\$1END\$1DATE | Provide AgreementEndDate that is after or equal to [x]. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is after AvailabilityEndDate. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is before the AgreementEndDate. | 
| INVALID\$1AGREEMENT\$1START\$1DATE | Provide an AgreementStartDate that is within [x] years from today. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with both AgreementDuration and AgreementEndDate isn't supported. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with both AgreementStartDate and AgreementDuration isn't supported in an offer for the product. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with AgreementStartDate isn't supported in an offer for the product. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | ValidityTerm with only AgreementStartDate isn't supported. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | AgreementEndDate isn't supported unless it's used in combination with a future AgreementStartDate or for replacement offers. | 
| INVALID\$1AGREEMENT\$1TIME\$1INTERVAL | Provide AgreementStartDate and AgreementEndDate where the difference is less than or equal to [x] years. | 
| MISSING\$1AGREEMENT\$1START\$1DATE | Ensure AgreementStartDate is present in ValidityTerm when used along with ConfigurableUpfrontPricingTerm. | 

## Update pricing
<a name="update-pricing-terms-cppo"></a>

You can use the Catalog API to replace the existing pricing terms completely.

The pricing terms that aren't included in the latest request will be removed from the offer. Channel partners can use this change type only to pass `FixedUpFrontPricingTerm`.

To update pricing terms for your offers, call the `StartChangeSet` API operation with the `UpdatePricingTerms` change type, as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdatePricingTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "Details": {
        "PricingModel": "Contract",
        "Terms": [
          {
            "Type": "FixedUpfrontPricingTerm",
            "CurrencyCode": "USD",
            "Price": "200.00",
            "Duration": "P465D",
            "Grants": [
              {
                "DimensionKey": "Users",
                "MaxQuantity": 10
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePricingTerms` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **Details** (string) (required) – Specifics of the request. This field is a JSON string field. It must be formatted properly for a single-line string field, including escaping characters (such as quotation marks) that can’t be in a string.
  + **PricingModel** (string) (required) – Pricing model for your offer. Possible values for pricing model are:
    + **Contract** – Contract-based pricing model where buyers are either billed in advance for the use of your product, or offered a flexible payment schedule. Buyers can also pay for an additional usage above their contract.
    + **Terms** (array of structures) (required) – List of pricing terms that you want to update. Supported pricing terms are:
      + **FixedUpfrontPricingTerm** (object) – Defines a pre-paid pricing model where the customers are charged a fixed upfront amount.
        + **Type** (string) (required) – Type of the term being updated.
        + **CurrencyCode** (string) (required) – Defines the currency for the prices mentioned in this term. For public offers, only USD is supported. For private offers, USD, AUD, EUR, GBP, and JPY are supported.
        + **Price** (string) (required) – Fixed amount to be charged to the customer when this term is accepted.
        + **Grants** (array of structures) (required) – Entitlements that will be granted to the acceptor of fixed upfront as part of agreement execution.
          + **DimensionKey** (string) (required) – Unique dimension key defined in the product document. Dimensions represent categories of capacity in a product and are specified when the product is listed in AWS Marketplace.
          + **MaxQuantity** (integer) (optional) – Maximum amount of capacity that the buyer can be entitled to the given dimension of the product. If `MaxQuantity` is not provided, the buyer will be able to use an unlimited amount of the given dimension.
        + **Duration** (string) (optional) – Defines the duration that the term remains active. This ﬁeld supports the ISO 8601 format.

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdatePricingTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| PricingModel |  Required Allowed pricing models:  Contract  | 
| Terms |  Required Allowed terms:  FixedUpfrontPricingTerm  | 
| Terms[].FixedUpfrontPricingTerm.CurrencyCode |  Required Allowed values: ["USD", "AUD", "EUR", "GBP", "JPN"] Allowed pricing models: Contract  | 
| Terms[].FixedUpfrontPricingTerm.Price |  Required Data type is "String" Must be non-negative  Support up to 6 Decimals No special character supported  | 
| Terms[].FixedUpfrontPricingTerm.Duration |  Required Expected format: ISO 8601 duration  | 
| Terms[].FixedUpfrontPricingTerm.Grants[].DimensionKey |  Required Length must be between 1 and 60  | 
| Terms[].FixedUpfrontPricingTerm.Grants[].MaxQuantity |  Required  | 

**Asynchronous Errors**

The following errors are specific to `UpdatePricingTerms` 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 | 
| --- | --- | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide Grants with a unique list of dimension keys in [x]. | 
| DUPLICATE\$1DIMENSION\$1KEYS | Provide RateCard with a unique list of dimension keys in [x]. | 
| DUPLICATE\$1SELECTORS  | Provide a unique list of Selectors in ConfigurableUpfrontPricingTerm. | 
| DUPLICATE\$1TERM\$1TYPES | Provide a unique list of term types. | 
| INCOMPATIBLE\$1AGREEMENT | The following terms can't be removed from the replacement offer: [x, y, z]. | 
| INCOMPATIBLE\$1AGREEMENT | The following terms can't be added to the replacement offer: [x, y, z]. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1PRODUCT | Usage pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Contract pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Byol pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | Free pricing model isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | [x] isn't supported in an offer for the product. | 
| INCOMPATIBLE\$1PRODUCT | Provided payment and pricing terms are incompatible. | 
| INCOMPATIBLE\$1PRODUCT | Use existing, available dimensions in the product in [x]. | 
| INCOMPATIBLE\$1PRODUCT | FreeTrialPricingTerm as the offer's only pricing term isn't supported for the product. | 
| INCOMPATIBLE\$1PRODUCT | The following terms aren't supported for the product: [x,y,z]. | 
| INCOMPATIBLE\$1PRODUCT | Replacement offers are only supported for contract pricing model. | 
| INCOMPATIBLE\$1PRODUCT | Provide pricing term(s) that are compatible with the product dimensions. Incompatible pricing terms: [x,y,z]. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set MultipleDimensionSelection and QuantityConfiguration to Allowed in ConfigurableUpfrontPricingTerm for usage pricing model. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | Set MultipleDimensionSelection and QuantityConfiguration to Disallowed in ConfigurableUpfrontPricingTerm for usage pricing model. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | QuantityConfiguration in ConfigurableUpfrontPricingTerm can't be changed after the offer is released. | 
| INCOMPATIBLE\$1RATE\$1CARD\$1CONSTRAINTS | MultipleDimensionSelection in ConfigurableUpfrontPricingTerm can't be changed after the offer is released. | 
| INCOMPATIBLE\$1RATES | Set all charge amounts and prices to zero (0) when using Free pricing model. | 
| INCOMPATIBLE\$1RATES | Only zero (0) prices are allowed in UsageBasedPricingTerm for a free trial offer for the product. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide the same CurrencyCode that is specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure Duration in FixedUpfrontPricingTerm matches duration specified in the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide term(s) that are compatible with the ResaleAuthorization. Incompatible terms: [x, y, z]. | 
| INCOMPATIBLE\$1SELECTOR\$1DURATION | Durations aren't allowed to be removed from rate cards in ConfigurableUpfrontPricingTerm after the offer released. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INCOMPATIBLE\$1TERMS  | [x] isn't supported together with the following terms: [y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms can't be added after the offer is released: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms can't be removed after the offer is released: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | [x] isn't supported for private offers. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't supported with FreeTrialPricingTerm that grants unlimited usage: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't supported with FreeTrialPricingTerm for the product: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | Provide zero (0) price for FixedUpfrontPricingTerm when the offer contains a PaymentScheduleTerm. | 
| INCOMPATIBLE\$1TERMS  | The following terms aren't compatible with the PricingModel: [x,y,z]. | 
| INCOMPATIBLE\$1TERMS  | FixedUpfrontPricingTerm isn't supported when MarkupPercentage is greater than zero (0). | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS  | The requested change can't be performed after the offer is expired. | 
| INVALID\$1AGREEMENT\$1DURATION | Provide duration between [x] and [y] months. | 
| INVALID\$1AGREEMENT\$1DURATION | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| INVALID\$1DURATION | Ensure Duration in FreeTrialPricingTerm is within the allowed range. | 
| INVALID\$1DURATION | Provide Duration in FixedUpfrontPricingTerm that matches the duration between AgreementStartDate and AgreementEndDate. | 
| INVALID\$1DURATION | Provide duration between [x] and [y] months. | 
| INVALID\$1DURATION | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1GRANTS | Provide the same MaxQuantity for all Grants in FreeTrialPricingTerm. | 
| INVALID\$1GRANTS | Provide Grants for all available metered dimensions in FreeTrialPricingTerm. | 
| INVALID\$1PRICE\$1CHANGE | [x] can't be updated until [y] because you have requested a price increase in the past 120 days. To cancel your previous price increase request or for more information, contact the AWS Marketplace Managed Catalog Operations Team. | 
| INVALID\$1PRICE\$1CHANGE | Price increase and dimension addition in [x] isn't supported in the same request. Add dimensions first. | 
| INVALID\$1PRICE\$1CHANGE | Price increase and decrease in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1PRICE\$1CHANGE | Price increase in RecurringPaymentTerm and price decrease in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1PRICE\$1CHANGE | Price decrease in RecurringPaymentTerm and price increase in UsageBasedPricingTerm isn't supported in the same request. Decrease prices first. | 
| INVALID\$1RATE\$1CARD | ConfigurableUpfrontPricingTerm is missing one or more-dimension keys for duration [x]. Provide prices for the same set of dimension keys for all durations. | 
| INVALID\$1RATE\$1CARD | Provide a rate card for only metered dimensions in UsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | Rates can't be removed from [x]. Provide prices for all dimensions in the existing rate card. | 
| INVALID\$1RATE\$1CARD | Provide dimensions that have the same unit in [x]. | 
| INVALID\$1RATE\$1CARD | Provide either all metered or all entitled dimensions in [x]. | 
| INVALID\$1RATE\$1CARD | Provide only entitled dimensions in [x]. | 
| INVALID\$1RATE\$1CARD | Provide usage based rates for all available metered dimensions in UsageBasedPricingTerm. | 
| INVALID\$1RATE\$1CARD | Provide usage based rates for all free trial dimensions. | 
| INVALID\$1RATE\$1CARD | Provide prices with up to 8 decimal places in UsageBasedPricingTerm. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide duration between [x] and [y] months. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Ensure duration granularity is at the day level for metered dimensions. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Ensure Duration in ConfigurableUpfrontPricingTerm is within the allowed range. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide one or more supported contract durations. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide one or more supported contract durations or a single custom duration. | 
| INVALID\$1SELECTOR\$1DURATION\$1VALUE | Provide Duration in ConfigurableUpfrontPricingTerm that matches the duration between AgreementStartDate and AgreementEndDate. | 
| MISSING\$1DURATION | Provide Duration in FixedUpfrontPricingTerm. | 
| MISSING\$1MANDATORY\$1TERMS | FixedUpfrontPricingTerm is only supported when paired with ByolPricingTerm or PaymentScheduleTerm. | 
| MISSING\$1MANDATORY\$1TERMS | Provide at least one of [x,y,z]. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a ByolPricingTerm when using Byol pricing model. | 
| TOO\$1MANY\$1GRANTS | Provide up to [x] grants in [y]. | 
| TOO\$1MANY\$1RATE\$1CARDS | Only one rate card in ConfigurableUpfrontPricingTerm is allowed for the product. | 
| TOO\$1MANY\$1RATE\$1CARDS | Up to [x] rate cards are allowed in ConfigurableUpfrontPricingTerm for the product. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in ConfigurableUpfrontPricingTerm. | 
| TOO\$1MANY\$1RATES | Provide RateCards within the allowed limits in UsageBasedPricingTerm. | 

## Update payment schedule details
<a name="update-payment-schedule-terms-cppo"></a>

You can use the Catalog API to change the payment schedule details, such as flexible payment schedule, in AWS Marketplace.

If the manufacturer has provided a payment schedule in Resale Authorization, Channel Partner can either:
+ Use the `UpdateMarkup` change type to apply a uniform percentage markup to all payment schedules.
+ Use the `UpdatePaymentScheduleTerms` change type to set custom payment amounts to a value greater than or equal to what is provided in Resale Authorization. Payment dates can't be changed. Both options can't be applied simultaneously. If a markup is applied first and you need to change it to apply a payment schedule, set the markup to `0` through the `UpdateMarkup` change type. If a payment schedule is applied first you can't revert the change to apply the markup.

To update payment-associated details for your offer, call the `StartChangeSet` API operation with the `UpdatePaymentScheduleTerms` change type, as shown in the following example.

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "UpdatePaymentScheduleTerms",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {
        "Terms": [
          {
            "Type": "PaymentScheduleTerm",
            "Schedule": [
              {
                "ChargeDate": "2021-12-01",
                "ChargeAmount": "200.00"
              },
              {
                "ChargeDate": "2022-03-01",
                "ChargeAmount": "250.00"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

Provide information for the fields to add the `UpdatePaymentScheduleTerms` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request.
  + **Terms** (array of structures) – List of payment terms that you want to update. Supported payment terms are:
    + **PaymentScheduleTerm** (object) – Defines an installment-based pricing model where customers are charged a fixed price on different dates during the agreement validity period.
      + **Type** (string) – Type of the term being updated. This is the object value: `"PaymentScheduleTerm"`.
      + **Schedule** (array of structures) – List of the payment schedule where each element defines one installment of payment. It contains the information necessary for calculating the price to be paid and the date on which the customer would be charged.
        + **ChargeDate** (string) – The date on which the customer would pay the price defined in this payment schedule term. `ChargeDate` is represented in YYYY-MM-DD format. Invoices are generated on the date provided.
        + **ChargeAmount ** (string) – The price that the customer would pay on scheduled date (`ChargeDate`).

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `UpdatePaymentScheduleTerms` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | HTTP | 
| --- | --- | --- | 
| Terms |  Required Only "PaymentScheduleTerm" is allowed List size must be less than 2  | 422 | 
| Terms[].PaymentScheduleTerm.CurrencyCode |  Required Supported currencies: ["USD", "AUD", "EUR", "GBP", "JPN"]  | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[] |  Required List size must be between 1 and 60, inclusive  | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[].ChargeDate |  Required Format: "YYYY-MM-DD"  | 422 | 
| Terms[].PaymentScheduleTerm.Schedule[].ChargeAmount | RequiredData type is "String"Non-negative decimals with up to 2 decimal places supportedNo additional properties are allowed | 422 | 

**Asynchronous Errors**

The following errors are specific to `UpdatePaymentScheduleTerms` 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 | 
| --- | --- | 
| DUPLICATE\$1CHARGE\$1DATES | Provide unique charge dates in PaymentScheduleTerm. | 
| INCOMPATIBLE\$1MARKUP\$1PERCENTAGE | PaymentScheduleTerm isn't supported when MarkupPercentage is greater than zero (0). | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide term(s) that are compatible with the ResaleAuthorization. Incompatible terms: [PaymentScheduleTerm]. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the total ChargeAmounts in PaymentScheduleTerm is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the charge dates in PaymentScheduleTerm are same as the charge dates in the ResaleAuthorization. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the charge amount in PaymentScheduleTerm is greater than or equal to the charge amount in the ResaleAuthorization for that date. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 
| INCOMPATIBLE\$1TERMS | Use either UpdatePaymentScheduleTerms with specific payment amount or UpdateMarkup with a single markup percentage for the scheduled dates. | 
| INVALID\$1CHARGE\$1DATES | Provide charge dates before AgreementEndDate. | 
| TOO\$1MANY\$1BACKDATED\$1CHARGES | Provide up to 1 scheduled payment before AvailabilityEndDate. | 


| Error code | Error message | 
| --- | --- | 
| DUPLICATE\$1CHARGE\$1DATES | Provide unique charge dates in PaymentScheduleTerm. | 
| INCOMPATIBLE\$1CURRENCY\$1CODE | CurrencyCode can't be changed after the offer is released. | 
| INCOMPATIBLE\$1MARKUP\$1PERCENTAGE | PaymentScheduleTerm isn't supported when MarkupPercentage is greater than zero (0). | 
| INCOMPATIBLE\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Provide term(s) that are compatible with the ResaleAuthorization. Incompatible terms: [PaymentScheduleTerm]. | 
| INCOMPATIBLE\$1RESALE\$1AUTHORIZATION | Ensure the total ChargeAmounts in PaymentScheduleTerm is compatible with the ResaleAuthorization. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is released. | 
| INCOMPATIBLE\$1TERMS | The requested change can't be performed after the offer is expired. | 
| INVALID\$1CHARGE\$1DATES | Provide charge dates before AgreementEndDate. | 
| INVALID\$1CURRENCY\$1CODE | Provide a supported CurrencyCode. | 
| INVALID\$1CURRENCY\$1CODE | Provide the same CurrencyCode across all pricing and payment terms. | 
| TOO\$1MANY\$1BACKDATED\$1CHARGES | Provide up to 1 scheduled payment before AvailabilityEndDate. | 

## Publish the CPPO
<a name="release-offer-cppo"></a>

You can use the Catalog API to merge the information collected from all update change types, and then publish the offer in AWS Marketplace.

Offers remain in a `Draft` state, until `ReleaseOffer` is called. After the offer is released, it’s discoverable in AWS Marketplace.

To publish your offer, call the `StartChangeSet` API operation with the `ReleaseOffer` change type as shown in the following example. 

**Request Syntax**

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

{
  "Catalog": "AWSMarketplace",
  "ChangeSet": [
    {
      "ChangeType": "ReleaseOffer",
      "Entity": {
        "Type": "Offer@1.0",
        "Identifier": "offer-123456789"
      },
      "DetailsDocument": {}
    }
  ]
}
```

Provide information for the fields to add the `ReleaseOffer` change type:
+ **Entity** (object) (required) – Your CPPO. 
  + **Type** (string) (required) – The `Type` is always `Offer@1.0`. 
  + **Identifier** (string) (required) – Your offer ID. For more information, see [Identifier](catalog-apis.md#identifier).
+ **DetailsDocument** (object) (required) – The JSON value of specifics of the request. It must be empty for `ReleaseOffer`.

**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 anywhere from a few minutes to a few hours. 

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.

**Synchronous Validations**

The following schema validations are specific to `ReleaseOffer` actions in the AWS Marketplace Catalog API. These validations are performed when you call `StartChangeSet`. If the request doesn’t meet the following requirements, it will fail with an HTTP response.


| Input field | Validation rule | 
| --- | --- | 
| Details  | Must be empty (\$1\$1) | 

**Asynchronous Errors**

The following errors are specific to `ReleaseOffer` 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\$1PAYMENT\$1SETTINGS | Update your payment settings to be compatible with the CurrencyCode. | 
| INCOMPATIBLE\$1PRODUCT | First create a public offer for the product. | 
| INCOMPATIBLE\$1SELLER\$1VERIFICATION | Complete all required seller verification processes. | 
| INVALID\$1UPDATE\$1REQUEST | The requested change can't be performed after the offer is released. | 
| MISSING\$1AGREEMENT\$1END\$1DATE | Provide an AgreementEndDate for replacement offers. | 
| MISSING\$1AVAILABILITY\$1END\$1DATE | Provide an AvailabilityEndDate for private offer. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a FixedUpfrontPricingTerm when the offer contains a PaymentScheduleTerm. | 
| MISSING\$1BUYER\$1ACCOUNTS | Provide PositiveTargeting with BuyersAccounts for offers created using ResaleAuthorization. | 
| MISSING\$1BUYER\$1ACCOUNTS | All offers for the product must be private. Provide PositiveTargeting with BuyersAccounts. | 
| MISSING\$1DESCRIPTION | Set Description before releasing the offer. | 
| MISSING\$1MANDATORY\$1TERMS | Add [x] to the offer. | 
| MISSING\$1MANDATORY\$1TERMS | Provide a FixedUpfrontPricingTerm when the offer contains a PaymentScheduleTerm. | 
| MISSING\$1NAME | Set Name before releasing the offer. | 
| TOO\$1MANY\$1OFFERS | Only one public offer can be created per product. | 
| TOO\$1MANY\$1OFFERS | Only one public free trial offer can be created per product. | 

## Define an existing CPPO
<a name="describe-entity-cppo"></a>

You can use the Catalog API to define CPPO details in AWS Marketplace.

To define an existing CPPO, call the `DescribeEntity` API operation with the `Offer@1.0` entity type, as shown in the following example.

**Request Syntax**

```
GET /DescribeEntity?catalog=<Catalog>&entityId=<EntityId> HTTP/1.1
```

Provide information for the fields to add the `DescribeEntity` change type:
+ **catalog** (string) –The catalog related to the request. Fixed value: `AWSMarketplace`.
+ **entityId** (string) – The unique ID of the offer to describe.

**Response Syntax**

The response to this request gives you the offer details and looks like the following.

```
{
  "EntityType": "Offer@1.0",
  "EntityIdentifier": "offer-a5oEXAMPLEzpu@1",
  "EntityArn": "arn:aws:aws-marketplace:us-east-1:446235747164:AWSMarketplace/Offer/offer-a5oEXAMPLEzpu",
  "LastModifiedDate": "2021-03-10T21:57:16Z",
  "Details": {
    "Id": "offer-3rEXAMPLErn",
    "State": "Released",
    "Name": "Test Offer",
    "Description": "Worldwide private offer for Test Product",
    "PreExistingAgreement": {
      "AcquisitionChannel": "External",
      "PricingModel": "Contract"
    },
    "ProductId": "prod-0bEXAMPLEb51",
    "ResaleAuthorizationId": "resaleauthz-123456789",
    "MarkupPercentage": "5.0",
    "Terms": [
      {
        "Type": "LegalTerm",
        "Documents": [
          {
            "Type": "CustomEula",
            "Url": "https://s3.amazonaws.com/EULA/custom-eula-1234.txt"
          }
        ]
      },
      {
        "Type": "ConfigurableUpfrontPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "Selector": {
              "Type": "Duration",
              "Value": "P12M"
            },
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "300.00"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "400.00"
              }
            ],
            "Constraints": {
              "MultipleDimensionSelection": "Allowed",
              "QuantityConfiguration": "Allowed"
            }
          }
        ]
      },
      {
        "Type": "UsageBasedPricingTerm",
        "CurrencyCode": "USD",
        "RateCards": [
          {
            "RateCard": [
              {
                "DimensionKey": "m3.large",
                "Price": "0.10"
              },
              {
                "DimensionKey": "m4.xlarge",
                "Price": "0.20"
              }
            ]
          }
        ]
      },
      {
        "Type": "PaymentScheduleTerm",
        "CurrencyCode": "USD",
        "Schedule": [
          {
            "ChargeDate": "2020-12-01T00:00:00Z",
            "ChargeAmount": "1000.00"
          },
          {
            "ChargeDate": "2021-06-15T00:00:00Z",
            "ChargeAmount": "1250.00"
          }
        ]
      }
    ],
    "Rules": [
      {
        "Type": "TargetingRule",
        "PositiveTargeting": {
          "CountryCodes": [
            "US",
            "CA"
          ],
          "BuyerAccounts": [
            "118033953248"
          ]
        },
        "NegativeTargeting": {
          "CountryCodes": [
            "XX"
          ]
        }
      },
      {
        "Type": "AvailabilityRule",
        "AvailabilityEndDate": "2050-08-30T01:56:03Z"
      }
    ]
  }
}
```

Provide information for the input fields for the `DescribeEntity` response:
+ **EntityType** (string) – The named type of the entity, which is `Offer@1.0`.
+ **EntityIdentifier** (string) – The identifier of the entity, in the format of `EntityId@RevisionId`.
+ **EntityArn** (string) – The ARN associated to the unique identifier for the change set referenced in this request.
+ **LastModifiedDate** (string) – The last modified date of the entity, in ISO 8601 format (`2018-02-27T13:45:22Z`).
+ **DetailsDocument** (object) – The JSON object includes the details of the entity.
  + **Id** (string) – Unique identifier for an offer entity in AWS Marketplace and is generated during the creation of an offer.
  + **State** (string) – The status of the offer.
  + **Name** (string) – Name associated with the offer for better readability to you and your customers. It will be displayed as part of Agreement information as well.
  + **Description** (string) – Description is a free-form text which is meant to be used only by you and will never be exposed to buyers.
  + **PreExistingAgreement** (string) – Determines if this offer is a renewal for an existing agreement with an existing customer for the same underlying product. The existing agreement can be within or outside AWS Marketplace. AWS may audit and verify your offer is a renewal. If AWS is unable to verify your offer, then AWS may revoke the offer and entitlements from your customer.
    + **AcquisitionChannel** (string) – Indicates if the existing agreement was signed outside AWS Marketplace or within AWS Marketplace. Possible values: `External`, `AwsMarketplace`.

       
    + **PricingModel** (string) – Indicates which pricing model the existing agreement uses. Possible values: `Contract`, `Usage`, `Byol`, `Free`.
  + **ProductId** (string) – Description is a free-form text which is meant to be used only by you and will never be exposed to buyers.
  + **ResaleAuthorizationId** (string) – ResaleAuthorization is used to create the private offer.
  + **MarkupPercentage** (string) – Percentage value that the channel partner passed in the `UpdateMarkup` change type. This markup is already applied to the terms.
  + **Terms** (array of structures) – List of terms.
  + **Rules** (array of structures) – List of rules.

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

Renewals in AWS Marketplace enable sellers, including independent software vendors (ISVs) and channel partners, to seamlessly extend existing agreements with customers. During the renewal process, sellers have the option to adjust terms by creating a new offer. 

There are four types of renewals in AWS Marketplace:
+ **Agreement based offers**: Sellers can replace an existing agreement to adjust pricing, duration, terms, and renew an existing contract before it ends. An agreement based offer can be extended to the customer beyond the current agreement’s end date, granting new entitlements, discounts, or payment schedules based on the customers needs. 

  This support applies to software as a service (SaaS) products, including those with contract and consumption-based pricing (CCP), whether they offer flexible payment options or not.
+ **Future dated offers**: Sellers can create future dated offers to start on a date in the future, and use them to pre-book renewals while existing terms are still ongoing. Once accepted by the customer, the agreement begins on a specified **future date, allowing to start after the current agreement ends.** 

  This support applies to software as a service (SaaS) products, including those with contract and consumption-based pricing (CCP), whether they offer flexible payment options or not.
+ **New private offer**: Sellers can [create a new private offer](work-with-private-offers.md#create-offer) with new terms (for AMI hourly, AMI annual, and SaaS pay-as-you-go subscriptions) that can be accepted anytime to renew an existing agreement.
+ **Auto-renewal**: Customers can enable auto-renewal for public offers and AWS Data Exchange products with private offers to automatically create a new agreement when a previous agreement ends. 

**Topics**
+ [Replacement offers](#replacement-offers)
+ [Future dated agreements](#future-dated-offers)
+ [Resources](#renewals-resources)

## Replacement offers
<a name="replacement-offers"></a>

 As a seller, you can offer renewals by replacing an active agreement that was originally created when the customer accepted your public offer or private offer. Using a replacement offer, you can extend a new offer to the customer that goes beyond the current agreements end date, grant new entitlements, offer pricing discounts, adjust payment schedules, change the payment schedule, or change the end user license agreement (EULA). 

 You can use the Catalog API to [create a replacement offer](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-private-offers.html#create-replacement-offer) (also known as an agreement-based offer) in AWS Marketplace for [supported product types](https://docs.aws.amazon.com/marketplace/latest/userguide/private-offers-upgrades-and-renewals.html#private-offers-upgrades-and-renewals-supported-products). You will need to provide the unique identifier (agreement ID) of the current agreement you wish to replace. You can find this agreement ID in the [AWS Marketplace Management Portal](https://aws.amazon.com/marketplace/management) under the Agreements section or by using the [SearchAgreements](https://docs.aws.amazon.com/marketplace/latest/APIReference/API_marketplace-agreements_SearchAgreements.html) API operation. 

 Once the customer accepts the replacement offer, their current agreement will be replaced with a new agreement that can extend beyond the previous end date. 

**Note**  
 You cannot create a replacement agreement that specifies a seller of record that differs from the original agreement. 

 For more information on replacement offers, see [Amending private offers in AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/private-offers-upgrades-and-renewals.html) in the *AWS Marketplace Seller Guide*. 

## Future dated agreements
<a name="future-dated-offers"></a>

 Future-dated agreements are created when a customer accepts a private offer with a future service start date. To facilitate advance booking of upcoming renewals in AWS Marketplace, ISVs and channel partners can create private offers that start the day after the current agreement ends rather than immediately upon acceptance. 

 To set the start date of a renewal agreement as the day after the end date of the current agreement, you can use the [Catalog API UpdateValidityTerms change type](https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-private-offers.html#update-validity-terms) on a private offer that has already been published. Sellers can choose a service start date up to three years in the future. 

 Customers can review the terms and conditions of the private offer and accept it before it takes effect. Accepting a private offer with a start date in the future does not replace the current agreement. Instead, it creates a renewal agreement that begins immediately after the previous agreement ends. 

 For more information on product types that support future dated offers and agreements, see [Creating future dated agreements](https://docs.aws.amazon.com/marketplace/latest/userguide/private-offers-seller-future-dated-private-offers-and-agreements.html#seller-creating-future-dated-agreements) in the *AWS Marketplace Seller Guide*. 

## Resources
<a name="renewals-resources"></a>
+ For end-to-end labs with working code examples, see: 
  + [Lab: Create a private offer (with a future service start date)](https://catalog.workshops.aws/mpseller/en-US/manage-offers-with-api/create-a-private-offer-with-a-future-service-start-date)
  +  [Lab: Create a replacement private offer](https://catalog.workshops.aws/mpseller/en-US/manage-offers-with-api/create-a-replacement-private-offer) 
+ For a video on creating replacement offers, see [Renew SaaS Contract Private Offers - AWS Marketplace](https://www.youtube.com/watch?v=KzcE0ZWyjzk) on YouTube.
+  For a video on creating future dated offers, see [Create an AWS Marketplace Future Dated Private Offer](https://www.youtube.com/watch?v=xLqQjXa2edo) on YouTube. 

# 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.

# Build interfaces with catalog data
<a name="build-interfaces-with-catalog-data"></a>

You can use the AWS Marketplace Discovery API to programmatically access the catalog and display product and pricing information on your own platforms. This section describes how to build custom interfaces such as storefronts, partner portals, and integrated sales experiences for your customers to navigate, using the Discovery API.

## Architecture overview
<a name="discovery-seller-architecture"></a>

A typical integration follows this pattern:

1. **Browse experience** — Call `SearchListings` to retrieve listing summaries based on search text and filters, and `SearchFacets` to populate category navigation and filter options with counts.

1. **Product detail pages** — Call `GetListing` or `GetProduct` to display full product details, media, and reviews.

1. **Pricing display** — Call `ListPurchaseOptions`, `GetOffer`, and `GetOfferTerms` to show pricing options.

## Build a browse experience
<a name="discovery-seller-browse"></a>

Use `SearchListings` to retrieve listing summaries based on search text and filters, and `SearchFacets` to build dynamic filter navigation. Facets include categories, fulfillment types, pricing models, pricing units, publishers, and deployment status. Each facet value includes a count of matching listings, which you can display alongside filter options.

```
import boto3

client = boto3.client('marketplace-discovery', region_name='us-east-1')

# Get facet values for building filter navigation
facets = client.search_facets(
    facetTypes=['CATEGORY', 'FULFILLMENT_OPTION_TYPE', 'PRICING_MODEL']
)

for facet_type, values in facets['listingFacets'].items():
    print(f"\n{facet_type}:")
    for facet in values:
        print(f"  {facet['displayName']} ({facet['count']})")

# Search listings with filters applied from user selections
response = client.search_listings(
    searchText='machine learning',
    filters=[
        {
            'filterType': 'CATEGORY',
            'filterValues': ['Machine Learning']
        },
        {
            'filterType': 'PRICING_MODEL',
            'filterValues': ['USAGE']
        }
    ],
    sortBy='RELEVANCE',
    maxResults=25
)

for listing in response['listingSummaries']:
    print(f"{listing['listingName']} - {listing['shortDescription']}")
```

## Build product detail pages
<a name="discovery-seller-product-pages"></a>

Use `GetListing` or `GetProduct` to display full product details, media, and reviews. Use `GetListing` when you need the listing overview including badges, categories, and pricing summaries. Use `GetProduct` when you need detailed product information such as descriptions, highlights, and media. Call `ListFulfillmentOptions` to retrieve deployment options for a specific product.

```
def get_product_page_data(listing_id, product_id):
    """Retrieve data for a product detail page."""

    # Use GetListing for listing-level overview
    listing = client.get_listing(listingId=listing_id)

    # Or use GetProduct for detailed product information
    product = client.get_product(productId=product_id)

    # Get deployment options for the product
    fulfillment = client.list_fulfillment_options(productId=product_id)

    return {
        'listing': listing,
        'product': product,
        'fulfillmentOptions': fulfillment
    }
```

## Display pricing information
<a name="discovery-seller-pricing"></a>

Use `ListPurchaseOptions` to find available offers for a product, then `GetOffer` and `GetOfferTerms` to retrieve detailed pricing. Display pricing models, rate cards, and term details to help your customers evaluate options.

```
def get_pricing_for_product(product_id):
    """Retrieve pricing options for display."""
    options = client.list_purchase_options(
        filters=[{
            'filterType': 'PRODUCT_ID',
            'filterValues': [product_id]
        }]
    )

    pricing = []
    for option in options.get('purchaseOptions', []):
        for entity in option['associatedEntities']:
            offer = client.get_offer(
                offerId=entity['offer']['offerId']
            )
            terms = client.get_offer_terms(
                offerId=entity['offer']['offerId']
            )
            pricing.append({
                'option': option,
                'offer': offer,
                'terms': terms
            })

    return pricing
```

## Best practices
<a name="discovery-seller-best-practices"></a>
+ **Cache responses** — Product and pricing data changes infrequently. Cache API responses for 15–60 minutes to reduce API calls and improve page load times.
+ **Handle pagination** — Use `nextToken` to retrieve all results from paginated operations. Pagination tokens expire after 24 hours.
+ **Implement retry logic** — Use exponential backoff for `ThrottlingException` (HTTP 429) responses.
+ **Display attribution** — When displaying AWS Marketplace data on your platform, follow the [AWS Trademark Guidelines](https://aws.amazon.com/trademark-guidelines/).
+ **Minimize API calls** — Use `SearchListings` for summary data and only call detail APIs (`GetProduct`, `GetOffer`, `GetOfferTerms`) when a user navigates to a specific product.

**Note**  
The Discovery API supports all product types on AWS Marketplace, including SaaS, AI agents and tools, AMI, containers, and machine learning models. Your interface can display the full breadth of the catalog.