---
schema_version: "1"
id: aba05b4465dff45c659f35d0f44eb1e67b0476bdd57cf650c75fff64b8ddd69d
title: Coupons
collection: developer
version: current
locale: en-us
portal_url: https://docs.salesforce.com/developer/current/en-us/commerce-cloud/commerce-api/references/generated-api-specs/coupons.md
canonical_url: https://developer.salesforce.com/docs/commerce/commerce-api/references/coupons
source_site: developer.salesforce.com
content_type: documentation
content_hash: efe35607102dbb8d23c9750276963eabad920365e523694a668814ba3254446f
products:
  - B2C Commerce API
  - Salesforce APIs
---
Coupons

# Coupons

[Download API specification](https://developer.salesforce.com/static/commercecloud/commerce-api/coupons/coupons-oas-v1-public.yaml)

## API Overview

Use the Coupons API to create, modify, retrieve, and delete coupons for a given channel. You can also use it to create and retrieve coupon codes using a couponID.

Coupons _must_ be added as a qualifier to a campaign before they can be used.

For more information, see [Using Coupons as Qualifiers](https://help.salesforce.com/s/articleView?id=cc.b2c_coupons.htm&type=5) in the B2C Commerce documentation.

### Authentication & Authorization

The client requesting the coupon's information must have access to the Coupon resource. For resource access, you must use a client ID and client secret from Account Manager to request an access token. The access token is used as a bearer token and added to the Authorization header of your API request. The client must first authenticate against Account manager to log in.

You must include the relevant scope(s) in the client ID used to generate the token. For details, see [Authorization Scopes Catalog.](https://developer.salesforce.com/docs/commerce/commerce-api/guide/auth-z-scope-catalog.html)

For detailed setup instructions, see [Authorization for Admin APIs](https://developer.salesforce.com/docs/commerce/commerce-api/guide/authorization-for-admin-apis.html).

### Response Details

#### Timeouts

Admin API requests must respond within 60 seconds. If a response exceeds this threshold, an HTTP 504 status code is returned. For details, see [Timeouts and Limits.](https://developer.salesforce.com/docs/commerce/commerce-api/guide/timeouts-limits.html)

#### Error Handling

Error responses follow the [RFC 7807](https://datatracker.ietf.org/doc/html/rfc7807) problem detail format. To trace errors, include a `correlation-id` header in your request — the response returns it as `x-correlation-id`. For details, see [HTTP Status Codes and Errors.](https://developer.salesforce.com/docs/commerce/commerce-api/guide/error-response-codes.html)

### Use Cases

#### Single-Use Coupon

Single-use coupons are your standard coupons, which you can only use once per customer.

For example, use the Coupons API to create a coupon with a single coupon code that can be applied only once per order per customer.

#### Multiple-Use Coupon

A multiple-use coupon can be used any number of times by any number of customers.

For example, use the Coupons API to create a coupon that can be applied once per order and has system-generated codes.

#### Search Coupon

Use the Coupons API to search for coupons using simple or complex querying.

#### Search Coupon Redemptions

Use the Coupons API to search for coupon redemptions using simple or complex querying.

For more detail, see [Coupon Redemption](https://help.salesforce.com/s/articleView?id=cc.b2c_coupons.htm&type=5) in the B2C Commerce documentation.

### Related APIs

*   [Campaigns](https://developer.salesforce.com/docs/commerce/commerce-api/references/campaigns?meta=Summary) — Manage campaigns that use coupons as qualifiers.

**Version:** 1.0.44

## Servers

*   `https://{shortCode}.api.commercecloud.salesforce.com/pricing/coupons/v1`
    *   `shortCode (default shortCode) An eight-character string assigned to a realm for routing purposes. See [Base URL and Request Formation.](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html)`

## Security

*   `AmOAuth2` (oauth2) AccountManager OAuth 2.0 bearer token Authentication.
    *   OAuth flow clientCredentials (tokenUrl: https://account.demandware.com/dwsso/oauth2/access\_token)
    *   Scope sfcc.promotions: promotions READONLY
    *   Scope sfcc.promotions.rw: promotions read/write
    *   OAuth flow authorizationCode (authorizationUrl: https://account.demandware.com/dwsso/oauth2/authorize, tokenUrl: https://account.demandware.com/dwsso/oauth2/access\_token, refreshUrl: https://account.demandware.com/dwsso/oauth2/access\_token)

## Operations

### POST Search for coupons.

`POST /organizations/{organizationId}/coupons`

Operation ID: `couponsSearch`. Security: AmOAuth2 (sfcc.promotions, sfcc.promotions.rw).

The Coupon Search document contains a search object that allows filtering on various attributes.

The following searchable query attributes can be used to narrow the search:

| Attribute | Type |
| --- | --- |
| couponId | String |
| description | String |
| type | one of {"single\_code", "multiple\_codes", "system\_codes"} |
| enabled | Boolean |

Note that only searchable attributes can be used in sorting.

#### Parameters

*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `SearchRequest`.

#### Responses

*   **200** Coupon information successfully retrieved.
    
    Media type: `application/json`. Schema: `CouponSearchResult`.
    
*   **400** Returned when the query is ill-formed.

### POST Search for coupon redemptions.

`POST /organizations/{organizationId}/coupons/redemptions`

Operation ID: `couponRedemptionsSearch`. Security: AmOAuth2 (sfcc.promotions, sfcc.promotions.rw).

The Coupon Redemption Search document contains a search object that allows filtering on various attributes.

The following searchable query attributes can be used to narrow down the search:

| Attribute | Type |
| --- | --- |
| code | String |
| couponId | String |
| customerEmail | String |
| orderNo | String |

Note that only searchable attributes can be used in sorting.

If the user role does not have the `View_Coupon_Codes` permission, then the returned coupon codes are masked.

#### Parameters

*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `SearchRequest`.

#### Responses

*   **200** Coupon redemption information successfully retrieved.
    
    Media type: `application/json`. Schema: `CouponRedemptionSearchResult`.
    
*   **400** Returned when the query is ill-formed.

### POST Redeem a coupon code for an existing coupon for the specified site.

`POST /organizations/{organizationId}/coupons/actions/redeem`

Operation ID: `redeemCoupon`. Security: AmOAuth2 (sfcc.promotions.rw).

### The coupon code must be redeemable.

_**Note: Coupon redemptions are evaluated during checkout. A large number of coupon redemptions negatively impacts order creation performance and scale.**_

1.  Avoid importing unnecessary coupon redemptions.
2.  Clean up coupon codes and related redemptions when they are no longer required.

* * *

#### Parameters

*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `CouponCodeRedemptionRequest`.

_Example: PostRedeemCoupon_

```
{
  "code": "Code1",
  "customerEmail": "shopper@salesforce-test.com",
  "orderNo": "00023120@store4"
}
```

#### Responses

*   **201** Coupon was successfully redeemed and a redemption record created.
*   **400** Returned when the coupon code can not be redeemed, for example, if it is disabled, already redeemed, if the redemption limit (maximum number or timeframe) is exceeded or if it has no assigned active promotion.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: IdConflict400_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-code-not-redeemable",
      "title": "Coupon Code Not Redeemable",
      "detail": "The coupon code 'CODE374' in site 'RefArch' is not redeemable because 'COUPON_DISABLED'.",
      "errorCode": "COUPON_DISABLED",
      "couponCode": "CODE374",
      "siteId": "RefArch"
    }
    ```
    
*   **404** Returned when the site does not contain a coupon, which defines whether the coupon code requested can be redeemed.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: IdConflict400_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-not-found",
      "title": "Coupon Not Found",
      "detail": "No coupon for the given coupon code 'CODE374' and site 'RefArch' could be found.",
      "couponCode": "CODE374",
      "siteId": "RefArch"
    }
    ```
    

### GET Return coupon information for the specified coupon ID.

`GET /organizations/{organizationId}/coupons/{couponId}`

Operation ID: `getCoupon`. Security: AmOAuth2 (sfcc.promotions, sfcc.promotions.rw).

If the user role does not have the View\_Coupon\_Codes permission, then the returned coupon codes are masked.

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Responses

*   **200** Coupon information for the specified coupon ID successfully returned.
    
    Media type: `application/json`. Schema: `Coupon`.
    
    _Example: GetCoupon_
    
    ```
    {
      "couponId": "MyCoupon",
      "creationDate": "2019-10-20T12:00:00Z",
      "description": "This coupon is used to give 10% off stuff.",
      "enabled": false,
      "exportedCodeCount": 0,
      "lastModified": "2019-10-30T04:23:59Z",
      "redemptionCount": 3,
      "redemptionLimits": {
        "limitPerCode": 0,
        "limitPerCustomer": 0,
        "limitPerTimeFrame": {
          "redemptionTimeFrame": 24,
          "limit": 1
        }
      },
      "singleCode": "MyCode",
      "systemCodesConfig": {
        "codePrefix": "SG",
        "numberOfCodes": 50000
      },
      "totalCodesCount": 50,
      "type": "single_code"
    }
    ```
    
*   **404** Returned when the coupon does not exist matching the given ID.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: getCoupon404_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-not-found",
      "title": "Coupon Not Found",
      "detail": "No coupon with ID 'foo' for site 'RefArch' could be found.",
      "couponId": "foo",
      "siteId": "RefArch"
    }
    ```
    

### PUT Create a coupon using the information provided. If a coupon with the specified identifier already exists, the existing coupon is replaced.

`PUT /organizations/{organizationId}/coupons/{couponId}`

Operation ID: `createCoupon`. Security: AmOAuth2 (sfcc.promotions.rw).

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `Coupon`.

#### Responses

*   **200** Coupon successfully created.
    
    Media type: `application/json`. Schema: `Coupon`.
    
    _Example CreateCoupon: same as GET /organizations/{organizationId}/coupons/{couponId} 200 response._
    
*   **400**
    
    Returned when the coupon passed is not valid (the argument indicates which field is invalid). Possible reasons:
    
    *   The code provided is in use by another coupon.
    *   A single code coupon set the coupon code improperly.
    *   The ID in the request does not match the ID in the document.
    *   A quota for system-generated coupons is violated.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: CouponCodeDuplicate400_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-code-duplicate",
      "title": "Coupon Code Duplicate",
      "detail": "The coupon code 'bar' is already used in coupon 'foo'. Please make sure the code is unique.",
      "couponId": "foo",
      "couponCode": "bar"
    }
    ```
    
*   **403** Returned when the resource requires global context instead of site-specific context.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: createCoupon403_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/site-access-forbidden",
      "title": "Site Access Forbidden",
      "detail": "Site-specific access via '/s/RefArch/' isn't allowed. Organization-specific access is expected via '/s/-/'.",
      "siteId": "RefArch"
    }
    ```
    

### DELETE Delete a coupon with a specified ID.

`DELETE /organizations/{organizationId}/coupons/{couponId}`

Operation ID: `deleteCoupon`. Security: AmOAuth2 (sfcc.promotions.rw).

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Responses

*   **204** Coupon successfully deleted.

### PATCH Update a coupon with the specified information.

`PATCH /organizations/{organizationId}/coupons/{couponId}`

Operation ID: `updateCoupon`. Security: AmOAuth2 (sfcc.promotions.rw).

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `Coupon`.

#### Responses

*   **200** Coupon successfully updated.
    
    Media type: `application/json`. Schema: `Coupon`.
    
    _Example UpdateCoupon: same as GET /organizations/{organizationId}/coupons/{couponId} 200 response._
    
*   **400**
    
    Possible reasons:
    
    *   Cannot update certain fields in a coupon after redeeming it or exporting it
    *   The code provided is in use by another coupon.
    *   A quota for system-generated coupons is violated.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example updateCoupon400: same as PUT /organizations/{organizationId}/coupons/{couponId} 400 response._
    
*   **403** Returned when trying to update a broken coupon that should be deleted and re-created, or when trying to update a legacy coupon.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: updateCoupon403_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-legacy-update-forbidden",
      "title": "Coupon Legacy Update Forbidden",
      "detail": "The coupon 'foo' can't be modified because it was created before Release 16.7.2. Customers can still redeem this coupon code on the Storefront.",
      "couponId": "foo"
    }
    ```
    

### GET Get the coupon codes for the given coupon. If the user role does not have the View\_Coupon\_Codes permission, then the coupon codes returned are masked.

`GET /organizations/{organizationId}/coupons/{couponId}/codes`

Operation ID: `getCouponCodes`. Security: AmOAuth2 (sfcc.promotions, sfcc.promotions.rw).

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    
*   `limit` (query, integer (int32)) Number of records to retrieve per request. Must be between 1 (minimum) and 200 (maximum). Defaults to 25.  
    Default: `25`. Minimum: 1. Maximum: 200.
*   `offset` (query, integer (int32)) Used to retrieve the results based on a particular resource offset.  
    Default: `0`. Minimum: 0.

#### Responses

*   **200** Coupon codes successfully retrieved.
    
    Media type: `application/json`. Schema: `CouponCodes`.
    
    _Example: GetCouponCodes_
    
    ```
    {
      "limit": 3,
      "offset": 0,
      "total": 50,
      "data": [
        {
          "code": "CodeA",
          "issued": false,
          "redemptionCount": 0
        },
        {
          "code": "CodeB",
          "issued": false,
          "redemptionCount": 0
        },
        {
          "code": "CodeC",
          "issued": false,
          "redemptionCount": 0
        }
      ]
    }
    ```
    
*   **404** Returned when the coupon does not exist matching the given ID.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example CouponNotFound: same as GET /organizations/{organizationId}/coupons/{couponId} 404 response._
    

### POST Add or delete (modify) multiple codes to and from the supplied coupon.

`POST /organizations/{organizationId}/coupons/{couponId}/codes`

Operation ID: `updateCouponCodes`. Security: AmOAuth2 (sfcc.promotions.rw).

#### Parameters

*   `couponId` (path, string, required) The ID of the coupon to create.  
    Minimum length: 1.
*   `organizationId` (path, OrganizationId, required) An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).
    
    _Example_
    
    ```
    f_ecom_zzxy_prd
    ```
    
*   `delete` (query, boolean) Pass as true to delete the passed codes.  
    Default: `false`.
*   `siteId` (query, SiteId, required) The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites.
    
    _Example: SiteId_
    
    ```
    RefArch
    ```
    

#### Request body

Media type: `application/json`. Schema: `CouponMultiCodesRequest`.

#### Responses

*   **204** Coupon codes successfully updated - this is also returned if we try to add an already existing code or to delete a non-existing code.
*   **400** Returned when the coupon code could not be created.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example: updateCoupon400_
    
    ```
    {
      "type": "https://api.commercecloud.salesforce.com/documentation/error/v1/errors/coupon-code-create",
      "title": "Coupon Code Create",
      "detail": "The coupon code 'bar' couldn't be created. Please make sure the code is valid.",
      "couponCode": "bar"
    }
    ```
    
*   **404** Returned if the coupon does not exist matching the given ID.
    
    Media type: `application/json`. Schema: `ErrorResponse`.
    
    _Example CouponNotFound404: same as GET /organizations/{organizationId}/coupons/{couponId} 404 response._
    

## Schemas

### OrganizationId

An identifier for the Salesforce Commerce Cloud organization the request is being made by. It consists of a prefix 'f\_ecom\_' followed by a 4-character [realm identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#realm-id) and a 3-character [instance type identifier](https://developer.salesforce.com/docs/commerce/commerce-api/guide/base-url.html#instance-id).

Type: `string`.

Pattern: ^f\_ecom\_\[a-z\]{4}\_(prd|stg|dev|s\[0-9\]{2}|\[0-9\]{3})$. Example: `f_ecom_zzxy_prd`.

### SiteId

The identifier of the site that a request is being made in the context of. Attributes might have site specific values, and some objects may only be assigned to specific sites

Type: `string`.

Minimum length: 1. Maximum length: 32. Example: `RefArch`.

### SearchRequest

Document representing a search request for retrieving items within the Data API. The query is a potentially complex set of expressions. The fields and expands that each query supports are defined within the search resource.

*   `limit` (_integer (int32)_) Maximum records to retrieve per request, not to exceed 200.  
    Minimum: 1. Maximum: 200. Example: `10`.
*   `query` (_Query_, required)
*   `sorts` (_array of Sort_) The list of sort clauses configured for the search request. Sort clauses are optional. See the description of the search endpoint for details on the default sorting behavior that is used when explicit sorts are not passed.
*   `offset` (_Offset_)

### CouponSearchResult

Document representing a coupon search result.

Includes all fields of `PaginatedSearchResult`.

*   `hits` (_array of Coupon_, required) The sorted array of coupon search hits. Can be empty.

### CouponRedemptionSearchResult

The result of the coupon redemption search.

Includes all fields of `PaginatedSearchResult`.

*   `hits` (_array of CouponRedemption_, required) The array of coupon redemption search hits. Can be empty.

### CouponCodeRedemptionRequest

Document representing a request to redeem a coupon.

*   `code` (_string_, required) The coupon code to redeem.  
    Example: `Code1`.
*   `customerEmail` (_string_) The customer email to use on the redemption.  
    Example: `shopper@salesforce-test.com`.
*   `orderNo` (_string_, required) The order number to use on the redemption. In case the coupon was redeemed externally and no order number is associated, use a reference id or custom string to identify the source of the redemption.  
    Example: `00023120@store4`.

### ErrorResponse

*   `title` (_string_, required) A short, human-readable summary of the problem type. It will not change from occurrence to occurrence of the problem, except for purposes of localization  
    Maximum length: 256. Example: `You do not have enough credit`.
*   `type` (_string_, required) A URI reference \[RFC3986\] that identifies the problem type. This specification encourages that, when dereferenced, it provide human-readable documentation for the problem type (e.g., using HTML \[W3C.REC-html5-20141028\]). When this member is not present, its value is assumed to be "about:blank". It accepts relative URIs; this means that they must be resolved relative to the document's base URI, as per \[RFC3986\], Section 5.  
    Maximum length: 2048. Example: `NotEnoughMoney`.
*   `detail` (_string_, required) A human-readable explanation specific to this occurrence of the problem.  
    Example: `Your current balance is 30, but that costs 50`.
*   `instance` (_string_) A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced. It accepts relative URIs; this means that they must be resolved relative to the document's base URI, as per \[RFC3986\], Section 5.  
    Maximum length: 2048. Example: `/account/12345/msgs/abc`.

### Coupon

Document representing a coupon.

*   `couponId` (_string_, required) The ID of the coupon.  
    Minimum length: 1. Maximum length: 256. Example: `MyCoupon`.
*   `creationDate` (_string (date-time)_) Returns the value of attribute 'creationDate'.  
    Example: `2019-10-20T12:00:00Z`.
*   `description` (_string_) The description of the coupon.  
    Maximum length: 4000. Example: `This coupon is used to give 10% off stuff.` .
*   `enabled` (_boolean_, required) A flag indicating whether the coupon is enabled.  
    Example: `false`.
*   `exportedCodeCount` (_integer (int32)_) The number of coupon codes attached to the coupon that have been issued (read only).  
    Example: `0`.
*   `lastModified` (_string (date-time)_) Returns the value of attribute 'lastModified'.  
    Example: `2019-10-30T04:23:59Z`.
*   `redemptionCount` (_integer (int32)_) The number of times the coupon has been redeemed (read only). The count is updated once per hour.  
    Example: `3`.
*   `redemptionLimits` (_object_) The redemption limit per coupon code.
    
    Includes all fields of `RedemptionLimits`.
    
    _Example_
    
    ```
    {
      "limitPerCode": 1,
      "limitPerCustomer": 1,
      "limitPerTimeFrame": {
        "limit": 2,
        "redemptionTimeFrame": 24
      }
    }
    ```
    
*   `singleCode` (_string_) Single coupon code, only valid for Single Code type.  
    Minimum length: 1. Maximum length: 256. Example: `MyCode`.
*   `systemCodesConfig` (_object_) The configuration of system coupon codes, including prefix and number of codes.
    
    Includes all fields of `CouponSystemCodeConfig`.
    
    _Example_
    
    ```
    {
      "codePrefix": "SG",
      "numberOfCodes": 500000
    }
    ```
    
*   `totalCodesCount` (_integer (int32)_) The total number of coupon codes associated with this coupon (read only). The count is updated once per hour.  
    Example: `50`.
*   `type` (_string_, required) The type of coupon code.  
    Allowed values: `single_code`, `multiple_codes`, `system_codes`. Example: `single_code`.

### CouponCodes

Document representing a set of coupon codes.

Includes all fields of `PaginatedResultBase`.

*   `data` (_array of CouponCode_, required) The collection of coupon codes.
    
    _Example_
    
    ```
    [
      {
        "code": "Code1",
        "issued": false,
        "redemptionCount": 0
      }
    ]
    ```
    

### CouponMultiCodesRequest

A request object to add and remove coupon codes from a document.

*   `codes` (_array of string_, required) The list of coupon codes to add or delete.  
    Items: Minimum length: 1. Maximum length: 256. Maximum items: 999.
    
    _Example_
    
    ```
    [
      "CodeA",
      "CodeB"
    ]
    ```
    

### Query

A set of objects that define criteria used to select records. A query can contain one of the following:

*   `MatchAllQuery`

*   Matches all documents.

*   `TermQuery`

*   Matches one or more documents against one or more document fields.

*   `TextQuery`

*   Matches text against one or more fields.

*   `BoolQuery`

*   Allows construction of a logical expression of multiple queries.

*   `FilteredQuery`

*   Allows a filter to be applied to a query.

*   `NestedQuery`

*   Allows you to query on nested documents.
*   _Only supported by some Commerce APIs. For more details, see the endpoint descriptions in the API documentation._

Minimum properties: 1. Maximum properties: 1.

*   `boolQuery` (_BoolQuery_)
*   `filteredQuery` (_FilteredQuery_)
*   `matchAllQuery` (_MatchAllQuery_)
*   `nestedQuery` (_NestedQuery_)
*   `termQuery` (_TermQuery_)
*   `textQuery` (_TextQuery_)

_Example_

```
{
  "filteredQuery": {
    "query": {
      "textQuery": {
        "fields": [
          "couponId"
        ],
        "searchPhrase": "disabled"
      }
    },
    "filter": {
      "termFilter": {
        "field": "enabled",
        "operator": "is",
        "values": [
          false
        ]
      }
    }
  }
}
```

### Sort

Document representing a sort request. Each API has a different default sort configuration that can be modified in the request.

*   `field` (_string_, required) The name of the field to sort on.  
    Maximum length: 256. Example: `couponId`.
*   `sortOrder` (_string_) The sort order to be applied when sorting. When omitted, the default sort order (asc) is used.  
    Allowed values: `asc`, `desc`. Default: `asc`. Example: `asc`.

_Example_

```
{
  "field": "couponId",
  "sortOrder": "desc"
}
```

### Offset

The zero-based index of the first hit/data to include in the result.

Type: `integer (int32)`.

Default: `0`. Minimum: 0. Example: `0`.

### PaginatedSearchResult

Document representing a generic search result. Each search resource should extend this to define what is returned in the `hits`.

Includes all fields of `PaginatedResultBase`.

*   `query` (_Query_, required)
*   `sorts` (_array of Sort_) The sorting that was applied to the result.
*   `hits` (_array of object_) The sorted array of search hits. Can be empty.

_Example_

```
{
  "limit": 1,
  "hits": [
    {
      "couponId": "coupon1",
      "creationDate": "2019-10-20T12:00:00Z",
      "description": "This coupon is used to give 10% off stuff.",
      "enabled": false,
      "exportedCodeCount": 0,
      "lastModified": "2019-10-30T04:23:59Z",
      "redemptionCount": 3,
      "redemptionLimits": {
        "limitPerCode": 1,
        "limitPerCustomer": 1,
        "limitPerTimeFrame": {
          "limit": 2,
          "redemptionTimeFrame": 24
        }
      },
      "singleCode": "MyCode",
      "systemCodesConfig": {
        "codePrefix": "SG",
        "numberOfCodes": 500000
      },
      "totalCodesCount": 50,
      "type": "single_code"
    }
  ],
  "query": {
    "textQuery": {
      "fields": [
        "id",
        "description"
      ],
      "searchPhrase": "stuff"
    }
  },
  "sorts": [
    {
      "field": "couponId",
      "sortOrder": "desc"
    }
  ],
  "offset": 2,
  "total": 8
}
```

### CouponRedemption

A redemption record returned from the coupon redemption resources.

*   `code` (_string_, required) The coupon code that was redeemed.
*   `couponId` (_string_, required) The coupon id that was redeemed.
*   `creationDate` (_string (date-time)_, required) Date when the redemption was created.
*   `customerEmail` (_string_, required) The customer email that was used to redeem it.
*   `orderNo` (_string_, required) The order number where the redemption occurred.
*   `viewOrderUrl` (_string_, required) A URL able to access the order.

### RedemptionLimits

Document representing a coupon.

*   `limitPerCode` (_integer (int32)_, required) The redemption limit per code.  
    Minimum: 0. Example: `0`.
*   `limitPerCustomer` (_integer (int32)_, required) The redemption limit per customer.  
    Minimum: 0. Example: `0`.
*   `limitPerTimeFrame` (_object_, required) The redemption limit per time frame.
    
    Includes all fields of `RedemptionLimitPerPeriod`.
    
    _Example_
    
    ```
    {
      "redemptionTimeFrame": 24,
      "limit": 1
    }
    ```
    

### CouponSystemCodeConfig

*   `codePrefix` (_string_, required) The code prefix for system-generated coupon codes.  
    Example: `SG`.
*   `numberOfCodes` (_integer (int32)_, required) The number of system coupon codes that can be issued.  
    Example: `50000`.

### PaginatedResultBase

Schema defining generic pageable result. Each response schema of a resource requiring pagination should extend this schema. If you use this extend this schema directly, it needs to be defined what data is returned. Allowed names for the data field is `data`.

Includes all fields of `ResultBase`.

*   `offset` (_Offset_, required)

### CouponCode

A coupon code with accompanying stats for redemptions and issues.

*   `code` (_string_, required) The code used to redeem the coupon.  
    Example: `MyCode`.
*   `issued` (_boolean_, required) Flag indicating if the coupon code has been issued.  
    Example: `true`.
*   `redemptionCount` (_integer (int32)_, required) The count of the number of redemptions associated with the code.  
    Example: `1`.

### BoolQuery

A boolean query allows construction of full logical expression trees that are composed of other queries (usually term queries and text queries). A boolean query has three sets of clauses:

*   `must`, which combines as an `AND` operator.
*   `should`, which combines as an `OR` operator.
*   `must_not`, which combines as a `NOT` operator.

If `must`, `mustNot`, or `should` appear in the same boolean query, they are combined logically using the `AND` operator. For example:

```
(must-1 AND must-1 AND ...)
  AND (should-1 OR should-2 OR ...)
  AND NOT (must_not-1 OR must_not-2 OR ...)
```

*   `must` (_array of Query_) List of queries to be evaluated as an `AND` operator.
*   `mustNot` (_array of Query_) List of queries to be evaluated as a `NOT` operator.
*   `should` (_array of Query_) List of queries to be evaluated as an `OR` operator.

_Example_

```
{
  "must": [
    {
      "textQuery": {
        "fields": [
          "couponId"
        ],
        "searchPhrase": "DEAL"
      }
    },
    {
      "textQuery": {
        "fields": [
          "description"
        ],
        "searchPhrase": "Big bargain deal"
      }
    }
  ],
  "mustNot": [
    {
      "termQuery": {
        "fields": [
          "enabled"
        ],
        "operator": "is",
        "values": [
          false
        ]
      }
    }
  ]
}
```

### FilteredQuery

Allows to filter the result of a possibly complex query using a possibly complex filter.

*   `filter` (_Filter_, required)
*   `query` (_Query_, required)

_Example_

```
{
  "query": {
    "textQuery": {
      "fields": [
        "couponId"
      ],
      "searchPhrase": "disabled"
    }
  },
  "filter": {
    "termFilter": {
      "field": "enabled",
      "operator": "is",
      "values": [
        false
      ]
    }
  }
}
```

### MatchAllQuery

Matches all documents (namespace and document type). This query comes in handy if you just want to filter a search result or really do not have any constraints.

### NestedQuery

Allows you to query nested documents that are part of a larger document. Say, for example, that you have a main product with variations in one big document, and you want to constrain a search to main products that have variations that match multiple constraints.

A `NestedQuery` is only supported by some Commerce APIs. For more details, see the endpoint descriptions in the API documentation.

*   `path` (_string_, required) The path to the nested document.  
    Maximum length: 2048. Example: `order.shippingAddresses`.
*   `query` (_Query_, required)
*   `scoreMode` (_string_) Indicates how scores for matching child objects affect the root parent document’s relevance score.  
    Allowed values: `avg`, `total`, `max`, `none`. Example: `avg`.

_Example_

```
{
  "path": "order.shippingAddresses",
  "query": {
    "boolQuery": {
      "must": [
        {
          "boolQuery": {
            "must": [
              {
                "termQuery": {
                  "fields": [
                    "order.shippingAddresses.firstName"
                  ],
                  "operator": "is",
                  "values": [
                    "John"
                  ]
                }
              }
            ]
          }
        },
        {
          "boolQuery": {
            "must": [
              {
                "termQuery": {
                  "fields": [
                    "order.shippingAddresses.lastName"
                  ],
                  "operator": "is",
                  "values": [
                    "Doe"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "scoreMode": "avg"
}
```

### TermQuery

A term query matches one or more values against one or more document fields. A document is considered a hit if one of the values matches exactly with at least one of the given fields. The operator `is` can only take one value, while `one_of` can take multiple values. If multiple fields are specified, they are combined using a logical `OR` operator.

**Limitations:**

*   The `greater` and `less` operators are not supported under certain conditions. Both operators are permitted unless the API documentation states otherwise.
*   A subset of Commerce APIs handle queries with multiple fields differently. If the query has multiple fields, the query is internally handled as a logical `OR` of `DisjointMaxQueries` (with the dismax matching a value against all fields). The dismax makes sure that a document carrying a single term in multiple fields does not get higher scores than a document matching multiple terms in multiple fields.

*   `fields` (_array of Field_, required) The document fields that the values are matched against, combined with the operator.  
    Minimum items: 1.
*   `operator` (_string_, required) Returns the operator to use for the term query.  
    Allowed values: `is`, `one_of`, `is_null`, `is_not_null`, `less`, `greater`, `not_in`, `neq`. Example: `is`.
*   `values` (_array of string | number | boolean | integer_) The values that the fields are compared against, combined with the operator.  
    Items: Example: `myCouponId`.

### TextQuery

A text query is used to match some text (for example, a search phrase possibly consisting of multiple terms) against one or more fields. When multiple fields are provided, the phrase conceptually forms a logical `OR` over the fields. In this case, the terms of the phrase basically have to match within the text, that would result in concatenating all given fields.

*   `fields` (_array of Field_, required) The document fields that the search phrase matches against.  
    Minimum items: 1.
*   `searchPhrase` (_string_, required) A search phrase, which can include multiple terms separated by spaces.  
    Example: `campaign summer`.

_Example_

```
{
  "fields": [
    "couponId"
  ],
  "searchPhrase": "limit"
}
```

### RedemptionLimitPerPeriod

Document representing a coupon redemption limit.

*   `limit` (_integer (int32)_, required) The limit on the number of times a coupon can be redeemed for a specified redemption time period.  
    Minimum: 0. Example: `1`.
*   `redemptionTimeFrame` (_integer (int32)_, required) The redemption time period.  
    Minimum: 0. Maximum: 999. Example: `24`.

### ResultBase

Schema defining generic list result. Each response schema of a resource requiring a list response should extend this schema. Additionally it needs to be defined what data is returned.

*   `limit` (_integer (int32)_, required) Maximum records to retrieve per request. The limit with its constraints (minimum, maximum, default) is defined by the request parameter `limit` of the endpoint returning this schema.  
    Example: `10`.
*   `total` (_Total_, required)

### Filter

Contains a set of objects that define criteria used to select records. A filter can contain one of the following:

*   `TermFilter`

*   Matches records where a field (or fields) exactly matches some simple value (including `null`).

*   `RangeFilter`

*   Matches records where a field value lies within a specified range.

*   `Range2Filter`

*   Matches records in a specified range across fields.

*   `QueryFilter`

*   Matches records based on a query.

*   `BoolFilter`

*   Provides filtering of records using a set of filters combined using a logical operator.

Minimum properties: 1. Maximum properties: 1.

*   `boolFilter` (_BoolFilter_)
*   `queryFilter` (_QueryFilter_)
*   `range2Filter` (_Range2Filter_)
*   `rangeFilter` (_RangeFilter_)
*   `termFilter` (_TermFilter_)

### Field

Name of the field. Might be a custom field name prefixed with c\_.

Type: `string`.

Maximum length: 260. Example: `couponId`.

### Total

The total number of hits that match the search's criteria. This can be greater than the number of results returned as search results are pagenated.

Type: `integer (int32)`.

Default: `0`. Minimum: 0. Example: `10`.

### BoolFilter

Allows you to combine other filters into (possibly recursive) logical expression trees. A boolean filter is composed of a logical operator (`AND`, `OR`, `NOT`) and a list of filters that the operator relates to. Multiple filters can be negated with a single `NOT` operator, even when the filters are combined with the `AND` operator.

*   `filters` (_array of Filter_) A list of filters that are logically combined by an operator.
*   `operator` (_string_, required) The logical operator that is used to combine the filters.  
    Allowed values: `and`, `or`, `not`. Example: `and`.

_Example_

```
{
  "operator": "and",
  "filters": [
    {
      "termFilter": {
        "field": "id",
        "operator": "is",
        "values": [
          "myId"
        ]
      }
    },
    {
      "termFilter": {
        "field": "couponId",
        "operator": "is",
        "values": [
          "couponOne"
        ]
      }
    }
  ]
}
```

### QueryFilter

Wraps any query and allows it to be used as a filter.

*   `query` (_Query_, required)

### Range2Filter

Allows you to restrict a search result to hits where a range defined by specified attributes has a certain relationship to a specified range.

The first range (R1) is defined by a pair of attributes (`fromField` and `toField`) that specify the extent of a range, such as attributes `validFrom` and `validTo`.

The second range (R2) is defined by `fromValue` and `toValue`.

The filter mode specifies the method used to compare the two ranges:

*   `overlap`: R1 overlaps fully or partially with R2.
*   `containing`: R1 contains R2.
*   `contained`: R1 is contained in R2.

The range filter supports several value types, and relies on the natural sorting of the value type for range interpretation. Value ranges can be open-ended, but only at one end of the range. You can configure whether the lower bounds and upper bounds are inclusive or exclusive.

A range 2 filter is useful for general restrictions that can be shared between searches (like a static date range) because the filter result is cached in memory. Range filters are not appropriate if the range is expected to be different for every query (for example, if the user controls the date range down to the hour via a UI control). Range filters are inclusive by default.

*   `filterMode` (_string_) Compare mode: overlap, containing, or contained.  
    Allowed values: `overlap`, `containing`, `contained`. Default: `overlap`. Example: `overlap`.
*   `fromField` (_object_, required) The field name of the field that starts the first range.  
    Example: `validFrom`.
    
    Includes all fields of `Field`.
    
    Example: `validFrom`.
    
*   `fromInclusive` (_boolean_) A flag indicating if the lower bound of the second range is inclusive. To make the lower bound exclusive, set to `false`.  
    Default: `true`. Example: `true`.
*   `fromValue` (_any_) The lower bound of the second range. If not specified, the range is open-ended with respect to the lower bound. You can't leave both the lower and upper bounds open-ended.  
    Example: `2007-01-01T00:00:00.000Z`.
*   `toField` (_object_, required) The field name of the field that ends the first range.  
    Example: `validTo`.
    
    Includes all fields of `Field`.
    
    Example: `validTo`.
    
*   `toInclusive` (_boolean_) A flag indicating if the upper bound of the second range is inclusive. To make the lower bound exclusive, set to `false`.  
    Default: `true`. Example: `true`.
*   `toValue` (_any_) The upper bound of the second range. If not specified, the range is open-ended with respect to the upper bound. You can't leave both the upper and lower bounds open-ended.  
    Example: `2017-01-01T00:00:00.000Z`.

_Example_

```
{
  "fromField": "validFrom",
  "toField": "validTo",
  "filterMode": "overlap",
  "fromValue": "2007-01-01T00:00:00.000Z",
  "toValue": "2017-01-01T00:00:00.000Z"
}
```

### RangeFilter

Allows you to restrict a search result to hits that have values for a given attribute that fall within a given value range. The range filter supports several value types and relies on the natural sorting of the value type for range interpretation. Value ranges can be open-ended, but only at one end of the range. You can configure whether the lower bounds and upper bounds are inclusive or exclusive.

A range filter is useful for general restrictions that can be shared between searches (like a static date range) because the filter result is cached in memory. Range filters are not appropriate if the range is expected to be different for every query (for example, if the user controls the date range down to the hour via a UI control). Range filters are inclusive by default.

*   `field` (_object_, required) The search field.  
    Example: `validFrom`.
    
    Includes all fields of `Field`.
    
    Example: `validFrom`.
    
*   `from` (_string (date-time) | integer | number_) The lower bound of the filter range. If not specified, the range is open-ended with respect to the lower bound. You can't leave both the lower and upper bounds open-ended.
    
    One of: `string (date-time)`, `integer`, `number`.
    
    *   _string (date-time)_
        
        Type: `string (date-time)`.
        
        Example: `2007-01-01T00:00:00.000Z`.
        
    *   _integer_
        
        Type: `integer`.
        
        Example: `1`.
        
    *   _number_
        
        Type: `number`.
        
        Example: `1`.
        
*   `fromInclusive` (_boolean_) A flag indicating if the lower bound of the range is inclusive. To make the lower bound exclusive, set to `false`.  
    Default: `true`. Example: `true`.
*   `to` (_string (date-time) | integer | number_) The upper bound of the filter range. If not specified, the range is open-ended with respect to the upper bound. You can't leave both the upper and lower bounds open-ended.
    
    One of: `string (date-time)`, `integer`, `number`.
    
    *   _string (date-time)_
        
        Type: `string (date-time)`.
        
        Example: `2007-01-02T00:00:00.000Z`.
        
    *   _integer_
        
        Type: `integer`.
        
        Example: `2`.
        
    *   _number_
        
        Type: `number`.
        
        Example: `2`.
        
*   `toInclusive` (_boolean_) A flag indicating if the upper bound of the range is inclusive. To make the upper bound exclusive, set to `false`.  
    Default: `true`. Example: `true`.

### TermFilter

Allows you to restrict a search result to hits that match exactly one of the values configured for the filter. A term filter is useful for general restrictions that can be shared between searches. Use term filters whenever the criteria you filter on is a shared property of multiple searches (for example, like filtering by an order status). Use term filters for fields that have a discrete and small set of values only.

*   `field` (_object_, required) The filter field.
    
    Includes all fields of `Field`.
    
*   `operator` (_string_, required) The operator used to compare the field's values with the given values.  
    Allowed values: `is`, `one_of`, `is_null`, `is_not_null`, `less`, `greater`, `not_in`, `neq`. Example: `is`.
*   `values` (_array of string_) The filter values.  
    Items: Example: `myId`.

_Example_

```
{
  "field": "id",
  "operator": "is",
  "values": [
    "myId"
  ]
}
```