---
title: "Discount"
permalink: "/docs/api-v2/discount"
description: "Open API Reference Docs for the API"
original_source: "openapi-spec/api-v2.yaml"
---

> **AI agents:** This is the Markdown version of a RevenueCat documentation page. For the complete documentation index, see [llms.txt](https://www.revenuecat.com/docs/llms.txt).


# Developer API (2.0.0)

Download OpenAPI specification:[Download](https://www.revenuecat.com/docs/redocusaurus/openapi-v2-discount.yaml)

## <a id="tag/Discount"></a>Discount

Part of the [REST API v2 Reference](/docs/api-v2).

Operations about RevenueCat Billing discounts.

#### Endpoints

-   [Get a list of discounts](#tag/Discount/operation/list-discounts) — `GET /projects/{project_id}/discounts`
-   [Create a discount](#tag/Discount/operation/create-discount) — `POST /projects/{project_id}/discounts`
-   [Get a discount](#tag/Discount/operation/get-discount) — `GET /projects/{project_id}/discounts/{discount_id}`
-   [Delete a discount](#tag/Discount/operation/delete-discount) — `DELETE /projects/{project_id}/discounts/{discount_id}`
-   [Update a discount offer](#tag/Discount/operation/update-discount-offer) — `PATCH /projects/{project_id}/discounts/{discount_id}`
-   [Enable a discount](#tag/Discount/operation/enable-discount) — `POST /projects/{project_id}/discounts/{discount_id}/actions/enable`
-   [Disable a discount](#tag/Discount/operation/disable-discount) — `POST /projects/{project_id}/discounts/{discount_id}/actions/disable`
-   [List discount codes for a discount](#tag/Discount/operation/list-discount-codes) — `GET /projects/{project_id}/discounts/{discount_id}/discount_codes`
-   [Create discount codes for a discount](#tag/Discount/operation/create-discount-codes) — `POST /projects/{project_id}/discounts/{discount_id}/discount_codes`
-   [Delete a discount code from a discount](#tag/Discount/operation/delete-discount-code) — `DELETE /projects/{project_id}/discounts/{discount_id}/discount_codes/{discount_code}`

## <a id="tag/Discount/operation/list-discounts"></a>Get a list of discounts

get/projects/{project_id}/discounts

https://api.revenuecat.com/v2/projects/{project_id}/discounts

Lists RevenueCat Billing discounts for the project. This endpoint requires the following permission(s): `project_configuration:discounts:read`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### query Parameters

- `starting_after`: string Example: starting_after=ent12354 — Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page.
- `limit`: integer Default: 20 Example: limit=10 — Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "discount",
      "id": "discnt1a2b3c4d5e",
      "identifier": "spring_2026",
      "customer_facing_name": "Spring sale",
      "type": "percentage",
      "duration_mode": "one_time",
      "eligibility": "everyone",
      "time_window": "P1M",
      "disabled_at": 1762273200000,
      "percentage": 20,
      "created_at": 1762270200000,
      "updated_at": 1762270200000
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/discounts?starting_after=discntab21dac",
  "url": "/v2/projects/proj1ab2c3d4/discounts"
}
```

## <a id="tag/Discount/operation/create-discount"></a>Create a discount

post/projects/{project_id}/discounts

https://api.revenuecat.com/v2/projects/{project_id}/discounts

Creates a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### Request Body schema: application/json

required

- `identifier` (required): string [ 1 .. 100 ] characters — The customizable discount identifier (developer-defined).
- `customer_facing_name` (required): string [ 3 .. 1024 ] characters — Name displayed to customers for this discount.
- `type` (required): string Enum: "percentage" "fixed_amount" — The type of discount to apply.
- `percentage`: integer [ 1 .. 100 ] — Percentage value for percentage discounts.
- `fixed_amounts`: object — Fixed amount values by currency for fixed amount discounts.
    - `currency` (required): string \= 3 characters
    - `amount` (required): number `double`
- `duration_mode` (required): string Enum: "one_time" "time_window" "forever" — The discount duration mode.
- `eligibility` (required): string Enum: "everyone" "never_purchased" "never_subscribed" "never_subscribed_to_the_same_product" — Eligibility criteria for this discount.
- `time_window`: string^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+...Show pattern — ISO-8601 duration when using time window duration mode.
- `product_identifiers`: Array of strings — Product identifiers that this discount applies to.

### Responses

**201**

Success. The discount was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "percentage": 20,
  "fixed_amounts": {
    "property1": {
      "currency": "USD",
      "amount": 4.99
    },
    "property2": {
      "currency": "USD",
      "amount": 4.99
    }
  },
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "product_identifiers": [
    "com.acme.product1",
    "com.acme.product2"
  ]
}
```

### Response samples

Content type

application/json

Example

percentagefixed_amountpercentage

```json
{
  "object": "discount",
  "id": "discnt1a2b3c4d5e",
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "disabled_at": 1762273200000,
  "percentage": 20,
  "created_at": 1762270200000,
  "updated_at": 1762270200000
}
```

## <a id="tag/Discount/operation/get-discount"></a>Get a discount

get/projects/{project_id}/discounts/{discount_id}

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}

Returns a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

Example

percentagefixed_amountpercentage

```json
{
  "object": "discount",
  "id": "discnt1a2b3c4d5e",
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "disabled_at": 1762273200000,
  "percentage": 20,
  "created_at": 1762270200000,
  "updated_at": 1762270200000
}
```

## <a id="tag/Discount/operation/delete-discount"></a>Delete a discount

delete/projects/{project_id}/discounts/{discount_id}

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}

Deletes a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

```json
{
  "object": "app",
  "id": "string",
  "deleted_at": 1658399423658
}
```

## <a id="tag/Discount/operation/update-discount-offer"></a>Update a discount offer

patch/projects/{project_id}/discounts/{discount_id}

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}

Updates a RevenueCat Billing discount offer. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

##### Request Body schema: application/json

required

non-empty

- `customer_facing_name`: string [ 3 .. 1024 ] characters — Name displayed to customers for this discount.
- `type`: string Enum: "percentage" "fixed_amount" — The type of discount to apply.
- `percentage`: integer [ 1 .. 100 ] — Percentage value for percentage discounts.
- `fixed_amounts`: object — Fixed amount values by currency for fixed amount discounts.
    - `currency` (required): string \= 3 characters
    - `amount` (required): number `double`
- `duration_mode`: string Enum: "one_time" "time_window" "forever" — The discount duration mode.
- `eligibility`: string Enum: "everyone" "never_purchased" "never_subscribed" "never_subscribed_to_the_same_product" — Eligibility criteria for this discount.
- `time_window`: string^(-?)P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+...Show pattern — ISO-8601 duration when using time window duration mode.
- `product_identifiers`: Array of strings — Product identifiers that this discount applies to.

### Responses

**200**

Success. The discount offer was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "customer_facing_name": "Spring sale 2026",
  "type": "percentage",
  "percentage": 25,
  "fixed_amounts": {
    "property1": {
      "currency": "USD",
      "amount": 4.99
    },
    "property2": {
      "currency": "USD",
      "amount": 4.99
    }
  },
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "product_identifiers": [
    "com.acme.product1",
    "com.acme.product2"
  ]
}
```

### Response samples

Content type

application/json

Example

percentagefixed_amountpercentage

```json
{
  "object": "discount",
  "id": "discnt1a2b3c4d5e",
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "disabled_at": 1762273200000,
  "percentage": 20,
  "created_at": 1762270200000,
  "updated_at": 1762270200000
}
```

## <a id="tag/Discount/operation/enable-discount"></a>Enable a discount

post/projects/{project_id}/discounts/{discount_id}/actions/enable

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}/actions/enable

Enables a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

### Responses

**200**

Success. The discount was enabled

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

Example

percentagefixed_amountpercentage

```json
{
  "object": "discount",
  "id": "discnt1a2b3c4d5e",
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "disabled_at": 1762273200000,
  "percentage": 20,
  "created_at": 1762270200000,
  "updated_at": 1762270200000
}
```

## <a id="tag/Discount/operation/disable-discount"></a>Disable a discount

post/projects/{project_id}/discounts/{discount_id}/actions/disable

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}/actions/disable

Disables a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

### Responses

**200**

Success. The discount was disabled

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

Example

percentagefixed_amountpercentage

```json
{
  "object": "discount",
  "id": "discnt1a2b3c4d5e",
  "identifier": "spring_2026",
  "customer_facing_name": "Spring sale",
  "type": "percentage",
  "duration_mode": "one_time",
  "eligibility": "everyone",
  "time_window": "P1M",
  "disabled_at": 1762273200000,
  "percentage": 20,
  "created_at": 1762270200000,
  "updated_at": 1762270200000
}
```

## <a id="tag/Discount/operation/list-discount-codes"></a>List discount codes for a discount

get/projects/{project_id}/discounts/{discount_id}/discount_codes

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}/discount_codes

Lists redemption codes for a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

##### query Parameters

- `starting_after`: string Example: starting_after=ent12354 — Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page.
- `limit`: integer Default: 20 Example: limit=10 — Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected.

### Responses

**200**

Success. The discount codes were listed

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "discount_code",
      "code": "SPRING_2026",
      "created_at": 1712145600000
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/discounts/discnt1a2b3c4d5e/discount_codes?starting_after=SPRING_2026",
  "url": "/v2/projects/proj1ab2c3d4/discounts/discnt1a2b3c4d5e/discount_codes"
}
```

## <a id="tag/Discount/operation/create-discount-codes"></a>Create discount codes for a discount

post/projects/{project_id}/discounts/{discount_id}/discount_codes

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}/discount_codes

Creates redemption codes for a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.

##### Request Body schema: application/json

required

- `codes` (required): Array of strings [ 1 .. 10000 ] items [ items [ 1 .. 255 ] characters ^[A-Za-z0-9\_]+$ ] — List of discount codes to create and attach to the discount.

### Responses

**201**

Success. The discount codes were created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Request samples

Content type

application/json

 

```json
{
  "codes": [
    "SPRING_2026"
  ]
}
```

### Response samples

Content type

application/json

 

```json
[
  {
    "object": "discount_code",
    "code": "SPRING_2026",
    "created_at": 1712145600000
  }
]
```

## <a id="tag/Discount/operation/delete-discount-code"></a>Delete a discount code from a discount

delete/projects/{project_id}/discounts/{discount_id}/discount_codes/{discount_code}

https://api.revenuecat.com/v2/projects/{project_id}/discounts/{discount_id}/discount_codes/{discount_code}

Deletes a redemption code from a RevenueCat Billing discount. This endpoint requires the following permission(s): `project_configuration:discounts:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

- `project_id` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project
- `discount_id` (required): string [ 1 .. 255 ] characters Example: discnt1a2b3c4d5e — The id of the RevenueCat Billing discount.
- `discount_code` (required): string [ 1 .. 255 ] characters ^[A-Za-z0-9\_]+$ Example: SPRING_2026 — The discount code to remove from the RevenueCat Billing discount.

### Responses

**200**

Success. The discount code was deleted from the discount

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

```json
{
  "object": "app",
  "id": "string",
  "deleted_at": 1658399423658
}
```

## <a id="tag/Endpoint-Reference"></a>Endpoint Reference

All API v2 resources, one page each. General concepts (authentication, pagination, rate limits, error handling) live on the [API v2 overview](/docs/api-v2).

-   [App](/docs/api-v2/app) — 7 endpoints
-   [Audience](/docs/api-v2/audience) — 6 endpoints
-   [Audit Log](/docs/api-v2/audit-log) — 1 endpoint
-   [Charts & Metrics](/docs/api-v2/charts-and-metrics) — 4 endpoints
-   [Collaborator](/docs/api-v2/collaborator) — 1 endpoint
-   [Customer](/docs/api-v2/customer) — 12 endpoints
-   [Customer Resources](/docs/api-v2/customer/resources) — 8 endpoints
-   [Discount](/docs/api-v2/discount) — 10 endpoints
-   [Entitlement](/docs/api-v2/entitlement) — 10 endpoints
-   [Integration](/docs/api-v2/integration) — 5 endpoints
-   [Invoice](/docs/api-v2/invoice) — 2 endpoints
-   [Offering](/docs/api-v2/offering) — 7 endpoints
-   [Package](/docs/api-v2/package) — 8 endpoints
-   [Paywall](/docs/api-v2/paywall) — 5 endpoints
-   [Paywall Fonts & Media](/docs/api-v2/paywall/assets) — 4 endpoints
-   [Paywall Publishing](/docs/api-v2/paywall/publishing) — 7 endpoints
-   [Product](/docs/api-v2/product) — 8 endpoints
-   [Project](/docs/api-v2/project) — 2 endpoints
-   [Purchase](/docs/api-v2/purchase) — 4 endpoints
-   [Subscription](/docs/api-v2/subscription) — 7 endpoints
-   [Subscription Data Model](/docs/api-v2/subscription-data-model) — full schema reference
-   [Subscription Transactions](/docs/api-v2/subscription-transactions) — 2 endpoints
-   [Virtual Currency](/docs/api-v2/virtual-currency) — 7 endpoints

## Response schema reference

Response examples above mirror the rendered API reference. These field definitions come from the same OpenAPI specification.

### ListDiscounts

- Used by `GET /projects/{project_id}/discounts (200) — Get a list of discounts`

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of Discount — Details about each object.
  - `object` (required): string — one of `discount`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 1–255; The id of the RevenueCat Billing discount.
  - `identifier` (required): string — length 1–100; The customizable discount identifier (developer-defined).
  - `customer_facing_name` (required): string — length 1–1024; Name displayed to customers for this discount.
  - `type` (required): string — one of `percentage`; The type of discount to apply.
  - `duration_mode` (required): string — one of `one_time`, `time_window`, `forever`; The discount duration mode.
  - `eligibility` (required): string — one of `everyone`, `never_purchased`, `never_subscribed`, `never_subscribed_to_the_same_product`; Eligibility criteria for this discount.
  - `time_window`: string or null — ISO-8601 duration when using time window duration mode.
  - `disabled_at`: integer or null (format: `int64`) — Timestamp in ms since epoch when the discount was disabled.
  - `percentage` (required): integer — range 1–100; Percentage value for percentage discounts (1–100).
  - `created_at` (required): integer (format: `int64`) — The date the discount was created at in ms since epoch.
  - `updated_at` (required): integer (format: `int64`) — The date the discount was updated at in ms since epoch.
  - `object` (required): string — one of `discount`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 1–255; The id of the RevenueCat Billing discount.
  - `identifier` (required): string — length 1–100; The customizable discount identifier (developer-defined).
  - `customer_facing_name` (required): string — length 1–1024; Name displayed to customers for this discount.
  - `type` (required): string — one of `fixed_amount`; The type of discount to apply.
  - `duration_mode` (required): string — one of `one_time`, `time_window`, `forever`; The discount duration mode.
  - `eligibility` (required): string — one of `everyone`, `never_purchased`, `never_subscribed`, `never_subscribed_to_the_same_product`; Eligibility criteria for this discount.
  - `time_window`: string or null — ISO-8601 duration when using time window duration mode.
  - `disabled_at`: integer or null (format: `int64`) — Timestamp in ms since epoch when the discount was disabled.
  - `fixed_amount` (required): object — Fixed discount amounts keyed by currency code.
  - `created_at` (required): integer (format: `int64`) — The date the discount was created at in ms since epoch.
  - `updated_at` (required): integer (format: `int64`) — The date the discount was updated at in ms since epoch.
- `next_page` (required): string or null — URL to access the next page of the project's discounts. If not present / null, there is no next page.
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### Discount

- Used by `POST /projects/{project_id}/discounts (201) — Create a discount`
- Used by `GET /projects/{project_id}/discounts/{discount_id} (200) — Get a discount`
- Used by `PATCH /projects/{project_id}/discounts/{discount_id} (200) — Update a discount offer`
- Used by `POST /projects/{project_id}/discounts/{discount_id}/actions/enable (200) — Enable a discount`
- Used by `POST /projects/{project_id}/discounts/{discount_id}/actions/disable (200) — Disable a discount`

- `object` (required): string — one of `discount`; String representing the object's type. Objects of the same type share the same value.
- `id` (required): string — length 1–255; The id of the RevenueCat Billing discount.
- `identifier` (required): string — length 1–100; The customizable discount identifier (developer-defined).
- `customer_facing_name` (required): string — length 1–1024; Name displayed to customers for this discount.
- `type` (required): string — one of `percentage`; The type of discount to apply.
- `duration_mode` (required): string — one of `one_time`, `time_window`, `forever`; The discount duration mode.
- `eligibility` (required): string — one of `everyone`, `never_purchased`, `never_subscribed`, `never_subscribed_to_the_same_product`; Eligibility criteria for this discount.
- `time_window`: string or null — ISO-8601 duration when using time window duration mode.
- `disabled_at`: integer or null (format: `int64`) — Timestamp in ms since epoch when the discount was disabled.
- `percentage` (required): integer — range 1–100; Percentage value for percentage discounts (1–100).
- `created_at` (required): integer (format: `int64`) — The date the discount was created at in ms since epoch.
- `updated_at` (required): integer (format: `int64`) — The date the discount was updated at in ms since epoch.
- `object` (required): string — one of `discount`; String representing the object's type. Objects of the same type share the same value.
- `id` (required): string — length 1–255; The id of the RevenueCat Billing discount.
- `identifier` (required): string — length 1–100; The customizable discount identifier (developer-defined).
- `customer_facing_name` (required): string — length 1–1024; Name displayed to customers for this discount.
- `type` (required): string — one of `fixed_amount`; The type of discount to apply.
- `duration_mode` (required): string — one of `one_time`, `time_window`, `forever`; The discount duration mode.
- `eligibility` (required): string — one of `everyone`, `never_purchased`, `never_subscribed`, `never_subscribed_to_the_same_product`; Eligibility criteria for this discount.
- `time_window`: string or null — ISO-8601 duration when using time window duration mode.
- `disabled_at`: integer or null (format: `int64`) — Timestamp in ms since epoch when the discount was disabled.
- `fixed_amount` (required): object — Fixed discount amounts keyed by currency code.
- `created_at` (required): integer (format: `int64`) — The date the discount was created at in ms since epoch.
- `updated_at` (required): integer (format: `int64`) — The date the discount was updated at in ms since epoch.

### DeletedObject

- Used by `DELETE /projects/{project_id}/discounts/{discount_id} (200) — Delete a discount`
- Used by `DELETE /projects/{project_id}/discounts/{discount_id}/discount_codes/{discount_code} (200) — Delete a discount code from a discount`

- `object` (required): string — one of `app`, `chart_annotation`, `customer`, `discount`, `discount_code`, `entitlement`, `experiment`, `offering`, `package`, `paywall`, `product`, `virtual_currency`, `webhook_integration`; The type of the deleted object
- `id` (required): string — The ID of the deleted object
- `deleted_at` (required): integer (format: `int64`) — The date when the object was deleted in ms since epoch

### ListDiscountCodes

- Used by `GET /projects/{project_id}/discounts/{discount_id}/discount_codes (200) — List discount codes for a discount`

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of DiscountCode — Details about each discount code.
  - `object` (required): string — one of `discount_code`; String representing the object's type.
  - `code` (required): string — length 1–255; The discount code value.
  - `created_at` (required): integer (format: `int64`) — Time when this discount code was created in milliseconds since epoch.
- `next_page` (required): string or null — URL to access the next page of the discount codes list. If not present / null, there is no next page.
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### Create discount codes for a discount response

- Used by `POST /projects/{project_id}/discounts/{discount_id}/discount_codes (201) — Create discount codes for a discount`

- `object` (required): string — one of `discount_code`; String representing the object's type.
- `code` (required): string — length 1–255; The discount code value.
- `created_at` (required): integer (format: `int64`) — Time when this discount code was created in milliseconds since epoch.
