info:
  title: Developer API
  version: 2.0.0
tags:
  - name: App
    description: Operations about apps.
  - name: Audit Log
    description: Operations about audit logs.
  - name: Charts & Metrics
    description: Operations about chart metrics.
  - name: Collaborator
    description: Operations about collaborators.
  - name: Customer
    description: Operations about customers.
  - name: Entitlement
    description: Operations about entitlements.
  - name: Offering
    description: Operations about offerings.
  - name: Package
    description: Operations about packages.
  - name: Product
    description: Operations about products.
  - name: Virtual Currency
    description: Operations about virtual currencies.
  - name: Purchase
    description: Operations about purchases.
  - name: Subscription
    description: Operations about subscriptions.
  - name: Invoice
    description: Operations about invoices.
  - name: Paywall
    description: Operations about paywalls.
  - name: Integration
    description: Operations about integrations.
  - name: Project
    description: Operations about projects.
  - name: Subscription Data Model
    x-modelReference: true
    description: >
      <SchemaDefinition schemaRef="#/components/schemas/Subscription"
      showReadOnly={true} showWriteOnly={true} />
  - name: Overview (v2)
    x-traitTag: true
    description: >
      <div class="theme-admonition theme-admonition-info alert alert--info">
        <div class="heading">New to RevenueCat?</div>
        <div>Welcome! If you're adding subscriptions or other in-app purchases to your app, the RevenueCat SDK will handle most of the heavy-lifting without the need to interact with this API directly. See our <a href="/docs/getting-started/quickstart">Quickstart</a> for more information on getting started with RevenueCat.</div>
      </div>


      ## About RevenueCat’s REST API


      RevenueCat provides a REST API for developers to perform customer and
      transaction related actions from their own server.


      Most of this API is geared toward client usage via RevenueCat’s SDK, but
      there are various endpoints that can be used for refunding purchases,
      granting promotional entitlements, and other sensitive actions that can
      only be done via a Secret API key from your server.


      ## Should I use this REST API or the RevenueCat SDK?


      If you’re adding subscriptions or other in-app purchases to your app for
      the first time or if you don’t have a backend that stores your user’s
      receipts, you’re probably looking to implement the [RevenueCat
      SDK](/docs/getting-started/installation).


      If you want to start migrating your existing users to RevenueCat and you
      have your user’s receipts stored on your own server, or you want to check
      subscription status of your users from your own server, the REST API is a
      great solution.


      ## Base URL


      The base URL for the RevenueCat REST API v2 is
      `https://api.revenuecat.com/v2`.


      ## Authentication


      Authentication for the RevenueCat REST API is achieved by setting the
      `Authorization` header with a valid API key. You'll find two types of API
      keys in your RevenueCat dashboard: _public_ and _secret_.


      Certain endpoints require secret keys, which should be kept out of any
      publicly accessible areas such as GitHub, client-side code, and so forth.
      See our [Authentication guide](/docs/welcome/authentication) for more
      information.


      ```text title="Authorization Header"

      Authorization: Bearer YOUR_REVENUECAT_API_KEY

      ```


      <div class="theme-admonition theme-admonition-info alert alert--warning">
        <div class="heading">
          Authorization type `Bearer` required in header
        </div>
        <div>
          he RevenueCat REST API v2 requires stating the authorization type `Bearer` in the `Authorization` header before the API key in accordance with [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235). This is different to the v1 API which allowed passing just the API key as the `Authorization` header.
        </div>
      </div>


      <div class="theme-admonition theme-admonition-info alert alert--warning">
        <div class="heading">
          API v1 keys will not work with REST API v2
        </div>
        <div>
          In order to utilize the RevenueCat API v2, please create new v2 secret keys and define your permissions.
        </div>
      </div>


      ## API v2 Permissions


      You can create a new secret API key in your project settings page > API
      keys. Select _+ New_.


      ![](https://www.revenuecat.com/docs/images/c640edd-image.png)


      Give it a name, select `V2` as the version, and set your permissions. Be
      sure to select _Generate_ at the top right corner.


      ![](https://www.revenuecat.com/docs/images/842f5ae-image.png)


      Each endpoint in this documentation will contain a description informing
      you which permissions are required.


      ## Request Payload


      The body of the `POST` requests should be encoded in JSON and have the
      'Content-Type' header set to 'application/json'.


      ```text title="Content-Type Header"

      Content-Type: application/json

      ```


      ```json title="Sample Body"

      {
        "app_user_id": "user-1456",
        "fetch_token": "MQABC...EFH1234="
      }

      ```


      ## Params


      <div class="theme-admonition theme-admonition-info alert alert--warning">
        <div class="heading">Encode your URL params</div>
        <div>For URL params, such as the `app_user_id`, make sure you URL encode them before using them.</div>
      </div>
  - name: Pagination
    x-traitTag: true
    description: >-
      Top-level API resources have support for bulk fetches via "list" API
      methods. For instance, you can list products, list entitlements, and list
      offerings. These list API methods share a common structure, taking at
      least these two parameters: `limit` and `starting_after`.


      When a response or a field contains multiple entities of the same type, it
      returns a `list` object of the following structure:


      ```json title="JSON"

      {
        "object": "list",
        "items": [{}],
        "next_page": "LIST_BASE_URL?starting_after=LAST_ID",
        "url": "LIST_BASE_URL"
      }

      ```


      Where…


      - `url` is the full path base URL of the list endpoint (i.e., if you make
      a request to this endpoint, you will get the first page), e.g.
      `/v2/projects/{project_id}/products`

      - `next_page` is the URL for the next page, if there is one. If there is
      no next page, the `next_page` field will not be present. Example:
      `/v2/projects/{project_id}/products?starting_after={last_id}`

      - `items` is an array of the entries of the list.


      The `starting_after` query parameter of list endpoints accepts the ID of
      the first list item that will not be part of the list (in other words, the
      ID of the last item of the previous page).


      At the moment we only support forward pagination.


      ## Parameters


      `limit` _optional, default is 20_


      A limit on the number of objects to be returned.


      `starting_after` _optional_


      A cursor for use in pagination. `starting_after` is an object ID that
      defines your place in the list. For instance, if you make a list request
      and receive 20 objects, ending with foo, your subsequent call can include
      `starting_after=foo` in order to fetch the next page of the list.
  - name: Rate Limit
    x-traitTag: true
    description: >
      API v2 uses rate limiting to prevent abuse. Rate limits are configured per
      domain, and all endpoints within the same domain share the same rate
      limit.


      ## Rate Limits by Domain


      | Domain | Rate Limit (requests per minute) |

      |--------|-----------------------------------|

      | Customer Information | 480 |

      | Charts & Metrics | 25 |

      | Project Configuration | 60 |

      | Virtual Currencies | 480 |


      Each endpoint belongs to one of these domains. The rate limit applies per
      API key (for app-level keys) or per developer (for developer-level keys).


      ## Rate Limit Headers


      We will return the following headers on all successful requests:


      * `RevenueCat-Rate-Limit-Current-Usage`: the number of executed requests
      for the current rate limiting period, including the current request. The
      rate limiting period is one minute.

      * `RevenueCat-Rate-Limit-Current-Limit`: the limit in requests per minute
      for this endpoint


      If you reach the rate limit, as indicated by a 429 error code, we will
      also include the following header:


      * `Retry-After`: the number of seconds to wait until you can retry this
      request.


      Below is an example of the response body that will be sent when the rate
      limit is reached. The value of the `backoff_ms` field corresponds to the
      `Retry-After`` header but specified in milliseconds.


      ```

      {
        "type": "rate_limit_error",
        "message": "Rate limit exceeded",
        "retryable": true,
        "doc_url": "https://errors.rev.cat/rate-limit-error",
        "backoff_ms": 1000
      }

      ```
  - name: Expandables
    x-traitTag: true
    description: >
      Expandables allow you to retrieve related data along with the request
      without making additional requests. Fields in the REST API will allow you
      to request additional information as an expanded response by using the
      `expand` query parameter.


      For example, a `product` object will have an associated `app_id` field.
      This `app_id` field can be expanded in the same request with the `expand`
      query parameter and will include an `app` object in the response.


      ### Without `expand` query param


      ```json title="GET /products/prod1a2b3c4d5"

      {
        "object": "product",
        "id": "prod1a2b3c4d5e",
        "store_identifier": "rc_1w_199",
        "type": "subscription",
        "subscription": {
          "duration": "P1M",
          "grace_period_duration": "P3D",
          "trial_duration": "P1W"
        },
        "created_at": 1658399423658,
        "app_id": "app1a2b3c4"
      }

      ```


      ### With `expand` query param:


      ```json title="GET /products/prod1a2b3c4d5?expand=app"

      {
        "object": "product",
        "id": "prod1a2b3c4d5e",
        "store_identifier": "rc_1w_199",
        "type": "subscription",
        "subscription": {
          "duration": "P1M",
          "grace_period_duration": "P3D",
          "trial_duration": "P1W"
        },
        "created_at": 1658399423658,
        "app_id": "app1a2b3c4",
        "app": {
          "id": "app1a2b3c4",
          "name": "string",
          "created_at": 1658399423658,
          "type": "amazon",
          "project_id": "proj1a2b3c4"
        }
      }

      ```


      As you can see from above, the `app_id` field remains the same, but the
      response contains an additional `app` object.


      Fields that can be expanded into objects are indicated in the endpoint
      documentation under **Query Params** and will list accepted values.

      Also, the required permissions to be defined in the API key are listed
      there.
  - name: Error Handling
    x-traitTag: true
    description: >-
      RevenueCat uses [standard HTTP status
      codes](#tag/Error-Handling/Error-Codes) to indicate the success or failure
      of an API request. Codes in the `2XX` range indicate the request was
      successful. `4XX` codes indicate an error caused by the client. `5XX`
      codes indicate an error in RevenueCat servers.


      Successful modifications return the modified entity. Errors return the
      following fields:


      ```json title="Sample Error Response"

      {
        "type": "parameter_error",
        "param": "customer_id",
        "message": "id is too long",
        "retryable": false,
        "doc_url": "https://errors.rev.cat/parameter-error"
      }

      ```


      For more information on the `type` field and how to resolve these errors,
      please visit our [Error Types](#tag/Error-Handling/Error-Types)
      documentation.


      ## Error Codes


      | Code | Name                  |
      Description                                                                                                                                                                                         
      |

      | :--- | :-------------------- |
      :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      |

      | 200  | OK                    | Processed as
      expected                                                                                                                                                                               
      |

      | 201  | Created               | Entity was
      created                                                                                                                                                                                  
      |

      | 202  | Accepted              | Request acknowledged, but cannot be
      processed in real time (for instance, async
      job)                                                                                                                
      |

      | 204  | No content            | The request was successful and there was
      no content that could be
      returned                                                                                                                          
      |

      | 400  | Bad Request           | Client
      error                                                                                                                                                                                        
      |

      | 401  | Unauthorized          | Not
      authenticated                                                                                                                                                                                   
      |

      | 403  | Forbidden             | Authorization
      failed                                                                                                                                                                                
      |

      | 404  | Not Found             | No resource was
      found                                                                                                                                                                               
      |

      | 409  | Conflict              | Uniqueness constraint
      violation                                                                                                                                                                     
      |

      | 418  | I'm a teapot          | RevenueCat refuses to brew
      coffee                                                                                                                                                                   
      |

      | 422  | Unprocessable entity  | The request was valid and the syntax
      correct, but we were unable to process the contained
      instructions.                                                                                             
      |

      | 423  | Locked                | The request conflicted with another
      ongoing
      request                                                                                                                                                 
      |

      | 429  | Too Many Requests     | Being [rate
      limited](#tag/Rate-Limit)                                                                                                                                                                
      |

      | 500  | Internal Server Error | The RevenueCat server ran into an
      unexpected problem – please check the [RevenueCat status
      page](https://status.revenuecat.com/) for any known outages and/or report
      the issue to RevenueCat support |

      | 502  | Bad Gateway           | Invalid response from an upstream
      server                                                                                                                                                            
      |

      | 503  | Service Unavailable   | There wasn’t a server to handle the
      request                                                                                                                                                         
      |

      | 504  | Gateway Timeout       | We could not get the response in time
      from the upstream
      server                                                                                                                                      
      |


      ## Error Types

      ### `authentication_error`


      Authentication is not valid for the given API key. Double check your API
      key.


      ### `authorization_error`


      The API key does not belong the project you specified. Double check that
      your API key is associated with the IDs you are passing.


      ### `invalid_request`


      This error can be due to several reasons:


      - `Content-Type: application/json` is missing in the request header for
      `POST`/`PUT`/`PATCH` requests

      - Using the incorrect HTTP method on a path (i.e: `GET
      …/entitlements/<entitlements_id>/actions/attach_products`)


      ### `parameter_error`


      The parameter provided is invalid. Please refer to the `message` field for
      more information.


      - IDs (e.g: `entitlement_id`, `project_id`, etc): 1 to 255 characters

      - `display_name`(applies to Entitlements): 1 to 1000 characters

      - `lookup_key`(applies to Entitlements): 1 to 200 characters


      ### `rate_limit_error`


      The request has hit the [rate limit](#tag/Rate-Limit) for this endpoint.
      Refer to the `backoff_ms` field to determine how many milliseconds to wait
      before making another request to the same endpoint.


      ### `resource_missing`


      The resource with the specific ID does not exist. Double check the IDs
      (e.g: product ID, entitlement ID, etc) you are passing into the endpoints.


      ### `resource_already_exists`


      The resource with the specific ID already exists. Use a different, unique
      value for ID and try again.


      ### `resource_locked_error`


      The resource is currently being modified by a concurrent request. Refer to
      the `backoff_ms` field to determine when to try again.


      ### `server_error`


      Request is not able to be processed due to an internal server error. Refer
      to the `backoff_ms` field to determine when to try again. Please report
      this to the RevenueCat team if you are encountering this issue.


      ### `store_error`


      There was a problem with the stores (e.g: Apple App Store, Google Play
      Store, etc). This typically occurs when the stores are unable to process
      the request. Refer to the `backoff_ms` field to determine when to try
      again.


      ### `unprocessable_entity_error`


      Request is not able to be processed. Please refer to the `message` field
      for more information.


      ### `entity_references_archived_entities`


      The entity you are trying to make active references other entities that
      are currently inactive (archived). The `referenced_object_ids` field
      contains the IDs of the inactive entities that need to be made active
      before the operation can succeed. Make those entities active first, then
      retry the request.
  - name: Representation of Subscriptions
    x-traitTag: true
    description: >-
      In comparison to our [v1 REST API](/docs/api-v1#tag/customer_info_model),
      we have made changes to improve the organization and accessibility of your
      customers’ subscriptions. The data model used in the RevenueCat REST API
      v2 has several advantages. Firstly, it better abstracts differences
      between different app stores, making it easier for you to access your data
      without needing to understand the specificities and idiosyncrasies of each
      individual store. 


      Additionally, the REST API v2 subscription data model provides richer
      information regarding your subscription data and includes new fields such
      as:


      - `gives_access`: Rather than having to create your own logic to determine
      if a customer should have access, we will provide you with that
      information directly.

      - `auto_renewal_status`: Previously you would have to use
      `unsubscribe_detected_at`, `billing_issues_detected_at`, and other fields
      to determine the auto renewal status of the customer, now we include this
      information to take away the estimation work.

      - `status`: Gives you a quick and easy way to gather the status of the
      customer’s subscription to determine what state they are currently in.

      - `store_subscription_identifier`: Whereas the old data model was missing
      the store’s subscription identifier (aka the transaction ID directly from
      the stores), we have included this new field to help identify your
      customer’s subscription.

      - `total_revenue_in_usd`: You can easily determine how much a customer has
      spent for this subscription in USD and utilize it for your own bookkeeping
      purposes. This object also contains information such as gross, commission,
      tax, and proceeds to help you break down the customer’s revenue. 


      To view more details of fields we have included for the subscription
      object, check out the [model reference](#tag/Subscription-Data-Model). 


      Eventually we will also expose this sort of information in webhooks and
      customer event details to incorporate the new data model throughout
      RevenueCat.


      ## What constitutes a new subscription


      Different stores supported by RevenueCat have different logic to define
      what is a new subscription vs. a change to an existing subscription. To
      make it easier to handle subscriptions across different stores, the data
      model for the RevenueCat REST API v2 is now following a consistent
      definition of what continues the same subscription vs. a new one:


      - After a subscription has lapsed (e.g: after a billing retry or letting
      subscription expire after an unsubscribe), if a customer subscribes to the
      same product it will be considered a new subscription (this was previously
      treated differently on Apple App Store vs. Google Play Store)

      - If the product of a paid subscription is changed, the subscription to
      the new product will be considered a new subscription. An exception is
      product changes during a trial period, the post-trial subscription period
      to a different product will not be considered a new subscription, but a
      regular trial conversion

      - For family shared subscriptions:
        - Family shared subscriptions will be considered as a new subscription (albeit with no revenue)
        - If family sharing access is revoked and later re-enabled, this will be considered as a new subscription

      ### Diagrams for different cases


      #### Billing issue: unrecovered


      ![](/docs/images/api-v2/b39dda4-Billing_issue__unrecovered.png)



      #### Billing issue: recovered


      ![](/docs/images/api-v2/312e3fd-Billing_issue__recovered.png)



      #### Lapsed subscription


      ![](/docs/images/api-v2/dca8cda-Lapsed_subscription.png)



      #### Product changes: upgrade (no trial)


      ![](/docs/images/api-v2/1a8e689-Product_changes__upgrade_no_trial.png)



      #### Product changes: downgrade (no trial)


      ![](/docs/images/api-v2/ae7edfc-Product_changes__downgrade_no_trial.png)



      #### Product changes (with trial)


      ![](/docs/images/api-v2/a4e8115-Product_changes_with_trial.png)



      #### Subscription paused: Recovery


      ![](/docs/images/api-v2/4fa17e9-Subscription_paused__Recovery.png)



      #### Subscription paused: Billing issue, recovered


      ![](/docs/images/api-v2/a10133d-Subscription_paused__Billing_issue_recoverd.png)



      #### Subscription paused: Billing issue, unrecovered


      ![](/docs/images/api-v2/6fa24fb-Subscription_paused__Billing_issue_unrecovered.png)



      #### Family shared subscriptions


      ![](/docs/images/api-v2/1511106-Family_shared_subscriptions.png)



      #### Family shared subscriptions: regranted


      ![](/docs/images/api-v2/b3134c1-Family_shared_subscriptions__regranted.png)
paths:
  /projects/{project_id}/media_assets:
    post:
      summary: Upload a media asset
      operationId: create-media-asset
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - filename
                - content_type
                - file_data_base64
              properties:
                filename:
                  description: File name for the uploaded image.
                  type: string
                  minLength: 1
                  maxLength: 255
                  example: hero.webp
                content_type:
                  description: MIME type for the uploaded image.
                  type: string
                  enum:
                    - image/jpeg
                    - image/png
                    - image/avif
                    - image/heic
                    - image/heif
                    - image/webp
                  example: image/webp
                file_data_base64:
                  description: Base64-encoded image bytes.
                  type: string
                  minLength: 1
                  maxLength: 2796204
                  example: UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA
      responses:
        '201':
          description: Success. The media asset was uploaded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaAsset'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/paywalls:
    get:
      summary: Get a list of paywalls
      operationId: list-paywalls
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read
      x-release-status: public
      x-expandable-fields:
        - items.offering: project_configuration:offerings:read
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `items.offering` (requires `project_configuration:offerings:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - items.offering
              example: items.offering
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPaywalls'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create a paywall
      operationId: create-paywall
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - type: object
                  additionalProperties: false
                  required:
                    - offering_id
                  properties:
                    offering_id:
                      description: |
                        The ID of the offering the paywall will be created for.
                      type: string
                      minLength: 1
                      maxLength: 200
                      example: ofrng123456789a
                    automatically_scale_font_size:
                      description: >-
                        Whether font sizes should automatically scale for this
                        paywall. Defaults to true.
                      type: boolean
                      default: true
                      example: true
                - $ref: '#/components/schemas/PaywallDraftCreate'
      responses:
        '201':
          description: Success. The paywall was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Paywall'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Create a paywall draft for a project. You can either use the offering
        template shortcut or provide full draft components directly.
         This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/paywalls/{paywall_id}:
    get:
      summary: Get a paywall
      operationId: get-paywall
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read
      x-release-status: public
      x-expandable-fields:
        - offering: project_configuration:offerings:read
        - components: project_configuration:offerings:read
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: paywall_id
          description: ID of the paywall
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pwXXXXXXXXXXXXXX
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `offering` (requires `project_configuration:offerings:read` permission), `components` (requires `project_configuration:offerings:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - offering
                - components
              example: offering
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Paywall'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    patch:
      summary: Update a paywall draft
      operationId: update-paywall
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: paywall_id
          description: ID of the paywall
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pwXXXXXXXXXXXXXX
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PaywallDraftUpdate'
              additionalProperties: false
      responses:
        '200':
          description: Success. The paywall draft was updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Paywall'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Update a paywall draft. If the paywall is already published, this
        updates its draft version without changing the published version.
         This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
    delete:
      summary: Delete a paywall
      operationId: delete-paywall
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: paywall_id
          description: ID of the paywall
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pwXXXXXXXXXXXXXX
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/paywalls/{paywall_id}/versions:
    post:
      summary: Create a paywall version
      operationId: create-paywall-version
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: paywall_id
          description: ID of the paywall
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pwXXXXXXXXXXXXXX
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - name
              properties:
                name:
                  description: A human-readable name for the paywall version snapshot.
                  type: string
                  minLength: 1
                  maxLength: 255
                  example: V2 Orange Accents
      responses:
        '201':
          description: Success. The paywall version was created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaywallVersion'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/paywalls/{paywall_id}/versions/{version_id}:
    get:
      summary: Get a paywall version
      operationId: get-paywall-version
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read
      x-release-status: public
      tags:
        - Paywall
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: paywall_id
          description: ID of the paywall
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pwXXXXXXXXXXXXXX
        - name: version_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 255
          description: The id of the paywall version.
          example: pwv123456789abcdef
      responses:
        '200':
          description: Success. The paywall version was returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaywallVersion'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/apps/{app_id}/public_api_keys:
    get:
      summary: Get a list of the public API keys of an app
      description: >-
        Returns public API keys for the app. RC Checkout public keys are
        omitted. Sandbox keys are always included. Production keys are omitted
        when the app uses Stripe or Web Billing and the linked Stripe connected
        account is sandbox or test-only (same behavior as the RevenueCat
        dashboard list).
         This endpoint requires the following permission(s): <code>project_configuration:apps:read</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      operationId: list-app-public-api-keys
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          description: ID of the app
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: app1ab2c3d4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPublicApiKeys'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects:
    get:
      summary: Get a list of projects
      operationId: list-projects
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:projects:read
      x-release-status: public
      tags:
        - Project
      parameters:
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListProjects'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:projects:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Creates a new project
      operationId: create-project
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:projects:read_write
      x-release-status: public
      tags:
        - Project
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectCreate'
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:projects:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/apps:
    get:
      summary: Get a list of apps
      operationId: list-apps
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListApps'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read</code>. This endpoint belongs to
        the <strong>Project Configuration</strong> domain, which has a default
        rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create an app
      operationId: create-app
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read_write
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AppCreate'
              additionalProperties: false
            examples:
              App Store:
                value:
                  name: My App Store App
                  type: app_store
                  app_store:
                    bundle_id: com.apple.Pages
                    shared_secret: 1234567890abcdef1234567890abcdef
                    subscription_private_key: >-
                      -----BEGIN EC PRIVATE KEY-----

                      MHQCAQEEIGAkwOF0qkGO19yJlIzQVcOg+HBfvLL4KDXDtL+MMHk2oAcGBSuBBAAK

                      oUQDQgAEhDP7RaX4c6qOHkE1nIWMr5C90ybtr87VRGFm4VsfWqG47NPN+/dHcfwJ

                      JPZGFgMcgvBc37AxQPPQjyXYjhhQDg==

                      -----END EC PRIVATE KEY-----
                    subscription_key_id: 6345942CC3
                    subscription_key_issuer: 5a049d62-1b9b-453c-b605-1988189d8129
              Play Store:
                value:
                  name: My Play Store App
                  type: play_store
                  play_store:
                    package_name: com.android.app
              Stripe:
                value:
                  name: My Stripe App
                  type: stripe
                  stripe:
                    stripe_account_id: acct_adcdef123456
              Amazon:
                value:
                  name: My Amazon App
                  type: amazon
                  amazon:
                    package_name: com.amazon.android.app
                    shared_secret: <Your Amazon Developer Identity Shared Key>
              Web Billing:
                value:
                  name: My RevenueCat App
                  type: rc_billing
                  rc_billing:
                    app_name: <Your app name>
                    default_currency: USD
              Roku:
                value:
                  name: My Roku App
                  type: roku
                  roku:
                    roku_api_key: <Your Roku Pay API Key goes here>
                    roku_channel_id: 123456
                    roku_channel_name: History Channel
              Paddle:
                value:
                  name: My Paddle App
                  type: paddle
                  paddle:
                    paddle_api_key: <Your Paddle API Key goes here>
      responses:
        '201':
          description: Success. The app was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/apps/{app_id}:
    get:
      summary: Get an app
      operationId: get-app
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          description: ID of the app
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: app1ab2c3d4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read</code>. This endpoint belongs to
        the <strong>Project Configuration</strong> domain, which has a default
        rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update an app
      operationId: update-app
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read_write
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          description: ID of the app
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: app1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  description: The name of the app
                  type: string
                  minLength: 1
                  maxLength: 255
                  example: My App
                  nullable: false
                amazon:
                  description: >-
                    Amazon type details. Should only be used when type is
                    amazon.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    package_name:
                      description: The package name of the app
                      type: string
                      minLength: 1
                      maxLength: 256
                      nullable: false
                    shared_secret:
                      description: Your Amazon Developer Identity Shared Key
                      type: string
                      nullable: true
                app_store:
                  description: >-
                    App Store type details. Should only be used when type is
                    app_store.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    bundle_id:
                      description: The bundle ID of the app
                      type: string
                      minLength: 1
                      maxLength: 256
                      nullable: false
                    shared_secret:
                      description: The shared secret of the app
                      type: string
                      minLength: 32
                      maxLength: 32
                      nullable: true
                    subscription_private_key:
                      description: PKCS
                      type: string
                    subscription_key_id:
                      description: >-
                        In App Key id. The ID of the downloaded in app key. You
                        can get it from App Store Connect
                      type: string
                    subscription_key_issuer:
                      description: >-
                        The key Issuer id. See instructions on how to obtain
                        this in
                        https://www.revenuecat.com/docs/in-app-purchase-key-configuration#3-providing-the-issuer-id-to-revenuecat
                      type: string
                    app_store_connect_api_key:
                      description: >-
                        App Store Connect API Key downloaded from App Store
                        Connect in PEM format. Copy the contents of the file in
                        this field. This is optional and used for advanced
                        features like product imports.
                      type: string
                    app_store_connect_api_key_id:
                      description: >-
                        App Store Connect API Key ID. The ID of the downloaded
                        API key. You can get it from App Store Connect.
                      type: string
                    app_store_connect_api_key_issuer:
                      description: App Store Connect API Key Issuer ID.
                      type: string
                    app_store_connect_vendor_number:
                      description: >-
                        Your vendor number from App Store Connect. Required for
                        some features like financial reports.
                      type: string
                mac_app_store:
                  description: >-
                    Legacy Mac App Store type details. Should only be used when
                    type is mac_app_store.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    bundle_id:
                      description: The bundle ID of the app
                      type: string
                      minLength: 1
                      maxLength: 256
                      nullable: false
                    shared_secret:
                      description: The shared secret of the app
                      type: string
                      minLength: 32
                      maxLength: 32
                      nullable: true
                play_store:
                  description: >-
                    Play Store type details. Should only be used when type is
                    play_store.
                  type: object
                  required:
                    - package_name
                  nullable: false
                  additionalProperties: false
                  properties:
                    package_name:
                      description: The package name of the app
                      type: string
                      minLength: 1
                      maxLength: 256
                      nullable: false
                stripe:
                  description: >-
                    Stripe type details. Should only be used when type is
                    stripe.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    stripe_account_id:
                      description: >-
                        It needs to be connected to your RevenueCat account. It
                        can be omitted if you only have a single Stripe account
                        connected to your RevenueCat account.
                      type: string
                      minLength: 1
                      maxLength: 256
                      nullable: false
                rc_billing:
                  description: >-
                    Web Billing type details. Should only be used when type is
                    rc_billing.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    stripe_account_id:
                      description: >-
                        It needs to be connected to your RevenueCat account. It
                        can be omitted if you only have a single Stripe account
                        connected to your RevenueCat account.
                      type: string
                      nullable: true
                      minLength: 1
                      maxLength: 256
                    app_name:
                      description: >-
                        Shown in checkout, emails, and receipts sent to
                        customers.
                      type: string
                      nullable: true
                      minLength: 1
                      maxLength: 256
                    support_email:
                      description: >-
                        Used as the `reply to` address in all emails sent to
                        customers, to allow them to receive support. If you
                        leave this field blank, your RevenueCat account email
                        address will be used.
                      type: string
                      nullable: true
                      minLength: 1
                      maxLength: 320
                    default_currency:
                      $ref: '#/components/schemas/RCBillingCurrency'
                roku:
                  description: >-
                    Roku Channel Store type details. Should only be used when
                    type is roku.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    roku_api_key:
                      description: >-
                        Roku Pay API key provided on the Roku Pay Web Services
                        page.
                      type: string
                      minLength: 33
                      maxLength: 33
                      nullable: true
                    roku_channel_id:
                      description: Channel ID provided on the Roku Channel page.
                      type: string
                      minLength: 6
                      maxLength: 6
                      nullable: true
                    roku_channel_name:
                      description: Channel name that is displayed on the Roku Channel page.
                      type: string
                      minLength: 1
                      maxLength: 30
                      nullable: true
                paddle:
                  description: >-
                    Paddle Billing type details. Should only be used when type
                    is paddle.
                  type: object
                  nullable: false
                  additionalProperties: false
                  properties:
                    paddle_api_key:
                      description: >-
                        Paddle Server-side API key provided on the Paddle
                        dashboard.
                      type: string
                      nullable: true
                      minLength: 50
                      maxLength: 50
                    paddle_is_sandbox:
                      description: Whether the app is tied to the sandbox environment.
                      nullable: false
                      type: boolean
                      example: true
              additionalProperties: false
            examples:
              Update App Store App properties:
                value:
                  name: New App name
                  app_store:
                    bundle_id: com.my.new-app
                    shared_secret: 1234567890abcdef1234567890abcdef
              Update App Store App secret:
                value:
                  app_store:
                    shared_secret: 1234567890abcdef1234567890abcdef
              Remove App Store App secret:
                value:
                  app_store:
                    shared_secret: null
      responses:
        '200':
          description: Success. The app was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    delete:
      summary: Delete an app
      operationId: delete-app
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read_write
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          description: ID of the app
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: app1ab2c3d4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/apps/{app_id}/store_kit_config:
    get:
      summary: Get the StoreKit configuration for an app
      operationId: get-app-storekit-config
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:apps:read
      x-release-status: public
      tags:
        - App
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          description: ID of the app
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: app1ab2c3d4
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StoreKitConfigFile'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:apps:read</code>. This endpoint belongs to
        the <strong>Project Configuration</strong> domain, which has a default
        rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/audit_logs:
    get:
      summary: List audit logs
      operationId: list-audit-logs
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:audit_logs:read
      x-release-status: public
      tags:
        - Audit Log
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          description: >-
            Cursor for pagination. Returns audit logs after the specified audit
            log ID, using descending order by audit log ID.
          in: query
          required: false
          schema:
            type: string
            example: log1ab2c3d4e5
        - name: start_date
          description: Start date for the data range (ISO 8601 format)
          in: query
          schema:
            type: string
            format: date
            example: '2024-01-01'
        - name: end_date
          description: End date for the data range (ISO 8601 format)
          in: query
          schema:
            type: string
            format: date
            example: '2024-12-31'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListAuditLogs'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:audit_logs:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/collaborators:
    get:
      summary: Get a list of collaborators
      operationId: list-collaborators
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:collaborators:read
      x-release-status: public
      tags:
        - Collaborator
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCollaborators'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:collaborators:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/customers:
    get:
      summary: Get a list of customers
      operationId: list-customers
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: search
          description: >-
            Search term used to find matching customers within the project. The
            term is matched against, in order: the $email attribute (exact
            match), the customer's app user IDs, store transaction identifiers
            (Apple, Google Play and Amazon), and Apple order IDs. Email searches
            are paginated; all other identifier searches return a single page of
            matches.
          required: false
          in: query
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: example@example.com
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomers'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
    post:
      summary: Create a customer
      operationId: create-customer
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - id
              properties:
                id:
                  description: The ID of the customer
                  type: string
                  minLength: 1
                  maxLength: 1500
                  pattern: ^[0-9a-zA-Z_-]*$
                  example: 19b8de26-77c1-49f1-aa18-019a391603e2
                attributes:
                  type: array
                  maxLength: 50
                  items:
                    type: object
                    additionalProperties: false
                    required:
                      - name
                      - value
                    properties:
                      name:
                        description: The name of the attribute
                        nullable: false
                        minLength: 1
                        maxLength: 40
                        oneOf:
                          - $ref: '#/components/schemas/CustomerAttributeReservedName'
                          - $ref: '#/components/schemas/CustomerAttributeCustomName'
                        example: $email
                      value:
                        description: The value of the attribute
                        type: string
                        maxLength: 500
                        nullable: false
                        example: cat@revenuecat.com
              additionalProperties: false
      responses:
        '201':
          description: Success. The customer was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}:
    get:
      summary: Get a customer
      operationId: get-customer
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-expandable-fields:
        - attributes: customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `attributes` (requires `customer_information:customers:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - attributes
              example: attributes
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
    delete:
      summary: Delete a customer
      operationId: delete-customer
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
              example:
                object: customer
                id: b5b7bfd2-66fb-4091-af50-7c3cdccfdf24
                deleted_at: 1658399423658
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '202':
          description: Accepted. The customer deletion was queued.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
              example:
                object: customer
                id: b5b7bfd2-66fb-4091-af50-7c3cdccfdf24
                deleted_at: 1658399423658
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/customer_center:
    get:
      summary: Get customer center configuration
      operationId: get-customer-center-config
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: platform
          in: query
          required: false
          description: >
            The platform to process the Customer Center configuration for. When
            provided, returns the locale-selected, platform-filtered
            configuration the customer would see. When omitted, returns the full
            unprocessed configuration for all platforms. Must match a store
            configured on this project.
          schema:
            type: string
            enum:
              - app_store
              - play_store
              - mac_app_store
              - stripe
              - amazon
            example: app_store
        - name: locale
          in: query
          required: false
          description: >
            BCP 47 locale string (e.g. en_US) used to select the appropriate
            localization when platform is provided. When omitted, the
            configuration's default locale is used. Has no effect if platform is
            not provided.
          schema:
            type: string
            example: en_US
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerCenterConfig'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/actions/transfer:
    post:
      summary: >-
        Transfer customer's subscriptions and one-time purchases to another
        customer
      operationId: transfer-customer-data
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
        - customer_information:subscriptions:read_write
        - customer_information:purchases:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - target_customer_id
              properties:
                target_customer_id:
                  nullable: false
                  type: string
                  description: >-
                    The ID of the customer to whom the subscriptions and
                    one-time purchases will be transferred.
                app_ids:
                  nullable: true
                  type: array
                  description: >-
                    Optional. The IDs of the apps to filter the transfer by.
                    When specified, only purchases and subscriptions associated
                    with these apps will be transferred.
                  items:
                    type: string
                    maxLength: 255
                    minLength: 1
                    example: appa2b3c4d5e
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transfer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>,
        <code>customer_information:subscriptions:read_write</code>,
        <code>customer_information:purchases:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/actions/grant_entitlement:
    post:
      summary: Grant an entitlement to a customer
      description: >-
        Grants an entitlement to a customer unless one already exists. As a side
        effect, a promotional subscription is created. This endpoint requires
        the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
      operationId: grant-customer-entitlement
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - entitlement_id
                - expires_at
              properties:
                entitlement_id:
                  nullable: false
                  type: string
                  description: The ID of the entitlement to grant to the customer.
                  minLength: 1
                  maxLength: 255
                  example: entla1b2c3d4e5
                expires_at:
                  nullable: false
                  type: integer
                  format: int64
                  description: >-
                    The date after which the access to the entitlement expires
                    in ms since epoch.
                  example: 1658399423658
      responses:
        '201':
          description: Entitlement granted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement:
    post:
      summary: Revoke a granted entitlement from a customer
      description: >-
        Revokes a granted entitlement from a customer. As a side effect, the
        promotional subscription associated with the granted entitlement is
        expired. This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
      operationId: revoke-customer-granted-entitlement
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - entitlement_id
              properties:
                entitlement_id:
                  nullable: false
                  type: string
                  description: >-
                    The ID of the granted entitlement to revoke from the
                    customer.
                  minLength: 1
                  maxLength: 255
                  example: entla1b2c3d4e5
      responses:
        '200':
          description: Entitlement revoked successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/customers/{customer_id}/actions/assign_offering:
    post:
      summary: Assign or clear an offering override for a customer
      operationId: assign-customer-offering
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - project_configuration:offerings:read
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - offering_id
              properties:
                offering_id:
                  nullable: true
                  type: string
                  description: >-
                    The ID of the offering to assign to the customer. Set to
                    null to clear any existing override.
                  minLength: 1
                  maxLength: 255
                  example: offrng1b2c3d4e5
      responses:
        '200':
          description: Offering assigned successfully
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>,
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/actions/restore_purchase_by_order_id:
    post:
      summary: Restore a Google Play purchase by order ID
      description: >-
        Restores a Google Play purchase to the specified customer using a Google
        Play order ID. This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
      operationId: restore-purchase-by-order-id
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - order_id
              properties:
                order_id:
                  nullable: false
                  type: string
                  description: The Google Play order ID to restore.
                  minLength: 1
                  example: GPA.1234-5678-9012-34567
      responses:
        '200':
          description: Purchase restored successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Customer'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/integrations/webhooks:
    get:
      summary: List webhook integrations
      operationId: list-webhook-integrations
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:integrations:read
      x-release-status: public
      tags:
        - Integration
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListWebhookIntegrations'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:integrations:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create a webhook integration
      operationId: create-webhook-integration
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:integrations:read_write
      x-release-status: public
      tags:
        - Integration
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateWebhookIntegrationInput'
              additionalProperties: false
      responses:
        '201':
          description: Webhook integration created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookIntegration'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:integrations:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/integrations/webhooks/{webhook_integration_id}:
    get:
      summary: Get a webhook integration
      operationId: get-webhook-integration
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:integrations:read
      x-release-status: public
      tags:
        - Integration
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: webhook_integration_id
          in: path
          description: The ID of the webhook integration
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 255
          example: wh_1234567890abcdef
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookIntegration'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:integrations:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update a webhook integration
      operationId: update-webhook-integration
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:integrations:read_write
      x-release-status: public
      tags:
        - Integration
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: webhook_integration_id
          in: path
          description: The ID of the webhook integration
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 255
          example: wh_1234567890abcdef
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateWebhookIntegrationInput'
              additionalProperties: false
      responses:
        '200':
          description: Webhook integration updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookIntegration'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:integrations:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
    delete:
      summary: Delete a webhook integration
      operationId: delete-webhook-integration
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:integrations:read_write
      x-release-status: public
      tags:
        - Integration
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: webhook_integration_id
          in: path
          description: The ID of the webhook integration
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 255
          example: wh_1234567890abcdef
      responses:
        '200':
          description: Webhook integration deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:integrations:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/products/{product_id}:
    get:
      summary: Get a product
      operationId: get-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read
      x-expandable-fields:
        - app: project_configuration:apps:read
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `app` (requires `project_configuration:apps:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - app
              example: app
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:products:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update a product
      operationId: update-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
        - name: expand
          in: query
          description: |
            Specifies which fields in the response should be expanded.
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                display_name:
                  description: The display name of the product
                  type: string
                  maxLength: 1500
              additionalProperties: false
      responses:
        '200':
          description: Success. The product was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:products:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    delete:
      summary: Delete a product
      operationId: delete-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:products:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/products/{product_id}/actions/archive:
    post:
      summary: Archive a product
      operationId: archive-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      description: |-
        Archives a product (makes it inactive).
         This endpoint requires the following permission(s): <code>project_configuration:products:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
      responses:
        '200':
          description: Success. The product was archived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/products/{product_id}/actions/unarchive:
    post:
      summary: Unarchive a product
      operationId: unarchive-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      description: |-
        Unarchives a product (makes it active).
         This endpoint requires the following permission(s): <code>project_configuration:products:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
      responses:
        '200':
          description: Success. The product was unarchived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/products/{product_id}/create_in_store:
    post:
      summary: Push a product to the store
      description: >-
        Push a product to the App Store. 


        **For subscription products**: You must provide store information
        including duration and subscription group details.


        **For in-app purchase products** (consumable, non-consumable,
        non-renewing subscription): No request body is required.
         This endpoint requires the following permission(s): <code>project_configuration:products:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      operationId: create-product-in-store
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: product_id
          description: ID of the product
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: prod1a2b3c4d5
      requestBody:
        required: false
        description: >
          Store-specific information. Only required for subscription products.

          For in-app purchase products, send an empty body or omit the request
          body entirely.
        content:
          application/json:
            schema:
              type: object
              properties:
                store_information:
                  description: >-
                    Store-specific information for creating the product in the
                    store
                  oneOf:
                    - $ref: >-
                        #/components/schemas/CreateAppStoreConnectSubscriptionInput
                    - $ref: >-
                        #/components/schemas/CreateAppStoreConnectInAppPurchaseInput
              additionalProperties: false
            examples:
              App Store Subscription:
                summary: Creating a subscription product
                value:
                  store_information:
                    duration: ONE_MONTH
                    subscription_group_name: Premium Subscriptions
                    subscription_group_id: sub_group_123
              App Store In-App Purchase:
                summary: Creating an in-app purchase product (no body needed)
                value: {}
      responses:
        '201':
          description: Success. The product was pushed to the store
          content:
            application/json:
              schema:
                type: object
                required:
                  - created_product
                properties:
                  created_product:
                    $ref: '#/components/schemas/StoreProduct'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/products:
    get:
      summary: Get a list of products
      operationId: list-products
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read
      x-expandable-fields:
        - items.app: project_configuration:apps:read
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: app_id
          in: query
          schema:
            type: string
            example: app1a2b3c4
          description: >-
            This is an optional query parameter to get a list of products of a
            given entitlement associated with a particular app
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `items.app` (requires `project_configuration:apps:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - items.app
              example: items.app
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListProducts'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:products:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create a product
      operationId: create-product
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:products:read_write
      x-release-status: public
      tags:
        - Product
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - store_identifier
                - app_id
                - type
              properties:
                store_identifier:
                  description: >
                    The store identifier of the product.

                    - For Apple App Store products this is the product ID of the
                    subscription or in-app product.

                    - For Google's Play Store, it should follow the format
                    'productId:basePlanId' for subscription products and SKU for
                    one-time purchase products.

                    - For Stripe, the product identifier that always starts with
                    "prod_"

                    - For Amazon, if it's a subscription, the term SKU of the
                    subscription. If it's a one-time purchase, the SKU of the
                    product.

                    - For Roku, this is the product identifier of the
                    subscription or one-time purchase product.
                  type: string
                  minLength: 1
                  maxLength: 200
                  example: com.revenuecat.magicweather.monthly
                app_id:
                  description: The ID of the app
                  type: string
                  minLength: 1
                  maxLength: 255
                  example: app1a2b3c4
                type:
                  description: The product type
                  nullable: false
                  $ref: '#/components/schemas/ProductType'
                display_name:
                  description: The display name of the product
                  nullable: true
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Premium Monthly 2023
                subscription:
                  nullable: true
                  description: >-
                    Subscription parameters. Only supported for test store
                    products.
                  $ref: '#/components/schemas/ProductSubscriptionInput'
                title:
                  description: >-
                    The user-facing title of the product. This field is required
                    for Test Store products.
                  nullable: true
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Premium Monthly 2023
              additionalProperties: false
            examples:
              App Store:
                value:
                  store_identifier: com.revenuecat.magicweather.monthly9.99
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly 2023
              Play Store Billing Client 4:
                value:
                  store_identifier: com.revenuecat.magicweather.monthly
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly 2023
              Stripe:
                value:
                  store_identifier: prod_LryUFGrmehs0tk
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly 2023
              Amazon:
                value:
                  store_identifier: com.mysubscription.weekly
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly 2023
              Play Store Subscription Billing Client 5:
                value:
                  store_identifier: mySubscription:basePlanId
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly 2023
              Play Store One-time Billing Client 5:
                value:
                  store_identifier: myProductSku
                  app_id: app1a2b3c4
                  type: one_time
                  display_name: Premium Lifetime 2023
              Test Store:
                value:
                  store_identifier: monthly_premium
                  app_id: app1a2b3c4
                  type: subscription
                  display_name: Premium Monthly
                  subscription:
                    duration: P1M
      responses:
        '201':
          description: Success. The product was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        <div class="theme-admonition theme-admonition-info alert
        alert--warning">
          <div class="heading">Warning</div>
          <div>This endpoint does not allow to create Web Billing products.</div>
        This endpoint requires the following permission(s):
        <code>project_configuration:products:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/virtual_currencies:
    get:
      summary: Get a list of virtual currencies
      operationId: list-virtual-currencies
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read
      x-release-status: public
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListVirtualCurrencies'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:virtual_currencies:read</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
    post:
      summary: Create a virtual currency
      operationId: create-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read_write
      x-release-status: public
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - code
                - name
              properties:
                code:
                  description: The unique code for this virtual currency
                  type: string
                  minLength: 1
                  maxLength: 10
                  pattern: ^[a-zA-Z0-9_]+$
                  example: GLD
                name:
                  description: The display name of the virtual currency
                  type: string
                  minLength: 1
                  maxLength: 50
                  example: Gold
                description:
                  description: Description of the virtual currency
                  nullable: true
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Gold currency used in the game
                product_grants:
                  description: >-
                    Product grants that define how products grant this virtual
                    currency
                  nullable: true
                  type: array
                  items:
                    $ref: '#/components/schemas/VirtualCurrencyProductGrantInput'
              additionalProperties: false
      responses:
        '201':
          description: Success. The virtual currency was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualCurrency'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:virtual_currencies:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/virtual_currencies/{virtual_currency_code}:
    get:
      summary: Get a virtual currency
      operationId: get-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read
      x-release-status: public
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: virtual_currency_code
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 10
            pattern: ^[a-zA-Z0-9_]+$
          description: The virtual currency code
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualCurrency'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:virtual_currencies:read</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
    post:
      summary: Update a virtual currency
      operationId: update-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read_write
      x-release-status: public
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: virtual_currency_code
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 10
            pattern: ^[a-zA-Z0-9_]+$
          description: The virtual currency code
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  description: The display name of the virtual currency
                  type: string
                  minLength: 1
                  maxLength: 50
                  example: Gold
                description:
                  description: Description of the virtual currency
                  nullable: true
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Gold currency used in the game
                product_grants:
                  description: >-
                    Product grants that define how products grant this virtual
                    currency
                  nullable: true
                  type: array
                  items:
                    $ref: '#/components/schemas/VirtualCurrencyProductGrantInput'
              additionalProperties: false
      responses:
        '200':
          description: Success. The virtual currency was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualCurrency'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:virtual_currencies:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
    delete:
      summary: Delete a virtual currency
      operationId: delete-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read_write
      x-release-status: public
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: virtual_currency_code
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 10
            pattern: ^[a-zA-Z0-9_]+$
          description: The virtual currency code
      responses:
        '200':
          description: Success. The virtual currency was deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:virtual_currencies:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/virtual_currencies/{virtual_currency_code}/actions/archive:
    post:
      summary: Archive a virtual currency
      operationId: archive-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read_write
      x-release-status: public
      description: |-
        Archives a virtual currency (makes it inactive).
         This endpoint requires the following permission(s): <code>project_configuration:virtual_currencies:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: virtual_currency_code
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 10
            pattern: ^[a-zA-Z0-9_]+$
          description: The virtual currency code
      responses:
        '200':
          description: Success. The virtual currency was archived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualCurrency'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/virtual_currencies/{virtual_currency_code}/actions/unarchive:
    post:
      summary: Unarchive a virtual currency
      operationId: unarchive-virtual-currency
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:virtual_currencies:read_write
      x-release-status: public
      description: |-
        Unarchives a virtual currency (makes it active).
         This endpoint requires the following permission(s): <code>project_configuration:virtual_currencies:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Virtual Currency
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: virtual_currency_code
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 10
            pattern: ^[a-zA-Z0-9_]+$
          description: The virtual currency code
      responses:
        '200':
          description: Success. The virtual currency was unarchived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualCurrency'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/entitlements/{entitlement_id}:
    get:
      summary: Get an entitlement
      operationId: get-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read
      x-release-status: public
      x-expandable-fields:
        - product: project_configuration:products:read
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - product
              example: product
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update an entitlement
      operationId: update-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - display_name
              properties:
                display_name:
                  description: The display name of the entitlement
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Premium
              additionalProperties: false
      responses:
        '200':
          description: Success. The entitlement was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
    delete:
      summary: Delete an entitlement
      operationId: delete-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/entitlements:
    get:
      summary: Get a list of entitlements
      operationId: list-entitlements
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read
      x-release-status: public
      x-expandable-fields:
        - items.product: project_configuration:products:read
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `items.product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - items.product
              example: items.product
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListEntitlements'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create an entitlement
      operationId: create-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - lookup_key
                - display_name
              properties:
                lookup_key:
                  description: The identifier of the entitlement
                  type: string
                  minLength: 1
                  maxLength: 200
                  example: premium
                display_name:
                  description: The display name of the entitlement
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: Premium access to all features
              additionalProperties: false
      responses:
        '201':
          description: Success. The entitlement was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/entitlements/{entitlement_id}/products:
    get:
      summary: Get a list of products attached to a given entitlement
      operationId: get-products-from-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductsFromEntitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/entitlements/{entitlement_id}/actions/archive:
    post:
      summary: Archive an entitlement
      operationId: archive-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      description: |-
        Archives an entitlement (makes it inactive).
         This endpoint requires the following permission(s): <code>project_configuration:entitlements:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      responses:
        '200':
          description: Success. The entitlement was archived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/entitlements/{entitlement_id}/actions/unarchive:
    post:
      summary: Unarchive an entitlement
      operationId: unarchive-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      description: |-
        Unarchives an entitlement (makes it active).
         This endpoint requires the following permission(s): <code>project_configuration:entitlements:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      responses:
        '200':
          description: Success. The entitlement was unarchived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/entitlements/{entitlement_id}/actions/attach_products:
    post:
      summary: Attach a set of products to an entitlement
      operationId: attach-products-to-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - product_ids
              properties:
                product_ids:
                  description: IDs of the products to be attached to the entitlement.
                  type: array
                  minLength: 1
                  maxLength: 50
                  items:
                    type: string
                    maxLength: 255
                    minLength: 1
                    example: prod1a2b3c4d5e
              additionalProperties: false
      responses:
        '200':
          description: Success. The products were attached to the entitlement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/entitlements/{entitlement_id}/actions/detach_products:
    post:
      summary: Detach a set of product from an entitlement
      operationId: detach-products-from-entitlement
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:entitlements:read_write
      x-release-status: public
      tags:
        - Entitlement
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: entitlement_id
          description: ID of the entitlement
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: entla1b2c3d4e5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - product_ids
              properties:
                product_ids:
                  description: IDs of the products to be detached from the entitlement.
                  type: array
                  minLength: 1
                  maxLength: 50
                  items:
                    type: string
                    maxLength: 255
                    minLength: 1
                    example: prod1a2b3c4d5e
              additionalProperties: false
      responses:
        '200':
          description: Success. The products were detached from the entitlement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Entitlement'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:entitlements:read_write</code>. This
        endpoint belongs to the <strong>Project Configuration</strong> domain,
        which has a default rate limit of <strong>60 requests per
        minute</strong>.
  /projects/{project_id}/offerings/{offering_id}:
    get:
      summary: Get an offering
      operationId: get-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read
      x-release-status: public
      x-expandable-fields:
        - package: project_configuration:packages:read
        - package.product: project_configuration:products:read
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `package` (requires `project_configuration:packages:read` permission), `package.product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - package
                - package.product
              example: package
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offering'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update an offering
      operationId: update-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                display_name:
                  description: The display name of the offering
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: premium access to features
                is_current:
                  description: Indicates if the offering is the current offering
                  type: boolean
                  example: true
                metadata:
                  description: Custom metadata of the offering
                  nullable: true
                  $ref: '#/components/schemas/OfferingMetadata'
              additionalProperties: false
      responses:
        '200':
          description: Success. The offering was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offering'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    delete:
      summary: Delete an offering and its attached packages
      operationId: delete-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/offerings/{offering_id}/actions/archive:
    post:
      summary: Archive an offering
      operationId: archive-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      description: |-
        Archives an offering (makes it inactive).
         This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
      responses:
        '200':
          description: Success. The offering was archived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offering'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/offerings/{offering_id}/actions/unarchive:
    post:
      summary: Unarchive an offering
      operationId: unarchive-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      description: |-
        Unarchives an offering (makes it active).
         This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                unarchive_referenced_entities:
                  description: >-
                    If true, also unarchive any archived products referenced by
                    this offering's packages.
                  type: boolean
                  default: false
              additionalProperties: false
      responses:
        '200':
          description: Success. The offering was unarchived
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offering'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/offerings:
    get:
      summary: Get a list of offerings
      operationId: list-offerings
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read
      x-release-status: public
      x-expandable-fields:
        - items.package: project_configuration:packages:read
        - items.package.product: project_configuration:products:read
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `items.package` (requires `project_configuration:packages:read` permission), `items.package.product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - items.package
                - items.package.product
              example: items.package
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListOfferings'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create an offering
      operationId: create-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:offerings:read_write
      x-release-status: public
      tags:
        - Offering
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - lookup_key
                - display_name
              properties:
                lookup_key:
                  description: The custom identifier of the offering
                  type: string
                  minLength: 1
                  maxLength: 200
                  example: default
                display_name:
                  description: The display_name of the offering
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: The standard set of packages
                metadata:
                  description: Custom metadata of the offering
                  nullable: true
                  $ref: '#/components/schemas/OfferingMetadata'
              additionalProperties: false
      responses:
        '201':
          description: Success. The offering was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offering'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:offerings:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/packages/{package_id}:
    get:
      summary: Get a package
      operationId: get-package
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read
      x-expandable-fields:
        - product: project_configuration:products:read
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - product
              example: product
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Package'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Update a package
      operationId: update-package
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read_write
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                display_name:
                  description: The display name of the package
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: monthly with one-week trial
                position:
                  description: The position of the package within the offering
                  type: integer
                  minimum: 1
                  example: 2
              additionalProperties: false
      responses:
        '200':
          description: Success. The package was updated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Package'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
    delete:
      summary: Delete a package
      operationId: delete-package-from-offering
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read_write
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeletedObject'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/offerings/{offering_id}/packages:
    get:
      summary: Get a list of packages in an offering
      operationId: list-packages
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read
      x-expandable-fields:
        - items.product: project_configuration:products:read
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: expand
          in: query
          description: |-
            Specifies which fields in the response should be expanded.
             Accepted values are: `items.product` (requires `project_configuration:products:read` permission).
          required: false
          schema:
            type: array
            items:
              maxLength: 5000
              minLength: 1
              type: string
              enum:
                - items.product
              example: items.product
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPackages'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
    post:
      summary: Create a package
      operationId: create-packages
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read_write
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: offering_id
          description: ID of the offering
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: ofrnge1a2b3c4d5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - lookup_key
                - display_name
              properties:
                lookup_key:
                  description: The lookup_key of the package
                  nullable: false
                  example: monthly
                  type: string
                  minLength: 1
                  maxLength: 200
                display_name:
                  description: The display name of the package
                  type: string
                  minLength: 1
                  maxLength: 1500
                  example: monthly with one-week trial
                position:
                  description: The position of the package in the offering
                  type: integer
                  example: 1
              additionalProperties: false
      responses:
        '201':
          description: Success. The package was created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Package'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/packages/{package_id}/products:
    get:
      summary: Get a list of products attached to a given package of an offering
      operationId: get-products-from-package
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductsFromPackage'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read</code>. This endpoint belongs
        to the <strong>Project Configuration</strong> domain, which has a
        default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/packages/{package_id}/actions/attach_products:
    post:
      summary: Attach a set of products to a package
      operationId: attach-products-to-package
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read_write
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - products
              properties:
                products:
                  description: Product association list
                  type: array
                  minLength: 1
                  maxLength: 50
                  items:
                    $ref: '#/components/schemas/PackageProductIDAssociation'
              additionalProperties: false
            examples:
              Single product for package (applies to any store):
                value:
                  products:
                    - product_id: prod1a2b3c4d5e
                      eligibility_criteria: all
              Play Store with different products depending on SDK version (SDK v6+ and SDK <v5) for one package:
                value:
                  products:
                    - product_id: prod1a2b3c4d5e
                      eligibility_criteria: google_sdk_lt_6
                    - product_id: prod445abb3188
                      eligibility_criteria: google_sdk_ge_6
      responses:
        '200':
          description: Success. The products were attached to the package.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Package'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/packages/{package_id}/actions/detach_products:
    post:
      summary: Detach a set of products from a package
      operationId: detach-products-from-package
      x-revenuecat-rate-limiting-domain: project_configuration
      x-scopes:
        - project_configuration:packages:read_write
      x-release-status: public
      tags:
        - Package
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: package_id
          description: ID of the package
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: pkge1a2b3c4d5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - product_ids
              properties:
                product_ids:
                  description: IDs of the products to detach from the package
                  type: array
                  minLength: 1
                  maxLength: 50
                  items:
                    type: string
                    maxLength: 255
                    minLength: 1
                    example: prod1a2b3c4d5e
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Package'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>project_configuration:packages:read_write</code>. This endpoint
        belongs to the <strong>Project Configuration</strong> domain, which has
        a default rate limit of <strong>60 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}:
    get:
      summary: Get a subscription
      operationId: get-subscription
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:subscriptions:read</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/transactions:
    get:
      summary: Get a Play Store or App Store subscription's transactions
      operationId: get-play-store-or-app-store-subscription-transactions
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
        - name: sort
          description: Column to sort the result list by.
          in: query
          required: false
          schema:
            type: string
            enum:
              - id
              - purchased_at
            default: id
            example: purchased_at
        - name: direction
          description: Sort direction for the result list.
          in: query
          required: false
          schema:
            type: string
            enum:
              - asc
              - desc
            default: asc
            example: desc
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSubscriptionTransaction'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:subscriptions:read</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/transactions/{transaction_id}/actions/refund:
    post:
      summary: Refund a Play Store or Galaxy subscription's transaction
      operationId: refund-play-store-or-galaxy-subscription-transaction
      x-revenuecat-rate-limiting-domain: subscriptions_refund_transaction
      x-scopes:
        - customer_information:subscriptions:read_write
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
        - name: transaction_id
          description: Identifier of the transaction in the store
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: GPA.000-000-000-000
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionTransaction'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Refund and cancel a Play Store or Galaxy subscription's transaction.
        Access to the subscription will be revoked. This endpoint requires the
        following permission(s):
        <code>customer_information:subscriptions:read_write</code>. This
        endpoint belongs to the <strong>Subscription Transactions
        Refunds</strong> domain, which has a default rate limit of <strong>480
        requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/entitlements:
    get:
      summary: Get a list of entitlements associated with a subscription
      operationId: list-subscription-entitlements
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListEntitlements'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: |-
        Lists all Entitlements granted by a Subscription.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/actions/cancel:
    post:
      summary: Cancel an active Web Billing subscription
      operationId: cancel-subscription
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read_write
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
      responses:
        '200':
          description: Success. The subscription has been successfully canceled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Cancel an active Web Billing subscription. The customer will lose access
        to the associated entitlements at the end of the current period.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read_write</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/actions/extend:
    post:
      summary: Extend the current billing period of a subscription
      operationId: extend-subscription
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read_write
      x-release-status: public
      x-revenuecat-release-gatekeeping: false
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/ExtendSubscriptionByDuration'
                - $ref: '#/components/schemas/ExtendSubscriptionUntilDate'
      responses:
        '200':
          description: >-
            Success. The subscription's current billing period has been
            extended.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Extend the current billing period of a subscription. Provide either
        `extend_by_days` to extend by a number of days, or `extend_until_ms` to
        extend to an absolute epoch-millisecond timestamp. Supported on Apple
        Store, Google Play Store, and Web Billing subscriptions. For Apple Store
        subscriptions, `extend_reason_code` is required and the extension is
        capped at 90 days.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read_write</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/actions/refund:
    post:
      summary: Refund an active Web Billing subscription
      operationId: refund-subscription
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read_write
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
      responses:
        '200':
          description: Success. The subscription has been successfully refunded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subscription'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Cancel a Web Billing subscription by refunding the most recent payment.
        The customer will immediately lose access to the associated
        entitlements.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read_write</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/subscriptions/{subscription_id}/authenticated_management_url:
    get:
      summary: Get an authenticated subscription management URL
      operationId: get-authorized-subscription-management-url
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: subscription_id
          description: ID of the subscription
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: sub1a2b3c4d5e
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthenticatedManagementUrl'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '502':
          $ref: '#/components/responses/BadGateway'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Get a secure, single-use URL that allows customers to access their Web
        Billing customer portal.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/subscriptions:
    get:
      summary: Get a list of subscriptions associated with a customer
      operationId: list-subscriptions
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: environment
          in: query
          schema:
            type: string
            enum:
              - sandbox
              - production
          example: production
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSubscriptions'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:subscriptions:read</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/purchases/{purchase_id}:
    get:
      summary: Get a purchase
      operationId: get-purchase
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:purchases:read
      x-release-status: public
      tags:
        - Purchase
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: purchase_id
          description: ID of the purchase
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: purc1a2b3c4d5e
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Purchase'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:purchases:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/purchases/{purchase_id}/entitlements:
    get:
      summary: Get a list of entitlements associated with a purchase
      operationId: list-purchase-entitlements
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:purchases:read
      x-release-status: public
      tags:
        - Purchase
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: purchase_id
          description: ID of the purchase
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: purc1a2b3c4d5e
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListEntitlements'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: |-
        Lists all Entitlements granted by a Purchase.
         This endpoint requires the following permission(s): <code>customer_information:purchases:read</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/purchases/{purchase_id}/actions/refund:
    post:
      summary: Refund a Web Billing purchase
      operationId: refund-purchase
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:purchases:read_write
      x-release-status: public
      tags:
        - Purchase
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: purchase_id
          description: ID of the purchase
          required: true
          in: path
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: purc1a2b3c4d5e
      responses:
        '200':
          description: Success. The purchase has been successfully refunded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Purchase'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Refund a Web Billing purchase and revoke access to associated granted
        entitlements.
         This endpoint requires the following permission(s): <code>customer_information:purchases:read_write</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/purchases:
    get:
      summary: Get a list of purchases associated with a customer
      operationId: list-purchases
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:purchases:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: environment
          in: query
          schema:
            type: string
            enum:
              - sandbox
              - production
          example: production
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPurchases'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:purchases:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/active_entitlements:
    get:
      summary: Get a list of customer's active entitlements
      operationId: list-customer-active-entitlements
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomerActiveEntitlements'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/aliases:
    get:
      summary: Get a list of the customer's aliases
      operationId: list-customer-aliases
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomerAliases'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/virtual_currencies:
    get:
      summary: Get a list of customer's virtual currencies balances
      operationId: list-virtual-currencies-balances
      x-revenuecat-rate-limiting-domain: virtual_currencies
      x-scopes:
        - customer_information:purchases:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: include_empty_balances
          in: query
          required: false
          schema:
            type: boolean
            example: true
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListVirtualCurrenciesBalances'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:purchases:read</code>. This endpoint belongs
        to the <strong>Virtual Currencies</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/virtual_currencies/transactions:
    post:
      summary: Create a virtual currencies transaction
      operationId: create-virtual-currencies-transaction
      x-revenuecat-rate-limiting-domain: virtual_currencies
      x-scopes:
        - customer_information:purchases:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: Idempotency-Key
          in: header
          schema:
            type: string
            example: 1234-5678-9101-1121
          description: >-
            This is an optional idempotency key to ensure exactly once execution
            of the request.
        - name: include_empty_balances
          in: query
          required: false
          schema:
            type: boolean
            example: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - adjustments
              properties:
                adjustments:
                  description: The adjustments to the virtual currencies
                  type: object
                  additionalProperties:
                    type: integer
                reference:
                  description: The reference of the transaction
                  type: string
                  nullable: true
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListVirtualCurrenciesBalances'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:purchases:read_write</code>. This endpoint
        belongs to the <strong>Virtual Currencies</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/virtual_currencies/update_balance:
    post:
      summary: Update a virtual currencies balance without creating a transaction
      operationId: update-virtual-currencies-balance
      x-revenuecat-rate-limiting-domain: virtual_currencies
      x-scopes:
        - customer_information:purchases:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: Idempotency-Key
          in: header
          schema:
            type: string
            example: 1234-5678-9101-1121
          description: >-
            This is an optional idempotency key to ensure exactly once execution
            of the request.
        - name: include_empty_balances
          in: query
          required: false
          schema:
            type: boolean
            example: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - adjustments
              properties:
                adjustments:
                  description: The adjustments to the virtual currencies
                  type: object
                  additionalProperties:
                    type: integer
                reference:
                  description: The reference of the transaction
                  type: string
                  nullable: true
              additionalProperties: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListVirtualCurrenciesBalances'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:purchases:read_write</code>. This endpoint
        belongs to the <strong>Virtual Currencies</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/attributes:
    get:
      summary: Get a list of the customer's attributes
      operationId: list-customer-attributes
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomerAttributes'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
    post:
      summary: Set a customer's attributes
      operationId: set-customer-attributes
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:customers:read_write
      x-release-status: public
      tags:
        - Customer
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - attributes
              properties:
                attributes:
                  type: array
                  nullable: false
                  minItems: 1
                  maxItems: 50
                  items:
                    type: object
                    additionalProperties: false
                    required:
                      - name
                      - value
                    properties:
                      name:
                        description: The name of the attribute
                        nullable: false
                        minLength: 1
                        maxLength: 40
                        oneOf:
                          - $ref: '#/components/schemas/CustomerAttributeReservedName'
                          - $ref: '#/components/schemas/CustomerAttributeCustomName'
                        example: $email
                      value:
                        description: >-
                          The value of the attribute. Use null to delete the
                          attribute.
                        type: string
                        maxLength: 500
                        nullable: true
              example:
                attributes:
                  - name: $email
                    value: support@revenuecat.com
                  - name: $displayName
                    value: John Appleseed
                  - name: my_custom_attr
                    value: custom value
      responses:
        '200':
          description: Success. The customer attributes were set
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomerAttributes'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:customers:read_write</code>. This endpoint
        belongs to the <strong>Customer Information</strong> domain, which has a
        default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/invoices:
    get:
      summary: Get a list of the customer's invoices
      operationId: list-customer-invoices
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:invoices:read
      x-release-status: public
      tags:
        - Invoice
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: starting_after
          in: query
          required: false
          schema:
            type: string
            example: ent12354
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
            default: 20
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListCustomerInvoices'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:invoices:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/customers/{customer_id}/invoices/{invoice_id}/file:
    get:
      summary: Get an invoice
      operationId: get-invoice
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:invoices:read
      x-release-status: public
      tags:
        - Invoice
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: customer_id
          in: path
          description: ID of the customer
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: 19b8de26-77c1-49f1-aa18-019a391603e2
        - name: invoice_id
          in: path
          description: ID of the invoice
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 1500
            example: rcbin1a2b3c4d5e
      responses:
        '302':
          description: File found. Needs to be downloaded from the location header
          headers:
            location:
              description: The URL to download the invoice pdf
              schema:
                type: string
                format: uri
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>customer_information:invoices:read</code>. This endpoint belongs
        to the <strong>Customer Information</strong> domain, which has a default
        rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/metrics/overview:
    get:
      summary: Get overview metrics for a project
      operationId: get-overview-metrics
      x-revenuecat-rate-limiting-domain: charts_metrics
      x-scopes:
        - charts_metrics:overview:read
      x-release-status: public
      tags:
        - Charts & Metrics
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: currency
          description: The currency to return metrics data in
          in: query
          schema:
            type: string
            enum:
              - USD
              - EUR
              - GBP
              - AUD
              - CAD
              - JPY
              - BRL
              - KRW
              - CNY
              - MXN
              - SEK
              - PLN
              - NZD
              - CHF
          example: EUR
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OverviewMetrics'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        This endpoint requires the following permission(s):
        <code>charts_metrics:overview:read</code>. This endpoint belongs to the
        <strong>Charts & Metrics</strong> domain, which has a default rate limit
        of <strong>25 requests per minute</strong>.
  /projects/{project_id}/metrics/revenue:
    get:
      summary: Get revenue for a project
      description: >-
        Returns the total revenue for the project across all of its apps for the

        given inclusive date range `[start_date, end_date]`. The value is
        expressed

        in the project's primary currency unless `currency` is provided.


        Use `revenue_type` to choose which revenue definition the `value`
        represents:

        gross `revenue` (default), `revenue_net_of_taxes`, or `proceeds` (net of
        both

        taxes and store commission — the amount the developer keeps).


        This endpoint is backed by the same realtime (v3) revenue chart that
        powers

        the dashboard. It is intended for cases where an app needs an
        authoritative

        revenue total without inferring it from the transaction list.


        Note that the most recent day in the range may be partial if it includes

        today, since transactions for today are still arriving.
         This endpoint requires the following permission(s): <code>charts_metrics:overview:read</code>. This endpoint belongs to the <strong>Charts & Metrics</strong> domain, which has a default rate limit of <strong>25 requests per minute</strong>.
      operationId: get-revenue-metric
      x-revenuecat-rate-limiting-domain: charts_metrics
      x-scopes:
        - charts_metrics:overview:read
      x-release-status: public
      tags:
        - Charts & Metrics
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: start_date
          description: Start date for the data range (ISO 8601 format)
          in: query
          required: true
          schema:
            type: string
            format: date
            example: '2024-01-01'
        - name: end_date
          description: End date for the data range (ISO 8601 format)
          in: query
          required: true
          schema:
            type: string
            format: date
            example: '2024-12-31'
        - name: currency
          description: The currency to return metrics data in
          in: query
          schema:
            type: string
            enum:
              - USD
              - EUR
              - GBP
              - AUD
              - CAD
              - JPY
              - BRL
              - KRW
              - CNY
              - MXN
              - SEK
              - PLN
              - NZD
              - CHF
          example: EUR
        - name: revenue_type
          in: query
          description: >
            Which revenue definition to return as the metric value:

            - `revenue`: gross revenue.

            - `revenue_net_of_taxes`: revenue with taxes subtracted.

            - `proceeds`: revenue net of both taxes and store commission (the
            amount the
              developer keeps).
          required: false
          schema:
            type: string
            enum:
              - revenue
              - revenue_net_of_taxes
              - proceeds
            default: revenue
          example: proceeds
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RevenueMetric'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/charts/{chart_name}:
    get:
      summary: Get chart data
      description: >-
        Returns time-series data for a specific chart.


        **Response Structure**


        The response includes:

        - Chart metadata (category, display_name, description)

        - Time boundaries (start_date, end_date, last_computed_at)

        - Data values (array of data points)

        - Summary statistics

        - Segment information (when segmented)


        **Chart Types**


        Different charts may return data in slightly different formats:

        - Standard charts: values as arrays of data points with timestamps

        - Cohort charts: values include cohort-specific data structures

        - Segmented charts: include segment information in the response


        **Filtering and Segmentation**


        Use the `/charts/{chart_name}/options` endpoint to discover available

        filters and segments for a specific chart before making requests.


        Segments and filters vary per chart and are separate lists — a dimension

        can be available as a filter but not as a segment. Requesting an

        unsupported segment or filter (or segmenting/filtering a chart that does

        not allow it) returns a 400 `parameter_error` that lists the supported

        segments. Check `get-chart-options-schema` first when unsure.


        Filter parameters vary by chart and can be passed as additional query
        parameters.


        **Aggregation**


        Use `aggregate` to request summary-only output for supported charts.

        When `aggregate` is provided, `values` is returned as an empty array and

        `summary` includes only the requested aggregate operations.


        **Incomplete data**

        For the most recent periods, data may be flagged as incomplete, and may
        not be appropriate to use for analysis.
         This endpoint requires the following permission(s): <code>charts_metrics:charts:read</code>. This endpoint belongs to the <strong>Charts & Metrics</strong> domain, which has a default rate limit of <strong>25 requests per minute</strong>.
      operationId: get-chart-data
      x-revenuecat-rate-limiting-domain: charts_metrics
      x-scopes:
        - charts_metrics:charts:read
      x-release-status: public
      tags:
        - Charts & Metrics
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: chart_name
          description: >
            Name of the chart to retrieve:

            - actives: Active (paying) subscriptions 

            - actives_movement: Period-over-period delta of active (paying)
            subscriptions

            - actives_new: New paying subscriptions, including trial
            conversions, resubscriptions, and product changes

            - arr: Annual recurring revenue

            - churn: Churn rate: active and expired subscriptions per period

            - cohort_explorer: allows measuring the performance of various
            cohort definitions over time for revenue, retained subscriptions,
            and cohort LTV

            - conversion_to_paying: Conversion of new customers to paying

            - customers_new: Newly seen customers

            - initial_conversion: Initial conversion of new customers to paying
            within fixed windows (0, 3, 7, 14, 30 days, and unbounded)

            - ltv_per_customer: Realized LTV per customer, also known as ARPU,
            cohorted by first seen date

            - ltv_per_paying_customer: Realized LTV per paying customer, also
            known as ARPPU, cohorted by first seen date

            - mrr: Monthly recurring revenue

            - mrr_movement: Period-over-period delta of monthly recurring
            revenue

            - prediction_explorer: similar to cohort_explorer but including
            future predictions

            - refund_rate: transactions per period, refunds, refund rate

            - revenue: revenue (gross, net of taxes, or proceeds net of taxes
            and commissions) and number of transactions (subscriptions and
            non-subscriptions) per period

            - subscription_retention: Per-period retention of paying
            subscriptions by duration

            - subscription_status: Break down paying subscriptions, trials, MRR,
            ARR, or revenue by whether the subscription is set to renew,
            cancelled, or in billing recovery

            - trials: Active trials

            - trials_movement: Movement of active trials

            - trials_new: New trials

            - customers_active: Customers seen during the period (also known as
            DAU/MAU/WAU/etc.)

            - trial_conversion_rate: Number of trials started in a period and
            ratio of them converting to paying

            - non-subscription_purchases: Number of non-subscription purchases
            per period
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            enum:
              - actives
              - actives_movement
              - actives_new
              - arr
              - churn
              - cohort_explorer
              - conversion_to_paying
              - customers_new
              - initial_conversion
              - ltv_per_customer
              - ltv_per_paying_customer
              - mrr
              - mrr_movement
              - prediction_explorer
              - refund_rate
              - revenue
              - subscription_retention
              - subscription_status
              - trials
              - trials_movement
              - trials_new
              - customers_active
              - trial_conversion_rate
              - non-subscription_purchases
            example: revenue
        - name: realtime
          description: >-
            Whether to request real-time (v3) charts. Defaults to true. Set to
            false to request the v2 charts.
          in: query
          schema:
            type: boolean
            default: true
        - name: filters
          description: JSON array of chart filters. Each filter is a ChartFilter object.
          in: query
          schema:
            type: string
          example: '[{"name":"country","values":["US","UK"]}]'
        - name: selectors
          description: JSON object of chart selectors.
          in: query
          schema:
            type: string
          example: '{"conversion_timeframe":"7_days","revenue_type":"proceeds"}'
        - name: aggregate
          description: >
            Comma-separated aggregate operations to return in `summary` without
            raw `values`.
          in: query
          style: form
          explode: false
          schema:
            type: array
            minItems: 1
            uniqueItems: true
            items:
              type: string
              enum:
                - average
                - total
            example: average,total
        - name: currency
          description: The currency to return metrics data in
          in: query
          schema:
            type: string
            enum:
              - USD
              - EUR
              - GBP
              - AUD
              - CAD
              - JPY
              - BRL
              - KRW
              - CNY
              - MXN
              - SEK
              - PLN
              - NZD
              - CHF
          example: EUR
        - name: resolution
          description: >
            Time resolution for the chart data.

            Use the chart options endpoint to discover available resolutions and
            their IDs.
          in: query
          schema:
            type: string
            example: '0'
        - name: start_date
          description: Start date for the data range (ISO 8601 format)
          in: query
          schema:
            type: string
            format: date
            example: '2024-01-01'
        - name: end_date
          description: End date for the data range (ISO 8601 format)
          in: query
          schema:
            type: string
            format: date
            example: '2024-12-31'
        - name: expand_periods
          description: >-
            Whether to expand the date range so the first period is complete
            (e.g. snap a weekly range back to the start of the week). Defaults
            to false, which only includes data from the exact start_date
            provided. Period labels are always aligned to period boundaries:
            with expand_periods=false and a mid-period start_date, the first
            period only aggregates data from start_date onwards and is marked as
            incomplete. Exception: charts of point-in-time (stock) metrics, such
            as active subscriptions or MRR, ignore this parameter entirely.
            Their values are snapshots measured exactly at each period boundary,
            so the first data point is always measured at the start of the
            period containing start_date (which can fall before start_date) and
            is not marked as incomplete, since a snapshot cannot be partial.
          in: query
          schema:
            type: boolean
            default: false
        - name: segment
          description: >
            Segment the data by this dimension. Must be one of the segments
            returned

            by the chart options schema endpoint for this chart; segments vary
            per

            chart, and unsupported segments return a 400 `parameter_error`
            listing

            the supported ones.
          in: query
          schema:
            type: string
            example: country
        - name: limit_num_segments
          description: >
            If set, limits the number of segments returned to the top N by
            value.

            All remaining segments are aggregated into an "Other" segment.

            Only applies when a segment is specified.
          in: query
          schema:
            type: integer
            minimum: 1
            example: 10
        - name: include_annotations
          in: query
          required: false
          description: >-
            When true, includes chart annotations for the project in the
            response, filtered to the chart's date window.
          schema:
            type: boolean
            default: false
            example: true
      responses:
        '200':
          description: Chart data retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChartData'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/charts/{chart_name}/options:
    get:
      summary: Get available options for a chart
      description: >-
        Returns configuration options for a specific chart.


        Use this endpoint to discover:

        - **Resolutions**: Available time granularities (day, week, month, etc.)

        - **Segments**: Dimensions you can segment the data by (country, store,
        product, etc.)

        - **Filters**: Available filters and their possible values


        The options returned are specific to the chart and may vary based on

        your project's data and configuration.


        **Usage**


        Call this endpoint before requesting chart data to:

        1. Build dynamic filter UIs

        2. Validate parameters before making chart data requests

        3. Discover available dimensions for analysis

        . This endpoint requires the following permission(s):
        <code>charts_metrics:charts:read</code>. This endpoint belongs to the
        <strong>Charts & Metrics</strong> domain, which has a default rate limit
        of <strong>25 requests per minute</strong>.
      operationId: get-chart-options
      x-revenuecat-rate-limiting-domain: charts_metrics
      x-scopes:
        - charts_metrics:charts:read
      x-release-status: public
      tags:
        - Charts & Metrics
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: chart_name
          description: >
            Name of the chart to retrieve:

            - actives: Active (paying) subscriptions 

            - actives_movement: Period-over-period delta of active (paying)
            subscriptions

            - actives_new: New paying subscriptions, including trial
            conversions, resubscriptions, and product changes

            - arr: Annual recurring revenue

            - churn: Churn rate: active and expired subscriptions per period

            - cohort_explorer: allows measuring the performance of various
            cohort definitions over time for revenue, retained subscriptions,
            and cohort LTV

            - conversion_to_paying: Conversion of new customers to paying

            - customers_new: Newly seen customers

            - initial_conversion: Initial conversion of new customers to paying
            within fixed windows (0, 3, 7, 14, 30 days, and unbounded)

            - ltv_per_customer: Realized LTV per customer, also known as ARPU,
            cohorted by first seen date

            - ltv_per_paying_customer: Realized LTV per paying customer, also
            known as ARPPU, cohorted by first seen date

            - mrr: Monthly recurring revenue

            - mrr_movement: Period-over-period delta of monthly recurring
            revenue

            - prediction_explorer: similar to cohort_explorer but including
            future predictions

            - refund_rate: transactions per period, refunds, refund rate

            - revenue: revenue (gross, net of taxes, or proceeds net of taxes
            and commissions) and number of transactions (subscriptions and
            non-subscriptions) per period

            - subscription_retention: Per-period retention of paying
            subscriptions by duration

            - subscription_status: Break down paying subscriptions, trials, MRR,
            ARR, or revenue by whether the subscription is set to renew,
            cancelled, or in billing recovery

            - trials: Active trials

            - trials_movement: Movement of active trials

            - trials_new: New trials

            - customers_active: Customers seen during the period (also known as
            DAU/MAU/WAU/etc.)

            - trial_conversion_rate: Number of trials started in a period and
            ratio of them converting to paying

            - non-subscription_purchases: Number of non-subscription purchases
            per period
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            enum:
              - actives
              - actives_movement
              - actives_new
              - arr
              - churn
              - cohort_explorer
              - conversion_to_paying
              - customers_new
              - initial_conversion
              - ltv_per_customer
              - ltv_per_paying_customer
              - mrr
              - mrr_movement
              - prediction_explorer
              - refund_rate
              - revenue
              - subscription_retention
              - subscription_status
              - trials
              - trials_movement
              - trials_new
              - customers_active
              - trial_conversion_rate
              - non-subscription_purchases
            example: revenue
        - name: realtime
          description: >-
            Whether to request real-time (v3) charts. Defaults to true. Set to
            false to request the v2 charts.
          in: query
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: Chart options retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChartOptions'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
  /projects/{project_id}/subscriptions:
    get:
      summary: Search subscriptions by store subscription identifier
      operationId: search-subscriptions
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:subscriptions:read
      x-release-status: public
      tags:
        - Subscription
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: store_subscription_identifier
          description: >-
            Store ID associated with the subscription for the current or next
            period.
          required: true
          in: query
          schema:
            type: string
            nullable: false
            minLength: 1
            maxLength: 255
          examples:
            amazon:
              value: 9aJscueFTxLPZXXo-AlBTkI0OnFXR2qiH14C1aqWnOT=:3:11..8
              summary: 'Amazon Appstore '
            app_store:
              value: '100001234567890'
              summary: Apple App Store
            paddle:
              value: txn_01jss4bz50g1z5yw121npeb3ag
              summary: Paddle
            play_store:
              value: GPA.1234-5678-9012-34567..0
              summary: Google Play Store
            rc_billing:
              value: txRcb553a54d4738816a63f1a05cfcb1723e3..1746748685
              summary: RevenueCat Web Billing
            roku:
              value: 4ab8df12-3003-11f0-9646-8ac68bcdcaed
              summary: Roku
            stripe:
              value: si_Rww1psqupbKxmt
              summary: Stripe
        - name: include_scheduled
          in: query
          required: false
          description: >-
            When true, includes subscriptions scheduled to start in the future
            in the response.
          schema:
            type: boolean
            default: false
            example: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListSubscriptions'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Search for a subscription by any of its associated
        `store_subscription_identifier` values, whether from a past or current
        subscription period.


        For example, this may include the `transactionId` of any transaction in
        an Apple App Store subscription, or any order ID from a Google Play
        Store subscription.
         This endpoint requires the following permission(s): <code>customer_information:subscriptions:read</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
  /projects/{project_id}/purchases:
    get:
      summary: Search one-time purchases by store purchase identifier
      operationId: search-purchases
      x-revenuecat-rate-limiting-domain: customer_information
      x-scopes:
        - customer_information:purchases:read
      x-release-status: public
      tags:
        - Purchase
      parameters:
        - name: project_id
          description: ID of the project
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            example: proj1ab2c3d4
        - name: store_purchase_identifier
          description: Store ID associated with the one-time purchase.
          required: true
          in: query
          schema:
            type: string
            nullable: false
            minLength: 1
            maxLength: 255
          examples:
            amazon:
              value: 9aJscueFTxLPZXXo-AlBTkI0OnFXR2qiH14C1aqWnOT=:3:11
              summary: 'Amazon Appstore '
            app_store:
              value: '100001234567890'
              summary: Apple App Store
            paddle:
              value: txn_01jss4bz50g1z5yw121npeb3ag
              summary: Paddle
            play_store:
              value: GPA.1234-5678-9012-34567
              summary: Google Play Store
            rc_billing:
              value: txRcb553a54d4738816a63f1a05cfcb1723e3
              summary: RevenueCat Web Billing
            roku:
              value: 4ab8df12-3003-11f0-9646-8ac68bcdcaed
              summary: Roku
            stripe:
              value: si_Rww1psqupbKxmt
              summary: Stripe
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListPurchases'
          headers:
            RevenueCat-Rate-Limit-Current-Usage:
              $ref: '#/components/headers/RateLimitCurrentUsage'
            RevenueCat-Rate-Limit-Current-Limit:
              $ref: '#/components/headers/RateLimitCurrentLimit'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '423':
          $ref: '#/components/responses/Locked'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/InternalError'
      description: >-
        Search for a one-time purchases by any of its associated
        `store_purchase_identifier` values.


        For example, this may include the `transactionId` of any transaction in
        an Apple App Store purchase, or any order ID from a Google Play Store
        purchase.
         This endpoint requires the following permission(s): <code>customer_information:purchases:read</code>. This endpoint belongs to the <strong>Customer Information</strong> domain, which has a default rate limit of <strong>480 requests per minute</strong>.
components:
  securitySchemes:
    BearerAuth:
      bearerFormat: auth-scheme
      description: >-
        Bearer HTTP authentication. Allowed headers -- Authorization: Bearer
        <api_key>
      scheme: bearer
      type: http
  schemas:
    AmazonApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - amazon
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - amazon
          example: amazon
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        amazon:
          description: Amazon type details
          type: object
          required:
            - package_name
          nullable: false
          additionalProperties: true
          properties:
            package_name:
              description: The package name of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
      additionalProperties: true
    AmazonAppCreate:
      type: object
      required:
        - name
        - type
        - amazon
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - amazon
          nullable: false
        amazon:
          description: Amazon type details. Should only be used when type is amazon.
          type: object
          required:
            - package_name
          nullable: false
          properties:
            package_name:
              description: The package name of the app
              type: string
              minLength: 1
              maxLength: 256
              nullable: false
            shared_secret:
              description: Your Amazon Developer Identity Shared Key
              type: string
              nullable: false
          additionalProperties: false
      additionalProperties: false
    AmountMicros:
      description: The price in micros. For example, USD 1 would be represented as 1000000
      nullable: false
      type: integer
      example: For 99.99, the value should be 99990000
    App:
      oneOf:
        - $ref: '#/components/schemas/AmazonApp'
        - $ref: '#/components/schemas/AppStoreApp'
        - $ref: '#/components/schemas/MacAppStoreApp'
        - $ref: '#/components/schemas/PlayStoreApp'
        - $ref: '#/components/schemas/StripeApp'
        - $ref: '#/components/schemas/RCBillingApp'
        - $ref: '#/components/schemas/RokuApp'
        - $ref: '#/components/schemas/PaddleApp'
        - $ref: '#/components/schemas/TestStoreApp'
      discriminator:
        propertyName: type
        mapping:
          amazon: '#/components/schemas/AmazonApp'
          app_store: '#/components/schemas/AppStoreApp'
          mac_app_store: '#/components/schemas/MacAppStoreApp'
          play_store: '#/components/schemas/PlayStoreApp'
          stripe: '#/components/schemas/StripeApp'
          rc_billing: '#/components/schemas/RCBillingApp'
          roku: '#/components/schemas/RokuApp'
          paddle: '#/components/schemas/PaddleApp'
          test_store: '#/components/schemas/TestStoreApp'
    AppCreate:
      oneOf:
        - $ref: '#/components/schemas/AmazonAppCreate'
        - $ref: '#/components/schemas/AppStoreAppCreate'
        - $ref: '#/components/schemas/MacAppStoreAppCreate'
        - $ref: '#/components/schemas/PlayStoreAppCreate'
        - $ref: '#/components/schemas/StripeAppCreate'
        - $ref: '#/components/schemas/RCBillingAppCreate'
        - $ref: '#/components/schemas/RokuAppCreate'
        - $ref: '#/components/schemas/PaddleAppCreate'
      discriminator:
        propertyName: type
        mapping:
          amazon: '#/components/schemas/AmazonAppCreate'
          app_store: '#/components/schemas/AppStoreAppCreate'
          mac_app_store: '#/components/schemas/MacAppStoreAppCreate'
          play_store: '#/components/schemas/PlayStoreAppCreate'
          stripe: '#/components/schemas/StripeAppCreate'
          rc_billing: '#/components/schemas/RCBillingAppCreate'
          roku: '#/components/schemas/RokuAppCreate'
          paddle: '#/components/schemas/PaddleAppCreate'
    AppStoreApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - app_store
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - app_store
          example: app_store
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        app_store:
          description: App Store type details
          type: object
          required:
            - bundle_id
            - app_store_connect_api_key_configured
            - subscription_key_configured
          nullable: false
          additionalProperties: true
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
            app_store_connect_api_key_configured:
              description: Whether App Store Connect API key credentials are configured.
              type: boolean
              nullable: false
              example: true
            subscription_key_configured:
              description: >-
                Whether In-App Purchase subscription key credentials are
                configured.
              type: boolean
              nullable: false
              example: true
            custom_url_scheme:
              description: >-
                The custom URL scheme for the app, derived from the app's public
                ID.
              type: string
              nullable: false
              example: rc-1a2b3c4
      additionalProperties: true
    AppStoreAppCreate:
      type: object
      required:
        - name
        - type
        - app_store
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - app_store
          nullable: false
        app_store:
          description: App Store type details. Should only be used when type is app_store.
          type: object
          required:
            - bundle_id
          nullable: false
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              minLength: 1
              maxLength: 256
              nullable: false
            shared_secret:
              description: The shared secret of the app
              type: string
              minLength: 32
              maxLength: 32
              nullable: false
            subscription_private_key:
              description: >
                PKCS /#8 In App Key downloaded from App Store Connect in PEM
                format. Copy the contents

                of the file in this field. See instructions on how to get it
                in: 

                https://www.revenuecat.com/docs/in-app-purchase-key-configuration
              type: string
              minLength: 1
              maxLength: 4500
              nullable: false
            subscription_key_id:
              description: >-
                In App Key id. The ID of the downloaded in app key. You can get
                it from App Store Connect
              type: string
              minLength: 1
              maxLength: 32
              nullable: false
            subscription_key_issuer:
              description: >-
                The key Issuer id. See instructions on how to obtain this in:
                https://www.revenuecat.com/docs/in-app-purchase-key-configuration#3-providing-the-issuer-id-to-revenuecat 
              type: string
              minLength: 1
              maxLength: 36
              nullable: false
            app_store_connect_api_key:
              description: >
                App Store Connect API Key downloaded from App Store Connect in
                PEM format. Copy the contents

                of the file in this field. This is optional and used for
                advanced features like product imports.
              type: string
              minLength: 1
              maxLength: 4500
              nullable: false
            app_store_connect_api_key_id:
              description: >-
                App Store Connect API Key ID. The ID of the downloaded API key.
                You can get it from App Store Connect.
              type: string
              minLength: 1
              maxLength: 36
              nullable: false
            app_store_connect_api_key_issuer:
              description: App Store Connect API Key Issuer ID.
              type: string
              minLength: 1
              maxLength: 36
              nullable: false
            app_store_connect_vendor_number:
              description: >-
                Your vendor number from App Store Connect. Required for some
                features like financial reports.
              type: string
              minLength: 1
              maxLength: 20
              nullable: false
          additionalProperties: false
      additionalProperties: false
    AuditLog:
      type: object
      required:
        - id
        - project_id
        - action_type
        - target_type
        - target_identifier
        - actor_type
        - actor_identifier
        - occurred_at
        - additional_data
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - audit_log
          type: string
        id:
          type: string
          maxLength: 255
          example: log1ab2c3d4e5
        project_id:
          nullable: false
          description: ID of the project to which the audit log belongs.
          minLength: 1
          maxLength: 20
          type: string
          example: proj1ab2c3d4
        action_type:
          type: string
          description: Action that was performed.
          example: project_name_updated
        target_type:
          type: string
          description: Type of the target on which the action was performed.
          example: project
        target_identifier:
          type: string
          description: Identifier of the action target.
          example: proj1ab2c3d4
        actor_type:
          type: string
          description: Type of actor that performed the action.
          enum:
            - user
            - system
            - api_key
            - oauth_client
        actor_identifier:
          type: string
          description: Identifier of the actor that performed the action.
          example: user_abc123
        occurred_at:
          nullable: false
          description: Timestamp when the action occurred, in milliseconds since epoch.
          type: integer
          format: int64
          example: 1713297600000
        additional_data:
          type: object
          description: Additional metadata associated with the audit log.
          additionalProperties: true
      additionalProperties: false
    AuthenticatedManagementUrl:
      type: object
      required:
        - management_url
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - authenticated_management_url
          type: string
        management_url:
          description: >-
            A secure URL that provides temporary access to the subscription
            management portal. For RC Billing subscriptions, this is a
            single-use magic link to the RevenueCat customer portal. For Paddle
            subscriptions, this is a short-lived authenticated Paddle Customer
            Portal URL when the API key has the Customer portal session (Write)
            permission and Paddle returns the required management URLs;
            otherwise a non-authenticated URL (customer signs in via email) or
            `null` if no URL can be generated.
          nullable: true
          type: string
          example: >-
            https://billing.revenuecat.com/app1a2b3c4/sub1ab2c3d4e5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
      additionalProperties: false
    ChartAnnotation:
      type: object
      description: A chart annotation marking a significant event on charts.
      required:
        - object
        - id
        - description
        - start_date
        - end_date
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          type: string
          enum:
            - chart_annotation
          example: chart_annotation
        id:
          description: The ID of the chart annotation.
          type: string
          example: chartannot1a2b3c
        description:
          description: Human-readable description of the event this annotation represents.
          type: string
          example: App version 2.0 released
        start_date:
          description: The start date of the annotated period (ISO 8601 date format).
          type: string
          format: date
          example: '2024-01-15'
        end_date:
          description: >-
            The end date of the annotated period (ISO 8601 date format), or null
            if the annotation is a single-day event.
          type: string
          format: date
          nullable: true
          example: '2024-01-20'
      additionalProperties: false
    ChartData:
      type: object
      description: Chart data response containing time-series data and metadata
      required:
        - object
        - category
        - display_type
        - display_name
        - description
        - resolution
        - values
        - yaxis
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - chart_data
          type: string
        category:
          description: Category the chart belongs to
          type: string
          example: revenue
        display_type:
          description: Type of chart visualization
          type: string
          example: line
        display_name:
          description: Human-readable name of the chart
          type: string
          example: Revenue
        description:
          description: Description of what the chart shows
          type: string
        documentation_link:
          description: Link to documentation for this chart
          nullable: true
          type: string
        last_computed_at:
          description: Timestamp when the chart data was last computed (ms since epoch)
          nullable: true
          type: integer
          format: int64
        start_date:
          description: Start date of the data range (ms since epoch)
          nullable: true
          type: integer
          format: int64
        end_date:
          description: End date of the data range (ms since epoch)
          nullable: true
          type: integer
          format: int64
        yaxis_currency:
          description: Currency used for monetary values
          type: string
          example: USD
        filtering_allowed:
          description: Whether filtering is allowed for this chart
          type: boolean
        segmenting_allowed:
          description: Whether segmentation is allowed for this chart
          type: boolean
        resolution:
          description: Time resolution of the data points
          type: string
          enum:
            - day
            - week
            - month
            - quarter
            - year
          example: day
        values:
          description: >-
            Chart data points. Structure varies by chart type - can be arrays of
            numbers or objects with timestamps and values. Returned as an empty
            array when aggregate operations are requested.
          type: array
          items:
            oneOf:
              - type: array
                items:
                  type: number
                  nullable: true
              - type: object
                additionalProperties: true
        summary:
          description: Summary statistics for the chart data
          nullable: true
          type: object
          additionalProperties: true
        yaxis:
          description: Y-axis configuration including unit
          type: string
          example: $
        segments:
          description: Segment information when data is segmented
          nullable: true
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              display_name:
                type: string
        segments_limit:
          description: Maximum number of segments returned
          nullable: true
          type: integer
        measures:
          description: Measure definitions for the chart (v3 charts)
          nullable: true
          type: array
          items:
            type: object
            additionalProperties: true
        user_selectors:
          description: >-
            Currently selected values for user-configurable selectors (keyed by
            selector name)
          nullable: true
          type: object
          additionalProperties:
            type: string
        unsupported_params:
          description: >-
            Deprecated and always `null`. Unsupported parameters are rejected
            with a 400 error instead of being reported in the response.
          deprecated: true
          nullable: true
          type: object
          properties:
            filters:
              type: array
              items:
                type: string
            segment:
              type: string
              nullable: true
        annotations:
          description: >-
            Chart annotations for the project, filtered to the chart's date
            window. Only present when include_annotations=true is passed in the
            request.
          type: array
          items:
            $ref: '#/components/schemas/ChartAnnotation'
      additionalProperties: false
    ChartFilterOption:
      type: object
      description: A filter option for a chart
      required:
        - object
        - id
        - display_name
        - options
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - chart_filter_option
          type: string
        id:
          description: Unique identifier for the filter
          type: string
          example: country
        display_name:
          description: Human-readable name for the filter
          type: string
          example: Country
        group_display_name:
          description: Group name for organizing filter options
          nullable: true
          type: string
          example: Geography
        options:
          description: Available values for this filter
          type: array
          items:
            type: object
            required:
              - id
              - display_name
            additionalProperties: true
            properties:
              id:
                description: Unique identifier for the option value
                type: string
                example: US
              display_name:
                description: Human-readable name for the option value
                type: string
                example: United States
      additionalProperties: true
    ChartOptions:
      type: object
      description: Available options for filtering and segmenting a chart
      required:
        - object
        - resolutions
        - segments
        - filters
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - chart_options
          type: string
        resolutions:
          description: Available time resolutions for the chart
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                description: Resolution ID to use in requests
              display_name:
                type: string
                description: Human-readable name
            required:
              - id
              - display_name
          example:
            - id: '0'
              display_name: day
            - id: '1'
              display_name: week
            - id: '2'
              display_name: month
        segments:
          description: Available segmentation options
          type: array
          items:
            $ref: '#/components/schemas/ChartSegmentOption'
        filters:
          description: Available filter options
          type: array
          items:
            $ref: '#/components/schemas/ChartFilterOption'
        user_selectors:
          description: User-configurable selectors for the chart (keyed by selector name)
          nullable: true
          type: object
          additionalProperties:
            type: object
            properties:
              default:
                type: string
                description: Default value for the selector
              display_name:
                type: string
                description: Human-readable name
              options:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    display_name:
                      type: string
                  required:
                    - id
                    - display_name
      additionalProperties: false
    ChartSegmentOption:
      type: object
      description: A segmentation option for a chart
      required:
        - object
        - id
        - display_name
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - chart_segment_option
          type: string
        id:
          description: Unique identifier for the segment option
          type: string
          example: country
        display_name:
          description: Human-readable name for the segment option
          type: string
          example: Country
        group_display_name:
          description: Group name for organizing segment options
          nullable: true
          type: string
          example: Geography
      additionalProperties: true
    Collaborator:
      type: object
      required:
        - id
        - email
        - role
        - accepted_at
        - has_mfa
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - collaborator
          type: string
        id:
          description: The id of the collaborator
          nullable: false
          type: string
          minLength: 1
          example: collab1a2b3c4d5
        name:
          description: The name of the collaborator
          nullable: true
          type: string
          example: John Doe
        email:
          description: The email address of the collaborator
          nullable: false
          type: string
          format: email
          example: john.doe@example.com
        role:
          description: >-
            The role of the collaborator. The project owner is included in the
            list with the role `owner`.
          nullable: false
          type: string
          enum:
            - owner
            - admin
            - read_only
            - customer_support
            - developer
            - growth_specialist
            - revenuecat
          example: admin
        accepted_at:
          description: >-
            The date when the collaborator accepted the invitation in ms since
            epoch
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        has_mfa:
          description: Whether the collaborator has 2FA enabled
          nullable: false
          type: boolean
          example: true
      additionalProperties: false
    Country:
      type: string
      nullable: true
      example: US
      description: The country that the object is associated with, in ISO alpha 2 code
      enum:
        - null
        - AF
        - AL
        - DZ
        - AS
        - AD
        - AO
        - AI
        - AQ
        - AG
        - AR
        - AM
        - AW
        - AU
        - AT
        - AZ
        - BS
        - BH
        - BD
        - BB
        - BY
        - BE
        - BZ
        - BJ
        - BM
        - BT
        - BO
        - BQ
        - BA
        - BW
        - BV
        - BR
        - IO
        - BN
        - BG
        - BF
        - BI
        - CV
        - KH
        - CM
        - CA
        - KY
        - CF
        - TD
        - CL
        - CN
        - CX
        - CC
        - CO
        - KM
        - CD
        - CG
        - CK
        - CR
        - HR
        - CU
        - CW
        - CY
        - CZ
        - CI
        - DK
        - DJ
        - DM
        - DO
        - EC
        - EG
        - SV
        - GQ
        - ER
        - EE
        - SZ
        - ET
        - FK
        - FO
        - FJ
        - FI
        - FR
        - GF
        - PF
        - TF
        - GA
        - GM
        - GE
        - DE
        - GH
        - GI
        - GR
        - GL
        - GD
        - GP
        - GU
        - GT
        - GG
        - GN
        - GW
        - GY
        - HT
        - HM
        - VA
        - HN
        - HK
        - HU
        - IS
        - IN
        - ID
        - IR
        - IQ
        - IE
        - IM
        - IL
        - IT
        - JM
        - JP
        - JE
        - JO
        - KZ
        - KE
        - KI
        - KP
        - KR
        - KW
        - KG
        - LA
        - LV
        - LB
        - LS
        - LR
        - LY
        - LI
        - LT
        - LU
        - MO
        - MG
        - MW
        - MY
        - MV
        - ML
        - MT
        - MH
        - MQ
        - MR
        - MU
        - YT
        - MX
        - FM
        - MD
        - MC
        - MN
        - ME
        - MS
        - MA
        - MZ
        - MM
        - NA
        - NR
        - NP
        - NL
        - NC
        - NZ
        - NI
        - NE
        - NG
        - NU
        - NF
        - MP
        - 'NO'
        - OM
        - PK
        - PW
        - PS
        - PA
        - PG
        - PY
        - PE
        - PH
        - PN
        - PL
        - PT
        - PR
        - QA
        - MK
        - RO
        - RU
        - RW
        - RE
        - BL
        - SH
        - KN
        - LC
        - MF
        - PM
        - VC
        - WS
        - SM
        - ST
        - SA
        - SN
        - RS
        - SC
        - SL
        - SG
        - SX
        - SK
        - SI
        - SB
        - SO
        - ZA
        - GS
        - SS
        - ES
        - LK
        - SD
        - SR
        - SJ
        - SE
        - CH
        - SY
        - TW
        - TJ
        - TZ
        - TH
        - TL
        - TG
        - TK
        - TO
        - TT
        - TN
        - TR
        - TM
        - TC
        - TV
        - UG
        - UA
        - AE
        - GB
        - UM
        - US
        - UY
        - UZ
        - VU
        - VE
        - VN
        - VG
        - VI
        - WF
        - EH
        - YE
        - ZM
        - ZW
        - AX
    CreateAppStoreConnectInAppPurchaseInput:
      type: object
      properties: {}
      additionalProperties: false
      description: In-app purchase products do not require any additional information
    CreateAppStoreConnectSubscriptionInput:
      type: object
      required:
        - duration
        - subscription_group_name
      properties:
        duration:
          type: string
          enum:
            - ONE_WEEK
            - ONE_MONTH
            - TWO_MONTHS
            - THREE_MONTHS
            - SIX_MONTHS
            - ONE_YEAR
          description: The subscription duration period
        subscription_group_name:
          type: string
          minLength: 1
          maxLength: 255
          description: The name of the subscription group
        subscription_group_id:
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          description: The ID of the subscription group (optional)
      additionalProperties: false
    CreateWebhookIntegrationInput:
      type: object
      required:
        - name
        - url
      properties:
        name:
          description: The display name of the webhook integration
          type: string
          minLength: 1
          maxLength: 1500
          example: Customer updates webhook
        url:
          description: The URL RevenueCat will send webhook notifications to
          type: string
          format: uri
          maxLength: 5000
          example: https://hooks.example.com/revenuecat
        authorization_header:
          description: >-
            Optional authorization header that will be sent with webhook
            notifications
          type: string
          nullable: true
          maxLength: 5000
          example: Bearer 123456
        environment:
          description: The environment the webhook integration is configured for
          type: string
          nullable: true
          enum:
            - production
            - sandbox
            - null
        event_types:
          description: Event types that will trigger the webhook
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/WebhookEventType'
        app_id:
          description: The ID of the app the webhook integration is scoped to
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          example: app_1234567890abcdef
      additionalProperties: false
    Currency:
      type: string
      description: ISO 4217 currency code
      nullable: false
      example: USD
      enum:
        - AED
        - AFN
        - ALL
        - AMD
        - ANG
        - AOA
        - ARS
        - AUD
        - AWG
        - AZN
        - BAM
        - BBD
        - BDT
        - BGN
        - BHD
        - BIF
        - BMD
        - BND
        - BOB
        - BRL
        - BSD
        - BTC
        - BTN
        - BWP
        - BYN
        - BZD
        - CAD
        - CDF
        - CHF
        - CLF
        - CLP
        - CNH
        - CNY
        - COP
        - CRC
        - CUC
        - CUP
        - CVE
        - CZK
        - DJF
        - DKK
        - DOP
        - DZD
        - EGP
        - ERN
        - ETB
        - EUR
        - FJD
        - FKP
        - GBP
        - GEL
        - GGP
        - GHS
        - GIP
        - GMD
        - GNF
        - GTQ
        - GYD
        - HKD
        - HNL
        - HRK
        - HTG
        - HUF
        - IDR
        - ILS
        - IMP
        - INR
        - IQD
        - IRR
        - ISK
        - JEP
        - JMD
        - JOD
        - JPY
        - KES
        - KGS
        - KHR
        - KMF
        - KPW
        - KRW
        - KWD
        - KYD
        - KZT
        - LAK
        - LBP
        - LKR
        - LRD
        - LSL
        - LYD
        - MAD
        - MDL
        - MGA
        - MKD
        - MMK
        - MNT
        - MOP
        - MRU
        - MUR
        - MVR
        - MWK
        - MXN
        - MYR
        - MZN
        - NAD
        - NGN
        - NIO
        - NOK
        - NPR
        - NZD
        - OMR
        - PAB
        - PEN
        - PGK
        - PHP
        - PKR
        - PLN
        - PYG
        - QAR
        - RON
        - RSD
        - RUB
        - RWF
        - SAR
        - SBD
        - SCR
        - SDG
        - SEK
        - SGD
        - SHP
        - SLL
        - SOS
        - SRD
        - SSP
        - STD
        - STN
        - SVC
        - SYP
        - SZL
        - THB
        - TJS
        - TMT
        - TND
        - TOP
        - TRY
        - TTD
        - TWD
        - TZS
        - UAH
        - UGX
        - USD
        - UYU
        - UZS
        - VEF
        - VES
        - VND
        - VUV
        - WST
        - XAF
        - XAG
        - XAU
        - XCD
        - XDR
        - XOF
        - XPD
        - XPF
        - XPT
        - YER
        - ZAR
        - ZMW
        - ZWL
    Customer:
      type: object
      required:
        - id
        - project_id
        - first_seen_at
        - last_seen_at
        - last_seen_app_version
        - last_seen_country
        - last_seen_platform
        - last_seen_platform_version
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - customer
          type: string
        id:
          type: string
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        project_id:
          nullable: false
          description: ID of the project to which the customer belongs
          minLength: 1
          maxLength: 20
          type: string
          example: proj1ab2c3d4
        first_seen_at:
          nullable: false
          description: The first time the customer was seen
          type: integer
          format: int64
          example: 1658399423658
        last_seen_at:
          nullable: true
          description: The last time the customer was seen
          type: integer
          format: int64
          example: 1658399423658
        last_seen_app_version:
          nullable: true
          description: The last app version the customer was seen on
          type: string
          example: 1.0.0
        last_seen_country:
          nullable: true
          description: The last country the customer was seen in
          type: string
          example: US
        last_seen_platform:
          nullable: true
          description: The last platform the customer was seen on
          type: string
          example: android
        last_seen_platform_version:
          nullable: true
          description: The last platform version the customer was seen on
          type: string
          example: '35'
        active_entitlements:
          allOf:
            - type: object
              description: >-
                List of the entitlements currently active for the customer. This
                property is only available in the "Get a customer" endpoint.
              nullable: true
            - $ref: '#/components/schemas/ListCustomerActiveEntitlements'
        experiment:
          description: The experiment enrollment object
          nullable: true
          $ref: '#/components/schemas/ExperimentEnrollment'
        attributes:
          allOf:
            - type: object
              description: >-
                List of the attributes of the customer. This is an expandable
                property, only available in the "Get a customer" endpoint.
              nullable: true
            - $ref: '#/components/schemas/ListCustomerAttributes'
      additionalProperties: false
    CustomerAlias:
      type: object
      required:
        - id
        - created_at
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - customer.alias
          type: string
        id:
          type: string
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        created_at:
          nullable: false
          description: The time when the alias was created
          type: integer
          format: int64
          example: 1658399423658
      additionalProperties: false
    CustomerAttribute:
      type: object
      required:
        - name
        - value
        - updated_at
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - customer.attribute
          type: string
        name:
          nullable: false
          description: >-
            The name of the attribute. Reserved attributes are prefixed with a
            `$`.
          type: string
          maxLength: 1500
          example: $email
        value:
          nullable: true
          description: The value of the attribute.
          type: string
          example: garfield@revenuecat.com
        updated_at:
          nullable: false
          description: The time when the attribute was last updated.
          type: integer
          format: int64
          example: 1658399423658
      additionalProperties: false
    CustomerAttributeCustomName:
      type: string
      maxLength: 40
      pattern: ^[a-zA-Z][a-zA-Z0-9_-]*$
      example: opt_into_marketing
    CustomerAttributeReservedName:
      type: string
      enum:
        - $ad
        - $adGroup
        - $adjustId
        - $airbridgeDeviceId
        - $airshipChannelId
        - $amazonAdId
        - $amplitudeDeviceId
        - $amplitudeUserId
        - $appleRefundHandlingPreference
        - $appleAdsAdGroupId
        - $appleAdsCampaignId
        - $appleAdsKeywordId
        - $apnsTokens
        - $appsflyerId
        - $appsflyerSharingFilter
        - $attConsentStatus
        - $branchId
        - $brazeAliasLabel
        - $brazeAliasName
        - $campaign
        - $clevertapId
        - $creative
        - $customerioId
        - $displayName
        - $email
        - $fbAnonId
        - $fcmTokens
        - $firebaseAppInstanceId
        - $gpsAdId
        - $idfa
        - $idfv
        - $ip
        - $iterableCampaignId
        - $iterableTemplateId
        - $iterableUserId
        - $keyword
        - $kochavaDeviceId
        - $mediaSource
        - $mixpanelDistinctId
        - $mparticleId
        - $onesignalId
        - $onesignalUserId
        - $phoneNumber
        - $posthogUserId
        - $telemetryDeckUserId
        - $telemetryDeckAppId
        - telemetry_deck_user_id
        - telemetry_deck_app_id
        - $segmentId
        - $solarEngineDistinctId
        - $solarEngineAccountId
        - $solarEngineVisitorId
        - $tenjinId
        - $deviceVersion
      example: $email
    CustomerCenterConfig:
      type: object
      required:
        - object
        - customer_center
      additionalProperties: false
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          type: string
          enum:
            - customer_center_config
          example: customer_center_config
        customer_center:
          description: >
            The Customer Center configuration. When no platform is specified,
            contains the full configuration for all platforms and locales. When
            a platform is specified, contains the processed configuration for
            that platform and locale.
          type: object
          additionalProperties: true
          example: {}
    CustomerEntitlement:
      type: object
      required:
        - entitlement_id
        - expires_at
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - customer.active_entitlement
          type: string
        entitlement_id:
          nullable: false
          description: ID of the entitlement granted to the customer
          minLength: 1
          maxLength: 255
          type: string
          example: entla1b2c3d4e5
        expires_at:
          nullable: true
          description: >-
            The date after which the access to the entitlement expires in ms
            since epoch
          type: integer
          format: int64
          example: 1658399423658
      additionalProperties: false
    DeletedObject:
      type: object
      required:
        - object
        - id
        - deleted_at
      properties:
        object:
          description: The type of the deleted object
          enum:
            - app
            - chart_annotation
            - customer
            - discount
            - entitlement
            - experiment
            - offering
            - package
            - paywall
            - product
            - virtual_currency
            - webhook_integration
          type: string
        id:
          description: The ID of the deleted object
          nullable: false
          type: string
        deleted_at:
          nullable: false
          type: integer
          format: int64
          description: The date when the object was deleted in ms since epoch
          example: 1658399423658
      additionalProperties: false
    Duration:
      type: string
      description: >-
        The duration of the product subscription. This field is only supported
        for the test store and it is ignored for other stores.
      nullable: false
      example: P1W
      enum:
        - P1W
        - P1M
        - P2M
        - P3M
        - P6M
        - P1Y
    EligibilityCriteria:
      type: string
      nullable: false
      enum:
        - all
        - google_sdk_lt_6
        - google_sdk_ge_6
    Entitlement:
      type: object
      required:
        - project_id
        - id
        - lookup_key
        - display_name
        - state
        - created_at
        - object
      properties:
        state:
          description: Whether the entitlement is active or inactive (archived).
          nullable: false
          type: string
          enum:
            - active
            - inactive
          example: active
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - entitlement
          type: string
        project_id:
          nullable: false
          description: ID of the project to which the entitlement belongs
          minLength: 1
          maxLength: 20
          type: string
          example: proj1ab2c3d4
        id:
          description: The id of the entitlement
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: entla1b2c3d4e5
        lookup_key:
          description: A custom identifier of the entitlement
          nullable: false
          type: string
          minLength: 1
          maxLength: 200
          example: premium
        display_name:
          description: The display name of the entitlement
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: Premium
        created_at:
          nullable: false
          type: integer
          format: int64
          description: The date when the entitlement was created in ms since epoch
          example: 1658399423658
        products:
          description: List of products attached to the entitlement
          nullable: true
          required:
            - items
            - next_page
            - object
            - url
          title: ProductsList
          type: object
          properties:
            object:
              description: >-
                String representing the object's type. Objects of the same type
                share the same value. Always has the value `list`.
              enum:
                - list
              type: string
            items:
              description: Details about each object.
              items:
                $ref: '#/components/schemas/Product'
              type: array
            next_page:
              description: >-
                URL to access the next page of the Entitlement's products. If
                not present / null, there is no next page
              type: string
              nullable: true
              example: >-
                /v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac
            url:
              description: The URL where this list can be accessed.
              maxLength: 5000
              type: string
              example: /v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products
      additionalProperties: false
    EntityReferencesArchivedEntitiesError:
      description: >-
        Error returned when attempting to make an entity active, but that entity
        references other entities that are currently inactive (archived). The
        `referenced_object_ids` field lists the IDs of the inactive entities
        that must be made active first.
      allOf:
        - $ref: '#/components/schemas/Error'
        - type: object
          required:
            - referenced_object_ids
          properties:
            type:
              type: string
              enum:
                - entity_references_archived_entities
            referenced_object_ids:
              description: >-
                The IDs of the archived (inactive) entities that need to be made
                active before this operation can succeed.
              type: array
              items:
                type: string
              example:
                - prodabcd1234
                - prodwxyz5678
    Environment:
      type: string
      description: The store environment
      example: production
      nullable: false
      enum:
        - production
        - sandbox
    Error:
      type: object
      required:
        - type
        - message
        - retryable
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - error
          type: string
          example: error
        type:
          description: The error type
          type: string
          nullable: false
          enum:
            - parameter_error
            - resource_already_exists
            - resource_missing
            - idempotency_error
            - rate_limit_error
            - authentication_error
            - authorization_error
            - store_error
            - server_error
            - resource_locked_error
            - unprocessable_entity_error
            - invalid_request
            - entity_references_archived_entities
          example: parameter_error
        param:
          description: >-
            If the error is parameter-specific, the parameter related to the
            error
          type: string
          nullable: true
          example: customer_id
        doc_url:
          description: A URL to more information about the error reported
          type: string
          nullable: false
          example: https://errors.rev.cat/parameter-error
        message:
          type: string
          description: A message describing the reason of the error
          nullable: false
          example: id shouldn't be longer than 1,500 characters
        retryable:
          description: Indicates if the error is retryable or not
          type: boolean
          nullable: false
          example: false
        backoff_ms:
          description: >-
            The ms the client should wait before retrying the request. Only
            present for retryable errors.
          type: integer
          nullable: true
          example: null
        referenced_object_ids:
          description: >-
            The IDs of related objects relevant to the error, such as the
            archived entities that need to be made active before the operation
            can succeed.
          type: array
          items:
            type: string
          example:
            - prodabcd1234
            - prodwxyz5678
      additionalProperties: false
    ExperimentEnrollment:
      type: object
      required:
        - id
        - name
        - variant
        - object
      nullable: true
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - experiment_enrollment
          type: string
        id:
          type: string
          maxLength: 1500
        name:
          type: string
          maxLength: 1500
        variant:
          nullable: false
          description: >-
            The variant of the Experiment that the Customer was or is assigned
            to, where 'a' represents the Control, and 'b' represents the
            Treatment.
          minLength: 1
          maxLength: 1
          type: string
          example: a
      additionalProperties: false
    ExtendSubscriptionByDuration:
      type: object
      additionalProperties: false
      required:
        - extend_by_days
      properties:
        extend_by_days:
          type: integer
          minimum: 1
          description: |
            Number of days to extend the current billing period by.
            For Apple Store subscriptions, the maximum allowed value is 90.
          example: 14
        extend_reason_code:
          type: string
          enum:
            - undeclared
            - customer_satisfaction
            - other
            - service_issue_or_outage
          description: |
            Reason for the extension. Required for Apple Store subscriptions;
            ignored for Google Play and Web Billing subscriptions.
          example: customer_satisfaction
    ExtendSubscriptionUntilDate:
      type: object
      additionalProperties: false
      required:
        - extend_until_ms
      properties:
        extend_until_ms:
          type: integer
          format: int64
          description: >
            Absolute epoch timestamp (in milliseconds) to which the current
            billing

            period should be extended. Must be after the subscription's current

            `current_period_ends_at`. For Apple Store subscriptions, the
            resulting

            extension cannot exceed 90 days.
          example: 1735689600000
        extend_reason_code:
          type: string
          enum:
            - undeclared
            - customer_satisfaction
            - other
            - service_issue_or_outage
          description: |
            Reason for the extension. Required for Apple Store subscriptions;
            ignored for Google Play and Web Billing subscriptions.
          example: customer_satisfaction
    IndicativePrice:
      type: object
      nullable: true
      description: >-
        An indicative price for a product, in the default currency/country (USD
        / US). Uses the same price source as the get-offering-prices endpoint.
      required:
        - object
        - currency
        - country
        - amount_micros
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          type: string
          enum:
            - indicative_price
        currency:
          $ref: '#/components/schemas/Currency'
        country:
          $ref: '#/components/schemas/Country'
        amount_micros:
          $ref: '#/components/schemas/AmountMicros'
      additionalProperties: false
    Invoice:
      type: object
      required:
        - id
        - total_amount
        - line_items
        - issued_at
        - paid_at
        - invoice_url
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - invoice
          type: string
        id:
          description: The id of the invoice
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: rcbin1a2b3c4d5e
        total_amount:
          $ref: '#/components/schemas/MonetaryAmount'
        line_items:
          description: >-
            List of line items that are part of the invoice. Each line item
            represents a product that was purchased.
          title: InvoiceLiteItemList
          nullable: false
          items:
            $ref: '#/components/schemas/InvoiceLineItem'
          type: array
        issued_at:
          description: The date when the invoiced was issued in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        paid_at:
          description: The date when the invoiced was paid in ms since epoch
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        invoice_url:
          description: URL to download the invoice pdf
          nullable: true
          type: string
          example: >-
            https://api.revenuecat.com/v2/projects/proj1ab2c3d4/customers/cust1ab2c3d4/invoices/inv1ab2c3d4/file
      additionalProperties: false
    InvoiceLineItem:
      type: object
      required:
        - product_identifier
        - product_display_name
        - product_duration
        - quantity
        - unit_amount
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - invoice.line_item
          type: string
        product_identifier:
          description: The product identifier
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: rc_1w_199
        product_display_name:
          description: The display name of the product
          nullable: true
          type: string
          minLength: 1
          maxLength: 1500
          example: Premium Monthly 2023
        product_duration:
          type: string
          pattern: >-
            ^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$
          nullable: true
          description: The duration of the subscription in ISO-8601 standard
          example: P1M
        quantity:
          description: Total purchased items
          nullable: false
          type: integer
          example: 1
        unit_amount:
          $ref: '#/components/schemas/MonetaryAmount'
      additionalProperties: false
    ListApps:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: AppList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/App'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's apps. If not present /
            null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/projec1a2b3c4d/apps?starting_after=app1a2b3c4d
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/projec1a2b3c4d/apps
      additionalProperties: false
    ListAuditLogs:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: AuditLogList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each audit log.
          items:
            $ref: '#/components/schemas/AuditLog'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's audit logs. If not
            present / null, there is no next page.
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/audit_logs?starting_after=log1ab2c3d4e5
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/audit_logs
      additionalProperties: false
    ListCollaborators:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CollaboratorList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Collaborator'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's collaborators. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/collaborators?starting_after=collab1a2b3c4d5
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/collaborators
      additionalProperties: false
    ListCustomerActiveEntitlements:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CustomerActiveEntitlementList
      description: >-
        List of the entitlements currently active for the customer. This
        property is only available in the "Get a customer" endpoint.
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/CustomerEntitlement'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's active entitlements.
            If not present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements
      additionalProperties: false
    ListCustomerAliases:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CustomerAliasList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/CustomerAlias'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's aliases. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases?starting_after=9fjeja8fjed
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases
      additionalProperties: false
    ListCustomerAttributes:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CustomerAttributeList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/CustomerAttribute'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's aliases. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes
      additionalProperties: false
    ListCustomerInvoices:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CustomerInvoicesList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Invoice'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's invoice. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/invoices?starting_after=rcbin1a2b3c4d5e
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/invoices
      additionalProperties: false
    ListCustomers:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: CustomerList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Customer'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's customers. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/projec1a2b3c4d/customers?starting_after=223xx1100
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/projec1a2b3c4d/customers
      additionalProperties: false
    ListEntitlements:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: EntitlementList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Entitlement'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's entitlements. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/entitlements?starting_after=entlab21dac
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/entitlements
      additionalProperties: false
    ListOfferings:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: OfferingList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Offering'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's offerings. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/offerings?starting_after=ofrngeab21da
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/offerings
      additionalProperties: false
    ListPackages:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: PackageList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Package'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's packages. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages
      additionalProperties: false
    ListPaywalls:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: PaywallList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Paywall'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's paywalls. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/paywalls?starting_after=pwXXXXXXXXXXXXXX
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/paywalls
      additionalProperties: false
    ListProducts:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: ProductList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Product'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's products. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/products?starting_after=prodab21dac
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/products
      additionalProperties: false
    ListProjects:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: ProjectList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Project'
          type: array
        next_page:
          description: >-
            URL to access the next page of the projects. If not present / null,
            there is no next page
          type: string
          nullable: true
          example: /v2/projects?starting_after=projab21dac
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects
      additionalProperties: false
    ListPublicApiKeys:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: PublicApiKeyList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/PublicApiKey'
          type: array
        next_page:
          description: >-
            URL to access the next page of the app's public API keys. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/projec1a2b3c4d/apps/app1a2b3c4d/public_api_keys?starting_after=pub1a2b3c4d
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/projec1a2b3c4d/apps/app1a2b3c4d/public_api_keys
      additionalProperties: false
    ListPurchases:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: PurchaseList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Purchase'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's purchases. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases?starting_after=purc1a2b3c4d5e
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases
      additionalProperties: false
    ListSubscriptionTransaction:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: SubscriptionTransactionList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/SubscriptionTransaction'
          type: array
        next_page:
          description: >-
            URL to access the next page of the projects. If not present / null,
            there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj123/subscriptions/sub123/transactions?starting_after=GPA.0000-0000-0000-00000
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj123/subscriptions/sub123/transactions
      additionalProperties: false
    ListSubscriptions:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: SubscriptionList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Subscription'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's subscriptions. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions?starting_after=sub1a2b3c4d
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions
      additionalProperties: false
    ListVirtualCurrencies:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: VirtualCurrencyList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/VirtualCurrency'
          type: array
        next_page:
          description: >-
            URL to access the next page of the project's virtual currencies. If
            not present / null, there is no next page
          type: string
          nullable: true
          example: /v2/projects/proj1ab2c3d4/virtual_currencies?starting_after=GLD
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/virtual_currencies
      additionalProperties: false
    ListVirtualCurrenciesBalances:
      type: object
      title: VirtualCurrenciesBalancesList
      required:
        - items
        - next_page
        - object
        - url
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/VirtualCurrencyBalance'
          type: array
        next_page:
          description: >-
            URL to access the next page of the customer's balances. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies?starting_after=9fjeja8fjed
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: >-
            /v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies
      additionalProperties: false
    ListWebhookIntegrations:
      required:
        - items
        - object
        - url
      title: WebhookIntegrationList
      type: object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the

            same value.
          enum:
            - list
          type: string
        items:
          description: Webhook integrations configured for the project.
          type: array
          items:
            $ref: '#/components/schemas/WebhookIntegration'
        next_page:
          description: >-
            URL to access the next page of webhook integrations. If not present
            / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/integrations/webhooks?starting_after=whintgr1a2b3c4d
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/integrations/webhooks
      additionalProperties: false
    MacAppStoreApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - mac_app_store
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - mac_app_store
          example: mac_app_store
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        mac_app_store:
          description: Legacy Mac App Store type details
          type: object
          required:
            - bundle_id
          nullable: false
          additionalProperties: true
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
            custom_url_scheme:
              description: >-
                The custom URL scheme for the app, derived from the app's public
                ID.
              type: string
              nullable: false
              example: rc-1a2b3c4
      additionalProperties: true
    MacAppStoreAppCreate:
      type: object
      required:
        - name
        - type
        - mac_app_store
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - mac_app_store
          nullable: false
        mac_app_store:
          description: >-
            Mac App Store type details. Should only be used when type is
            mac_app_store.
          type: object
          required:
            - bundle_id
          nullable: false
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              minLength: 1
              maxLength: 256
              nullable: false
            shared_secret:
              description: The shared secret of the app
              type: string
              minLength: 32
              maxLength: 32
              nullable: false
          additionalProperties: false
      additionalProperties: false
    MediaAsset:
      type: object
      required:
        - object
        - id
        - object_name
        - original_name
        - original_size
        - original_width
        - original_height
        - formats
        - alt_text
        - is_decorative
        - asset_base_url
        - asset_type
        - video_metadata
        - transcoding_status
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - media_asset
          type: string
          example: media_asset
        id:
          description: The ID of the media asset.
          type: string
          minLength: 1
          maxLength: 255
          example: mediaasset123456789abcdef
        object_name:
          description: The storage object name for the original asset.
          type: string
          minLength: 1
          maxLength: 5000
          example: paywalls/originals/abc123.webp
        original_name:
          description: The uploaded file name.
          type: string
          minLength: 1
          maxLength: 5000
          example: hero.webp
        original_size:
          description: The original file size in kilobytes.
          type: integer
          format: int64
          example: 12345
        original_width:
          description: The original image width in pixels.
          type: integer
          nullable: true
          example: 1024
        original_height:
          description: The original image height in pixels.
          type: integer
          nullable: true
          example: 1024
        formats:
          description: Rendered image formats keyed by format name.
          type: object
          nullable: true
          additionalProperties:
            $ref: '#/components/schemas/MediaAssetFormat'
        alt_text:
          description: Alt text for the asset.
          type: string
          nullable: true
          maxLength: 1500
          example: A dog looking at a phone
        is_decorative:
          description: Whether this asset is decorative.
          type: boolean
          example: false
        asset_base_url:
          description: The base URL where asset object names can be resolved.
          type: string
          nullable: true
          maxLength: 5000
          example: https://paywalls-assets.revenuecat.com
        asset_type:
          description: The media asset type.
          type: string
          enum:
            - image
            - video
          example: image
        video_metadata:
          description: Video metadata, if this is a video asset.
          type: object
          nullable: true
          additionalProperties: true
        transcoding_status:
          description: The video transcoding status, if this is a video asset.
          type: string
          nullable: true
          example: null
      additionalProperties: false
    MediaAssetFormat:
      type: object
      required:
        - object
        - object_name
        - size
        - width
        - height
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - media_asset_format
          type: string
          example: media_asset_format
        object_name:
          description: The storage object name for this rendered asset format.
          type: string
          minLength: 1
          maxLength: 5000
          example: paywalls/abc123.webp
        size:
          description: The file size in kilobytes.
          type: integer
          format: int64
          example: 12345
        width:
          description: The image width in pixels.
          type: integer
          nullable: true
          example: 1024
        height:
          description: The image height in pixels.
          type: integer
          nullable: true
          example: 1024
      additionalProperties: false
    MonetaryAmount:
      type: object
      required:
        - currency
        - gross
        - tax
        - proceeds
      properties:
        currency:
          $ref: '#/components/schemas/Currency'
        gross:
          description: Total revenue generated (excluding taxes and commission)
          nullable: false
          type: number
          example: 9.99
        commission:
          description: >-
            Store commission or payment processor fees deducted from gross
            revenue (if any)
          nullable: false
          type: number
          example: 2.99
        tax:
          description: Estimated taxes deducted from gross revenue
          nullable: false
          type: number
          example: 0.75
        proceeds:
          description: Net revenue after store commission / fees and taxes
          nullable: false
          type: number
          example: 6.25
      additionalProperties: true
    Offering:
      type: object
      required:
        - id
        - lookup_key
        - display_name
        - is_current
        - state
        - created_at
        - project_id
        - object
        - paywall_id
      properties:
        state:
          description: >-
            Whether the offering is active or inactive (archived). Inactive
            offerings are not returned by the SDK.
          nullable: false
          type: string
          enum:
            - active
            - inactive
          example: active
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - offering
          type: string
        id:
          description: The id of the offering
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: ofrnge1a2b3c4d5
        lookup_key:
          description: A custom identifier of the entitlement
          nullable: false
          type: string
          minLength: 1
          maxLength: 200
          example: default
        display_name:
          description: The display name of the offering
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: The standard set of packages
        is_current:
          description: Indicates if the offering is the current offering
          nullable: false
          type: boolean
          example: true
        created_at:
          description: The date the offering was created at in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        project_id:
          description: ID of the project to which the offering belongs
          nullable: false
          minLength: 1
          maxLength: 20
          type: string
          example: proj1ab2c3d4
        paywall_id:
          description: >-
            ID of the v2-visible paywall attached to this offering, or null if
            none.
          nullable: true
          type: string
          minLength: 1
          maxLength: 255
          example: pw12345abcde
        metadata:
          description: Custom metadata of the offering
          nullable: true
          $ref: '#/components/schemas/OfferingMetadata'
        packages:
          nullable: true
          required:
            - items
            - next_page
            - object
            - url
          title: PackageList
          type: object
          properties:
            object:
              description: >-
                String representing the object's type. Objects of the same type
                share the same value. Always has the value `list`.
              enum:
                - list
              type: string
            items:
              description: Details about each object.
              items:
                $ref: '#/components/schemas/Package'
              type: array
            next_page:
              description: >-
                URL to access the next page of the Offering's packages. If not
                present / null, there is no next page
              type: string
              nullable: true
              example: >-
                /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac
            url:
              description: The URL where this list can be accessed.
              maxLength: 5000
              type: string
              example: /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages
      additionalProperties: false
    OfferingMetadata:
      description: Custom metadata of the offering
      type: object
      nullable: true
      additionalProperties: true
      example:
        color: blue
        call_to_action: Subscribe Now!
    OneTimeProduct:
      type: object
      required:
        - is_consumable
      nullable: true
      properties:
        is_consumable:
          type: boolean
          nullable: true
          description: Indicates whether the product is consumable or not.
          example: true
      additionalProperties: true
    OverviewMetric:
      type: object
      required:
        - id
        - name
        - description
        - unit
        - period
        - value
        - last_updated_at
        - last_updated_at_iso8601
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - overview_metric
          type: string
        id:
          description: Id of the overview metric
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: active_trials
        name:
          description: Display name of the overview metric
          nullable: false
          type: string
          example: Active Trials
        description:
          description: Description of the overview metric
          nullable: false
          type: string
        unit:
          description: Unit of the overview metric
          nullable: false
          type: string
          example: $
        period:
          description: >-
            Length of time during which metric data is collected in ISO 8601
            format. Zero period means metric data was collected now
          nullable: false
          type: string
          enum:
            - P0D
            - P28D
          example: P0D
        value:
          description: Value of the overview metric
          nullable: false
          type: number
          example: 34765
        last_updated_at:
          description: Last time the overview metric was updated in ms since epoch
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        last_updated_at_iso8601:
          description: >-
            Last time the overview metric was updated datetime in ISO 8601
            format
          nullable: true
          type: string
          format: date-time
          example: '2022-10-13 09:45:00.123000+00:00'
      additionalProperties: false
    OverviewMetrics:
      type: object
      required:
        - metrics
        - object
        - currency
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - overview_metrics
          type: string
        metrics:
          description: Details about each overview metric.
          items:
            $ref: '#/components/schemas/OverviewMetric'
          type: array
        currency:
          description: >-
            The currency that monetary metric values are expressed in. Defaults
            to USD. When the request is authenticated with a developer JWT/OAuth
            token and no `currency` query parameter is provided, this reflects
            the developer's saved dashboard display currency.
          type: string
          enum:
            - USD
            - EUR
            - GBP
            - AUD
            - CAD
            - JPY
            - BRL
            - KRW
            - CNY
            - MXN
            - SEK
            - PLN
            - NZD
            - CHF
          example: EUR
      additionalProperties: false
    Ownership:
      type: string
      example: purchased
      enum:
        - purchased
        - family_shared
    Package:
      type: object
      required:
        - id
        - lookup_key
        - display_name
        - position
        - created_at
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - package
          type: string
        id:
          description: The id of the package
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: pkge1a2b3c4d5
        lookup_key:
          description: The lookup_key of the package
          nullable: false
          example: monthly
          type: string
          minLength: 1
          maxLength: 200
        display_name:
          description: The display name of the package
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: Monthly discounted with 3-day trial
        position:
          description: The position of the package within the offering
          nullable: true
          type: integer
          example: 1
        created_at:
          description: The date the package was created at in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        products:
          nullable: true
          required:
            - items
            - next_page
            - object
            - url
          title: ProductList
          properties:
            object:
              description: >-
                String representing the object's type. Objects of the same type
                share the same value. Always has the value `list`.
              enum:
                - list
              type: string
            items:
              description: Product association
              items:
                $ref: '#/components/schemas/PackageProductAssociation'
              type: array
            next_page:
              description: >-
                URL to access the next page of the project's products. If not
                present / null, there is no next page
              type: string
              nullable: true
              example: >-
                /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac
            url:
              description: The URL where this list can be accessed.
              maxLength: 5000
              type: string
              example: >-
                /v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products
      additionalProperties: false
    PackageProductAssociation:
      type: object
      required:
        - product
        - eligibility_criteria
      properties:
        product:
          $ref: '#/components/schemas/Product'
          nullable: false
        eligibility_criteria:
          $ref: '#/components/schemas/EligibilityCriteria'
          nullable: false
      additionalProperties: true
    PackageProductIDAssociation:
      type: object
      required:
        - product_id
        - eligibility_criteria
      properties:
        product_id:
          type: string
          maxLength: 255
          minLength: 1
          nullable: false
        eligibility_criteria:
          $ref: '#/components/schemas/EligibilityCriteria'
          nullable: false
      additionalProperties: false
    PaddleApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - paddle
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - paddle
          example: paddle
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        paddle:
          description: Paddle Billing type details
          type: object
          nullable: false
          additionalProperties: true
          properties:
            paddle_is_sandbox:
              description: Whether the app is tied to the sandbox environment.
              nullable: false
              type: boolean
              example: true
            paddle_api_key:
              description: Paddle Server-side API key provided on the Paddle dashboard.
              type: string
              nullable: true
              minLength: 50
              maxLength: 70
      additionalProperties: true
    PaddleAppCreate:
      type: object
      required:
        - name
        - type
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - paddle
          nullable: false
        paddle:
          description: Paddle Billing details. Should only be used when type is paddle.
          type: object
          nullable: true
          properties:
            paddle_api_key:
              description: Paddle Server-side API key provided on the Paddle dashboard.
              type: string
              nullable: true
              minLength: 50
              maxLength: 70
            paddle_is_sandbox:
              description: |
                [Deprecated] Whether the app is tied to the sandbox environment.
                This field is deprecated and will be removed in the future.
                The environment is determined by the `paddle_api_key` format.
              nullable: true
              type: boolean
              example: true
          additionalProperties: false
      additionalProperties: false
    Paywall:
      type: object
      required:
        - id
        - name
        - offering_id
        - created_at
        - published_at
        - automatically_scale_font_size
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - paywall
          type: string
        id:
          description: The id of the paywall
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: pw123456789abcdef
        name:
          description: The name of the paywall
          nullable: true
          type: string
          minLength: 1
          maxLength: 255
          example: My Awesome Paywall
        offering_id:
          description: The ID of the offering the paywall is for.
          nullable: true
          type: string
          minLength: 1
          maxLength: 255
          example: ofrng123456789a
        created_at:
          description: The date the paywall was created at in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        published_at:
          description: The date the paywall was published at in ms since epoch
          nullable: true
          type: integer
          format: int64
          example: 1658399423958
        automatically_scale_font_size:
          description: Whether font sizes should automatically scale for this paywall.
          nullable: false
          type: boolean
          default: true
          example: true
        offering:
          description: The offering associated with this paywall. Expandable.
          nullable: true
          $ref: '#/components/schemas/Offering'
        components:
          description: >-
            Published and draft components configurations for this paywall.
            Expandable.
          nullable: true
          $ref: '#/components/schemas/PaywallComponents'
      additionalProperties: false
    PaywallComponents:
      type: object
      required:
        - published
        - draft
      properties:
        published:
          description: >-
            The currently published version of the paywall. Null if the paywall
            has never been published.
          nullable: true
          $ref: '#/components/schemas/PaywallComponentsVersion'
        draft:
          description: >-
            The draft version of the paywall if there are unpublished changes.
            Null if there are no unpublished changes.
          nullable: true
          $ref: '#/components/schemas/PaywallComponentsVersion'
      additionalProperties: false
    PaywallComponentsVersion:
      description: >-
        A specific version (published or draft) of a paywall's components
        configuration.
      type: object
      nullable: true
      required:
        - revision
        - components_config
        - default_locale
        - components_localizations
        - automatically_scale_font_size
      properties:
        revision:
          description: The revision number of this version.
          type: integer
          nullable: true
          example: 1
        components_config:
          description: >-
            The raw, schemaless JSON payload for paywall components
            configuration.
          type: object
          nullable: true
          additionalProperties: true
          example:
            base:
              stack:
                id: l7Ylx2UZeA
                type: stack
                components:
                  - id: LFVZUCf9yW
                    type: text
                    text_lid: OBUxLwsvXb
              sticky_footer:
                id: UJJRRPzRuz
                type: footer
        default_locale:
          description: The default locale for the paywall.
          type: string
          nullable: true
          example: en_US
        components_localizations:
          description: Localized values keyed by locale code.
          type: object
          additionalProperties:
            type: object
            additionalProperties: true
          example:
            en_US:
              title: Premium
        automatically_scale_font_size:
          description: Whether font sizes should automatically scale for this paywall.
          type: boolean
          default: true
          example: true
        fonts:
          description: >-
            Font objects used by the published paywall components. Only present
            on published versions.
          type: object
          nullable: true
          additionalProperties: true
          example:
            CustomFont:
              src: https://example.com/font.ttf
      additionalProperties: false
    PaywallDraftCreate:
      type: object
      required:
        - components_config
        - components_localizations
      properties:
        offering_id:
          description: >
            The optional ID of the offering the paywall draft will be attached
            to.
          type: string
          nullable: true
          minLength: 1
          maxLength: 200
          example: ofrng123456789a
        name:
          description: Optional paywall name.
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          example: Main Paywall
        components_config:
          description: The raw paywall components configuration to save as the draft.
          type: object
          additionalProperties: true
          example:
            base:
              stack:
                id: main_stack
                type: stack
                components: []
        components_localizations:
          description: Localized component values keyed by locale.
          type: object
          additionalProperties:
            type: object
            additionalProperties: true
          example:
            en_US:
              title: Premium
        default_locale:
          description: The default locale for this paywall. Defaults to en_US.
          type: string
          minLength: 1
          maxLength: 255
          default: en_US
          example: en_US
        automatically_scale_font_size:
          description: >-
            Whether font sizes should automatically scale for this paywall.
            Defaults to true.
          type: boolean
          default: true
          example: true
      additionalProperties: false
    PaywallDraftUpdate:
      type: object
      additionalProperties: false
      required:
        - revision
        - components_config
        - components_localizations
        - default_locale
      properties:
        revision:
          description: The current draft revision. Used to reject stale writes.
          type: integer
          example: 1
        components_config:
          description: The raw paywall components configuration to save as the draft.
          type: object
          additionalProperties: true
          example:
            base:
              stack:
                id: main_stack
                type: stack
                components: []
        components_localizations:
          description: Localized component values keyed by locale.
          type: object
          additionalProperties:
            type: object
            additionalProperties: true
          example:
            en_US:
              title: Premium
        default_locale:
          description: The default locale for this paywall.
          type: string
          minLength: 1
          maxLength: 255
          example: en_US
        name:
          description: Optional paywall name.
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          example: Main Paywall
        automatically_scale_font_size:
          description: >-
            Whether font sizes should automatically scale for this paywall
            draft.
          type: boolean
          example: true
        exit_offers:
          description: Exit offer configuration to save on the draft.
          type: object
          additionalProperties: true
          example:
            dismiss:
              offering_id: ofrng123456789abcdef
        state_declarations:
          description: State declarations to save on the draft.
          type: object
          additionalProperties: true
          example:
            selectedPackage:
              type: string
              default: monthly
        play_store_product_change_mode:
          description: Play Store product change mode configuration to save on the draft.
          type: object
          additionalProperties: true
          example:
            upgrade_replacement_mode: deferred
    PaywallVersion:
      type: object
      required:
        - id
        - name
        - revision
        - created_at
        - components_config
        - components_localizations
        - default_locale
        - automatically_scale_font_size
        - exit_offers
        - state_declarations
        - play_store_product_change_mode
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - paywall_version
          type: string
        id:
          description: The id of the paywall version.
          type: string
          minLength: 1
          maxLength: 255
          example: pwv123456789abcdef
        name:
          description: The name of the paywall version.
          type: string
          minLength: 1
          maxLength: 255
          example: Before AI edit
        revision:
          description: The paywall revision captured by this version.
          type: integer
          example: 3
        created_at:
          description: The date the paywall version was created at in ms since epoch.
          type: integer
          format: int64
          example: 1658399423658
        components_config:
          description: The raw paywall components configuration captured by this version.
          type: object
          nullable: true
          additionalProperties: true
          example:
            base:
              stack:
                id: main_stack
                type: stack
                components: []
        components_localizations:
          description: Localized component values keyed by locale.
          type: object
          nullable: true
          additionalProperties:
            type: object
            additionalProperties: true
          example:
            en_US:
              title: Premium
        default_locale:
          description: The default locale captured by this version.
          type: string
          nullable: true
          example: en_US
        automatically_scale_font_size:
          description: >-
            Whether font sizes should automatically scale for this paywall
            version.
          type: boolean
          example: true
        exit_offers:
          description: Exit offer configuration captured by this version.
          type: object
          nullable: true
          additionalProperties: true
          example:
            dismiss:
              offering_id: ofrng123456789abcdef
        state_declarations:
          description: State declarations captured by this version.
          type: object
          nullable: true
          additionalProperties: true
          example:
            selectedPackage:
              type: string
              default: monthly
        play_store_product_change_mode:
          description: >-
            Play Store product change mode configuration captured by this
            version.
          type: object
          nullable: true
          additionalProperties: true
          example:
            upgrade_replacement_mode: deferred
      additionalProperties: true
    PlayStoreApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - play_store
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - play_store
          example: play_store
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        play_store:
          description: Play Store type details
          type: object
          required:
            - package_name
          nullable: false
          additionalProperties: true
          properties:
            package_name:
              description: The package name of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
            custom_url_scheme:
              description: >-
                The custom URL scheme for the app, derived from the app's public
                ID.
              type: string
              nullable: false
              example: rc-1a2b3c4
      additionalProperties: true
    PlayStoreAppCreate:
      type: object
      required:
        - name
        - type
        - play_store
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - play_store
          nullable: false
        play_store:
          description: >-
            Play Store type details. Should only be used when type is
            play_store.
          type: object
          required:
            - package_name
          nullable: false
          properties:
            package_name:
              description: The package name of the app
              type: string
              minLength: 1
              maxLength: 256
              nullable: false
          additionalProperties: false
      additionalProperties: false
    Product:
      type: object
      required:
        - id
        - store_identifier
        - type
        - state
        - created_at
        - app_id
        - object
        - display_name
      properties:
        state:
          description: Whether the product is active or inactive (archived).
          nullable: false
          type: string
          enum:
            - active
            - inactive
          example: active
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - product
          type: string
        id:
          description: The id of the product
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: prod1a2b3c4d5e
        store_identifier:
          description: The store product identifier
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: rc_1w_199
        type:
          description: The product type
          nullable: false
          $ref: '#/components/schemas/ProductType'
        subscription:
          description: The subscription product object
          nullable: true
          $ref: '#/components/schemas/SubscriptionProduct'
        one_time:
          description: The one time product object
          nullable: true
          $ref: '#/components/schemas/OneTimeProduct'
        created_at:
          description: The date when the product was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        app_id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        app:
          description: The app associated with the product
          nullable: true
          $ref: '#/components/schemas/App'
        indicative_price:
          description: >-
            The product's indicative price in the default currency/country (USD
            / US). Null if no price is available. Only present when expanded.
          nullable: true
          $ref: '#/components/schemas/IndicativePrice'
        display_name:
          description: The display name of the product
          nullable: true
          type: string
          minLength: 1
          maxLength: 1500
          example: Premium Monthly 2023
      additionalProperties: false
    ProductSubscriptionInput:
      type: object
      description: >-
        Subscription parameters for product creation. Only supported for
        simulated store products.
      nullable: true
      required:
        - duration
      properties:
        duration:
          $ref: '#/components/schemas/Duration'
          description: >-
            The duration of the subscription. Only supported for test store
            products.
      additionalProperties: false
    ProductType:
      type: string
      nullable: false
      enum:
        - subscription
        - one_time
        - consumable
        - non_consumable
        - non_renewing_subscription
    ProductsFromEntitlement:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: ProductsFromEntitlementList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/Product'
          type: array
        next_page:
          description: >-
            URL to access the next page of the entitlement's products. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/entitlements/entla1b2c3d4e5/products?starting_after=prod1a2b3c4d5
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/entitlements/entla1b2c3d4e5/products
      additionalProperties: false
    ProductsFromPackage:
      type: object
      required:
        - items
        - next_page
        - object
        - url
      title: ProductsFromPackageList
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value. Always has the value `list`.
          enum:
            - list
          type: string
        items:
          description: Details about each object.
          items:
            $ref: '#/components/schemas/PackageProductAssociation'
          type: array
        next_page:
          description: >-
            URL to access the next page of the entitlement's products. If not
            present / null, there is no next page
          type: string
          nullable: true
          example: >-
            /v2/projects/proj1ab2c3d4/packages/pkge1a2b3c4d5/products?starting_after=prod1a2b3c4d5
        url:
          description: The URL where this list can be accessed.
          maxLength: 5000
          type: string
          example: /v2/projects/proj1ab2c3d4/packages/pkge1a2b3c4d5/products
      additionalProperties: false
    Project:
      type: object
      required:
        - id
        - name
        - created_at
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - project
          type: string
        id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1ab2c3d4
        name:
          description: The name of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 256
          example: MagicWeather
        created_at:
          description: The date when the project was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        icon_url:
          description: The URL of the project's icon (small size)
          nullable: true
          type: string
          example: https://www.appatar.io/abc123/small
        icon_url_large:
          description: The URL of the project's icon (large size)
          nullable: true
          type: string
          example: https://www.appatar.io/abc123/large
      additionalProperties: false
    ProjectCreate:
      allOf:
        - type: object
          required:
            - name
          properties:
            name:
              description: The name of the project
              type: string
              minLength: 1
              maxLength: 255
              nullable: false
          additionalProperties: false
    PublicApiKey:
      type: object
      required:
        - id
        - key
        - app_id
        - created_at
        - environment
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - public_api_key
          type: string
        id:
          description: The ID of the public API key
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: apikey12345
        key:
          description: The value of the public API key
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: goog_1ab2c3d4
        environment:
          description: The environment the public API key is for
          nullable: false
          enum:
            - production
            - sandbox
          type: string
        app_id:
          description: The ID of the app the public API key is for
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        created_at:
          description: The date when the public API key was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
      additionalProperties: false
    Purchase:
      type: object
      required:
        - id
        - customer_id
        - original_customer_id
        - product_id
        - purchased_at
        - revenue_in_usd
        - quantity
        - status
        - presented_offering_id
        - entitlements
        - environment
        - store
        - store_purchase_identifier
        - ownership
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - purchase
          type: string
        id:
          description: The id of the purchase
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: purch1a2b3c4d5e
        customer_id:
          description: The id of the customer
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        original_customer_id:
          description: The ID of the original customer
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        product_id:
          description: The ID of the product that was purchased
          nullable: false
          minLength: 1
          maxLength: 255
          type: string
          example: prod1a2b3c4d5e
        purchased_at:
          description: The date when the purchase was made in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        revenue_in_usd:
          description: The revenue generated by the purchase in USD
          nullable: false
          oneOf:
            - $ref: '#/components/schemas/MonetaryAmount'
        quantity:
          description: The quantity of the product purchased in one transaction
          type: integer
          example: 1
        status:
          description: The status of a purchase
          nullable: false
          type: string
          enum:
            - owned
            - refunded
          example: owned
        presented_offering_id:
          description: The ID of the offering the customer saw when they did the purchase
          nullable: true
          type: string
          minLength: 1
          maxLength: 200
          example: ofrnge1a2b3c4d5
        entitlements:
          required:
            - items
            - next_page
            - object
            - url
          title: EntitlementList
          type: object
          properties:
            object:
              description: >-
                String representing the object's type. Objects of the same type
                share the same value. Always has the value `list`.
              enum:
                - list
              type: string
            items:
              description: Details about each object.
              items:
                $ref: '#/components/schemas/Entitlement'
              type: array
            next_page:
              description: >-
                URL to access the next page of the customer's entitlements. If
                not present / null, there is no next page
              type: string
              nullable: true
              example: >-
                /v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac
            url:
              description: The URL where this list can be accessed.
              maxLength: 5000
              type: string
              example: /v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements
        environment:
          $ref: '#/components/schemas/Environment'
        store:
          description: Store the purchase belongs to
          nullable: false
          type: string
          enum:
            - amazon
            - app_store
            - mac_app_store
            - play_store
            - promotional
            - stripe
            - rc_billing
            - external
            - roku
            - paddle
            - paypal
            - galaxy
            - test_store
          example: amazon
        store_purchase_identifier:
          description: The store purchase identifier
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: 12345678
        ownership:
          description: Ownership of the purchase
          nullable: false
          oneOf:
            - $ref: '#/components/schemas/Ownership'
        country:
          description: Billing country in ISO alpha 2 code
          nullable: true
          $ref: '#/components/schemas/Country'
      additionalProperties: false
    RCBillingApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - rc_billing
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - rc_billing
          example: rc_billing
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        rc_billing:
          description: Revenue Cat Billing Store type details
          type: object
          required:
            - seller_company_name
            - default_currency
          nullable: false
          additionalProperties: true
          properties:
            stripe_account_id:
              description: Stripe account connected to your RevenueCat account.
              type: string
              nullable: true
              minLength: 1
              maxLength: 256
            seller_company_name:
              description: >-
                The company name. This field is deprecated. Please, use
                `app_name` instead.
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
              deprecated: true
            app_name:
              description: Shown in checkout, emails, and receipts sent to customers.
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
            seller_company_support_email:
              description: >-
                The company support email. This field is deprecated. Please, use
                `support_email` instead.
              type: string
              nullable: true
              minLength: 1
              maxLength: 320
              deprecated: true
            support_email:
              description: >-
                Used as the `reply to` address in all emails sent to customers,
                to allow them to receive support.
              type: string
              nullable: true
              minLength: 1
              maxLength: 320
            default_currency:
              description: The default currency to be used for the app.
              $ref: '#/components/schemas/RCBillingCurrency'
      additionalProperties: true
    RCBillingAppCreate:
      type: object
      required:
        - name
        - type
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - rc_billing
          nullable: false
        rc_billing:
          description: Revenue Cat Billing Store type details
          type: object
          required:
            - app_name
          nullable: true
          properties:
            stripe_account_id:
              description: >-
                It needs to be connected to your RevenueCat account. It can be
                omitted if you only have a single Stripe account connected to
                your RevenueCat account.
              type: string
              nullable: true
              minLength: 1
              maxLength: 256
            app_name:
              description: Shown in checkout, emails, and receipts sent to customers.
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
            support_email:
              description: >-
                Used as the `reply to` address in all emails sent to customers,
                to allow them to receive support.  If you leave this field
                blank, your RevenueCat account email address will be used.
              type: string
              nullable: true
              minLength: 1
              maxLength: 320
            default_currency:
              $ref: '#/components/schemas/RCBillingCurrency'
          additionalProperties: false
      additionalProperties: false
    RCBillingCurrency:
      type: string
      description: ISO 4217 currency code
      nullable: false
      example: USD
      enum:
        - USD
        - EUR
        - JPY
        - GBP
        - AUD
        - CAD
        - BRL
        - KRW
        - CNY
        - MXN
        - SEK
        - PLN
        - MYR
        - PHP
        - CHF
        - SAR
        - TWD
        - NOK
        - DKK
        - THB
        - NZD
        - SGD
        - HKD
        - CZK
        - AED
        - CLP
        - COP
        - CRC
        - GEL
        - HUF
        - IDR
        - ILS
        - IQD
        - JOD
        - KES
        - KZT
        - MAD
        - PEN
        - QAR
        - RON
        - RSD
        - TZS
        - VND
        - ZAR
        - TRY
        - UAH
    RevenueMetric:
      type: object
      additionalProperties: false
      required:
        - object
        - start_date
        - end_date
        - currency
        - value
        - revenue_type
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          type: string
          enum:
            - revenue_metric
          example: revenue_metric
        start_date:
          description: Start date of the revenue range, inclusive (ISO 8601 format).
          type: string
          format: date
          nullable: false
          example: '2026-01-01'
        end_date:
          description: End date of the revenue range, inclusive (ISO 8601 format).
          type: string
          format: date
          nullable: false
          example: '2026-01-31'
        currency:
          description: The ISO 4217 currency code that the revenue value is expressed in.
          type: string
          nullable: false
          example: USD
        value:
          description: >-
            Revenue for the date range, expressed in `currency`, for the revenue
            definition selected by the `revenue_type` request parameter.
            Two-decimal precision.
          type: number
          nullable: false
          example: 12345.67
        revenue_type:
          description: >-
            The revenue definition that `value` represents: `revenue` (gross),
            `revenue_net_of_taxes`, or `proceeds` (net of both taxes and store
            commission). Matches the `revenue_type` request parameter.
          type: string
          enum:
            - revenue
            - revenue_net_of_taxes
            - proceeds
          nullable: false
          example: proceeds
    RokuApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - roku
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - roku
          example: roku
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        roku:
          description: Roku Channel Store type details
          type: object
          nullable: false
          additionalProperties: true
          properties:
            roku_channel_id:
              description: Channel ID provided on the Roku Channel page.
              type: string
              nullable: true
              minLength: 6
              maxLength: 6
            roku_channel_name:
              description: Channel name that is displayed on the Roku Channel page.
              type: string
              nullable: true
              minLength: 1
              maxLength: 30
      additionalProperties: true
    RokuAppCreate:
      type: object
      required:
        - name
        - type
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - roku
          nullable: false
        roku:
          description: Roku Channel Store details. Should only be used when type is roku.
          type: object
          nullable: true
          properties:
            roku_api_key:
              description: Roku Pay API key provided on the Roku Pay Web Services page.
              type: string
              nullable: true
              minLength: 33
              maxLength: 33
            roku_channel_id:
              description: Channel ID provided on the Roku Channel page.
              type: string
              nullable: true
              minLength: 6
              maxLength: 6
            roku_channel_name:
              description: Channel name that is displayed on the Roku Channel page.
              type: string
              nullable: true
              minLength: 1
              maxLength: 30
          additionalProperties: false
      additionalProperties: false
    StoreKitConfigFile:
      type: object
      description: Contents of a generated StoreKit config file for an app
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - store_kit_config_file
          type: string
        contents:
          type: object
          description: Contents of the StoreKit config file
          additionalProperties: true
      required:
        - object
        - contents
      additionalProperties: false
    StoreProduct:
      type: object
      required:
        - id
        - product_identifier
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - store_product
          type: string
        id:
          description: >-
            The unique identifier of the product in the store (e.g., App Store
            Connect product ID)
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: 1234567890
        name:
          description: The name of the store product
          nullable: true
          type: string
          minLength: 1
          maxLength: 255
          example: Premium Monthly Subscription
        product_identifier:
          description: The product identifier used in the store
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: com.example.premium_monthly
      additionalProperties: false
    StripeApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
        - stripe
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - stripe
          example: stripe
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
        stripe:
          description: Stripe type details
          type: object
          nullable: false
          additionalProperties: true
          properties:
            stripe_account_id:
              description: Stripe account connected to your RevenueCat account.
              type: string
              nullable: true
              minLength: 1
              maxLength: 256
      additionalProperties: true
    StripeAppCreate:
      type: object
      required:
        - name
        - type
      properties:
        name:
          description: The name of the app
          type: string
          minLength: 1
          maxLength: 255
          nullable: false
        type:
          description: >
            The platform of the app.

            Mac App Store is disabled by default. See [Legacy Mac
            Apps](https://www.revenuecat.com/docs/legacy-mac-apps) for more
            details.
          type: string
          enum:
            - stripe
          nullable: false
        stripe:
          description: Stripe type details. Should only be used when type is stripe.
          type: object
          nullable: false
          properties:
            stripe_account_id:
              description: >-
                It needs to be connected to your RevenueCat account. It can be
                omitted if you only have a single Stripe account connected to
                your RevenueCat account.
              type: string
              minLength: 1
              maxLength: 256
              nullable: true
          additionalProperties: false
      additionalProperties: false
    Subscription:
      type: object
      required:
        - id
        - customer_id
        - original_customer_id
        - product_id
        - starts_at
        - current_period_starts_at
        - current_period_ends_at
        - ends_at
        - gives_access
        - pending_payment
        - auto_renewal_status
        - status
        - total_revenue_in_usd
        - presented_offering_id
        - entitlements
        - environment
        - store
        - store_subscription_identifier
        - ownership
        - management_url
        - object
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - subscription
          type: string
        id:
          description: The ID of the subscription (generated by RevenueCat)
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: sub1ab2c3d4e5
        customer_id:
          description: The ID of the customer
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        original_customer_id:
          description: >-
            The ID of the original customer. Relevant for subscriptions that
            were transferred from one customer to another
          nullable: false
          type: string
          minLength: 1
          maxLength: 1500
          example: 19b8de26-77c1-49f1-aa18-019a391603e2
        product_id:
          description: >-
            The RevenueCat ID of the product that the customer is subscribed to.
            Exists for all store types except for promotional.
          nullable: true
          minLength: 1
          maxLength: 255
          type: string
          example: prod1a2b3c4d5e
        starts_at:
          description: The date when the subscription originally started in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        current_period_starts_at:
          description: >-
            The date when the subscription billing period started in ms since
            epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        current_period_ends_at:
          description: >-
            The date when the subscription billing period is expected to end in
            ms since epoch. Can be null if the subscription is paused until an
            indefinite date.
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        ends_at:
          description: >-
            The date when the latest subscription billing period is expected to
            end in ms since epoch. It will only be different from
            `current_period_ends_at` if `auto_renewal_status` is
            `has_already_renewed`, in which case it indicates the end of the
            next billing period. Can be null if the subscription is paused until
            an indefinite date.
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        gives_access:
          description: >-
            Determines whether the customer should currently be provided access
            to the entitlements associated with the subscription
          nullable: false
          type: boolean
          example: true
        pending_payment:
          description: >-
            Determines whether there is a pending payment associated with the
            subscription
          nullable: false
          type: boolean
          example: true
        auto_renewal_status:
          description: >
            The auto renewal status of a subscription.<br><br>Possible
            values:<br>• `will_renew`: the subscription is currently set to
            automatically renew<br>• `will_not_renew`: the subscription is
            currently set to expire at the end of the period<br>•
            `will_change_product`: the subscription is currently set to change
            product at the end of the period (which might start a new
            subscription)<br>• `will_pause`: the subscription is currently set
            to pause at the end of the current period<br>•
            `requires_price_increase_consent`: the subscription will expire at
            the end of the current period unless the customer consents to the
            price increase<br>• `has_already_renewed`: the customer has already
            been charged for the upcoming renewal (so the renewal will take
            place even if the customer opts out of auto-renewal before the end
            of the period)
          nullable: false
          type: string
          enum:
            - will_renew
            - will_not_renew
            - will_change_product
            - will_pause
            - requires_price_increase_consent
            - has_already_renewed
          example: will_renew
        status:
          description: >
            The status of a subscription. Please note that additional states
            might be added in the future. To determine whether or not a
            subscription currently provides access to any associated
            entitlements, use the _gives_access_ field.<br><br>Possible
            values:<br>• `trialing`: the subscription is in a free trial
            period<br>• `active`: the subscription is active, in a paid
            period<br>• `expired`: the subscription is expired and no longer
            active<br>• `in_grace_period`: the subscription is past its regular
            expiry date and experienced a billing issue, but is currently still
            in an access-granting grace period<br>• `in_billing_retry`: the
            subscription has experienced a billing issue. Billing is being
            retried, access is suspended.-paused: the subscription is currently
            paused and should not provide access.<br>• `unknown`: the
            subscription is in an unknown state. Refer to the _gives_access_
            field to determine whether or not to grant access.<br>•
            `incomplete`: the subscription is in an incomplete state, maybe due
            to incorrect billing details or because it's scheduled to start in
            the future.
          nullable: false
          type: string
          enum:
            - trialing
            - active
            - expired
            - in_grace_period
            - in_billing_retry
            - paused
            - unknown
            - incomplete
          example: trialing
        total_revenue_in_usd:
          description: Total revenue generated by a subscription in USD
          nullable: false
          oneOf:
            - $ref: '#/components/schemas/MonetaryAmount'
        presented_offering_id:
          description: >-
            The ID of the offering the customer saw when purchasing the
            subscription
          nullable: true
          type: string
          minLength: 1
          maxLength: 200
          example: ofrnge1a2b3c4d5
        entitlements:
          required:
            - items
            - next_page
            - object
            - url
          title: EntitlementList
          type: object
          properties:
            object:
              description: >-
                String representing the object's type. Objects of the same type
                share the same value. Always has the value `list`.
              enum:
                - list
              type: string
            items:
              description: Details about each object.
              items:
                $ref: '#/components/schemas/Entitlement'
              type: array
            next_page:
              description: >-
                URL to access the next page of the customer's entitlements. If
                not present / null, there is no next page
              type: string
              nullable: true
              example: >-
                /v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac
            url:
              description: The URL where this list can be accessed.
              maxLength: 5000
              type: string
              example: >-
                /v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements
        environment:
          description: The store environment
          nullable: false
          oneOf:
            - $ref: '#/components/schemas/Environment'
        store:
          description: Store the subscription belongs to
          nullable: false
          type: string
          enum:
            - amazon
            - app_store
            - mac_app_store
            - play_store
            - promotional
            - stripe
            - rc_billing
            - external
            - roku
            - paddle
            - paypal
            - galaxy
            - test_store
          example: amazon
        store_subscription_identifier:
          description: >-
            The subscription identifier as per the store (e.g, for Apple App
            Store, the `transaction_id` of the latest transaction of the
            subscription, or for Google Play Store, the Order ID of the last
            renewal of the subscription)
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: 12345678
        ownership:
          description: Ownership of the subscription
          nullable: false
          oneOf:
            - $ref: '#/components/schemas/Ownership'
        pending_changes:
          description: >-
            Expected changes to the subscription that will occur at the end of
            the current period. Present when the subscription has a pending
            product change, has already renewed for the next period, or has a
            failed upcoming renewal. Only fields that differ from the current
            subscription state are included.
          nullable: true
          type: object
          additionalProperties: true
          properties:
            product:
              description: The product that will be active as of the next renewal
              nullable: true
              allOf:
                - $ref: '#/components/schemas/Product'
            current_period_starts_at:
              description: >-
                Expected start of the next billing period in ms since epoch.
                Omitted when unchanged from the current subscription.
              nullable: true
              type: integer
              format: int64
              example: 1658399423658
            current_period_ends_at:
              description: >-
                Expected end of the next billing period in ms since epoch.
                Omitted when unchanged from the current subscription.
              nullable: true
              type: integer
              format: int64
              example: 1660991423658
            store_subscription_identifier:
              description: >-
                Expected store subscription identifier for the next period.
                Omitted when unchanged from the current subscription.
              nullable: true
              type: string
              minLength: 1
              maxLength: 255
              example: 12345679
            auto_renewal_status:
              description: >-
                Expected auto renewal status for the next period. Omitted when
                unchanged from the current subscription.
              nullable: true
              type: string
              enum:
                - will_renew
                - will_not_renew
                - will_change_product
                - will_pause
                - requires_price_increase_consent
                - has_already_renewed
              example: will_renew
            status:
              description: >-
                Expected subscription status for the next period. Omitted when
                unchanged from the current subscription.
              nullable: true
              type: string
              enum:
                - trialing
                - active
                - expired
                - in_grace_period
                - in_billing_retry
                - paused
                - unknown
                - incomplete
              example: active
            pending_payment:
              description: >-
                Expected pending payment flag for the next period. Omitted when
                unchanged from the current subscription.
              nullable: true
              type: boolean
              example: false
            gives_access:
              description: >-
                Expected access flag for the next period. Omitted when unchanged
                from the current subscription.
              nullable: true
              type: boolean
              example: true
        country:
          $ref: '#/components/schemas/Country'
          description: Billing country in ISO alpha 2 code
          nullable: true
        management_url:
          description: The URL to manage the subscription
          nullable: true
          type: string
          example: https://apps.apple.com/account/subscriptions
      additionalProperties: false
    SubscriptionProduct:
      type: object
      required:
        - duration
        - grace_period_duration
        - trial_duration
      nullable: true
      properties:
        duration:
          type: string
          pattern: >-
            ^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$
          nullable: true
          description: The duration of the subscription in ISO-8601 standard
          example: P1M
        grace_period_duration:
          type: string
          pattern: >-
            ^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$
          nullable: true
          description: The duration of the subscription's grace period in ISO-8601 standard
          example: P3D
        trial_duration:
          type: string
          pattern: >-
            ^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$
          nullable: true
          description: The duration of the subscription's trial period in ISO-8601 standard
          example: P1W
      additionalProperties: true
    SubscriptionTransaction:
      type: object
      required:
        - id
        - purchased_at
        - product_store_identifier
        - object
      additionalProperties: false
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - subscription_transaction
          type: string
        id:
          description: The ID of the subscription transaction in the store
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: GPA.0000-0000-0000-00000
        purchased_at:
          description: The date of the transaction in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        product_store_identifier:
          description: The store identifier of the purchased product
          nullable: false
          type: string
          minLength: 1
          maxLength: 511
          example: com.example.product
        revenue_in_local_currency:
          description: >-
            The revenue generated by the transaction in the customer's purchased
            currency
          nullable: true
          oneOf:
            - $ref: '#/components/schemas/MonetaryAmount'
        revenue_in_usd:
          description: The revenue generated by the transaction in USD
          nullable: true
          oneOf:
            - $ref: '#/components/schemas/MonetaryAmount'
        expiration_date:
          description: The expiration date of the transaction in ms since epoch
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
        effective_expiration_date:
          description: >-
            The effective expiration date of the transaction in ms since epoch,
            including potential grace period
          nullable: true
          type: integer
          format: int64
          example: 1658399423658
    TestStoreApp:
      type: object
      required:
        - object
        - id
        - name
        - type
        - created_at
        - project_id
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - app
          type: string
        id:
          description: The id of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: app1a2b3c4
        name:
          description: The name of the app
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
        created_at:
          description: The date when the app was created in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        type:
          description: The platform of the app
          nullable: false
          type: string
          enum:
            - test_store
          example: test_store
        project_id:
          description: The id of the project
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: proj1a2b3c4
      additionalProperties: true
    Transfer:
      type: object
      title: TransferResult
      required:
        - source_customer
        - target_customer
      properties:
        source_customer:
          description: The original customer before the transfer
          $ref: '#/components/schemas/Customer'
        target_customer:
          description: The target customer after the transfer
          $ref: '#/components/schemas/Customer'
      additionalProperties: true
    UpdateWebhookIntegrationInput:
      type: object
      properties:
        name:
          description: The display name of the webhook integration
          type: string
          minLength: 1
          maxLength: 1500
          example: Customer updates webhook
        url:
          description: The URL RevenueCat will send webhook notifications to
          type: string
          format: uri
          maxLength: 5000
          example: https://hooks.example.com/revenuecat
        authorization_header:
          description: >-
            Optional authorization header that will be sent with webhook
            notifications
          type: string
          nullable: true
          maxLength: 5000
          example: Bearer 123456
        environment:
          description: The environment the webhook integration is configured for
          type: string
          nullable: true
          enum:
            - production
            - sandbox
            - null
        event_types:
          description: Event types that will trigger the webhook
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/WebhookEventType'
        app_id:
          description: The ID of the app the webhook integration is scoped to
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          example: app_1234567890abcdef
      additionalProperties: false
    VirtualCurrency:
      type: object
      required:
        - project_id
        - code
        - name
        - state
        - created_at
        - object
      properties:
        state:
          description: Whether the virtual currency is active or inactive (archived).
          nullable: false
          type: string
          enum:
            - active
            - inactive
          example: active
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - virtual_currency
          type: string
        project_id:
          description: ID of the project to which the virtual currency belongs
          nullable: false
          minLength: 1
          maxLength: 20
          type: string
          example: proj1ab2c3d4
        code:
          description: The unique code for this virtual currency
          nullable: false
          type: string
          minLength: 1
          maxLength: 10
          pattern: ^[a-zA-Z0-9_]+$
          example: GLD
        name:
          description: The display name of the virtual currency
          nullable: false
          type: string
          minLength: 1
          maxLength: 50
          example: Gold
        created_at:
          description: The date the virtual currency was created at in ms since epoch
          nullable: false
          type: integer
          format: int64
          example: 1658399423658
        description:
          description: Description of the virtual currency
          nullable: true
          type: string
          minLength: 1
          maxLength: 1500
          example: Gold currency used in the game
        product_grants:
          description: The grants that define how products grant this virtual currency
          nullable: true
          type: array
          items:
            $ref: '#/components/schemas/VirtualCurrencyProductGrant'
      additionalProperties: false
    VirtualCurrencyBalance:
      type: object
      title: VirtualCurrencyBalance
      required:
        - object
        - currency_code
        - balance
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - virtual_currency_balance
          type: string
        currency_code:
          description: The code of the virtual currency.
          type: string
        balance:
          description: The balance of the virtual currency.
          type: integer
        description:
          description: The description of the virtual currency.
          type: string
        name:
          description: The name of the virtual currency.
          type: string
      additionalProperties: false
    VirtualCurrencyProductGrant:
      type: object
      required:
        - object
        - product_ids
        - amount
        - trial_amount
        - expire_at_cycle_end
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the same value.
          enum:
            - virtual_currency.product_grant
          type: string
        product_ids:
          description: The list of product IDs that grant this virtual currency
          type: array
          minItems: 1
          items:
            type: string
            minLength: 1
            maxLength: 255
            example: prode1a2b3c4d5
        amount:
          description: The amount of virtual currency granted
          type: integer
          minimum: 1
          example: 100
        trial_amount:
          description: The amount of virtual currency granted during trial period
          nullable: false
          type: integer
          minimum: 0
          example: 0
        expire_at_cycle_end:
          description: Whether the grant expires at the end of the subscription cycle
          nullable: false
          type: boolean
          example: false
      additionalProperties: false
    VirtualCurrencyProductGrantInput:
      type: object
      required:
        - product_ids
        - amount
      properties:
        product_ids:
          description: The list of product IDs that grant this virtual currency
          type: array
          minItems: 1
          items:
            type: string
            minLength: 1
            maxLength: 255
            example: prode1a2b3c4d5
        amount:
          description: The amount of virtual currency granted
          type: integer
          minimum: 1
          example: 100
        trial_amount:
          description: The amount of virtual currency granted during trial period
          nullable: true
          type: integer
          minimum: 0
          example: 0
        expire_at_cycle_end:
          description: Whether the grant expires at the end of the subscription cycle
          nullable: true
          type: boolean
          example: false
      additionalProperties: false
    WebhookEventType:
      type: string
      description: The type of event that triggers the webhook
      example: initial_purchase
      enum:
        - initial_purchase
        - renewal
        - product_change
        - cancellation
        - billing_issue
        - non_renewing_purchase
        - uncancellation
        - transfer
        - subscription_paused
        - expiration
        - subscription_extended
        - invoice_issuance
        - temporary_entitlement_grant
        - refund_reversed
        - virtual_currency_transaction
    WebhookIntegration:
      type: object
      required:
        - id
        - name
        - url
        - project_id
        - object
        - created_at
        - app_id
        - environment
      properties:
        object:
          description: >-
            String representing the object's type. Objects of the same type
            share the

            same value.
          enum:
            - webhook_integration
          type: string
        id:
          description: The ID of the webhook integration
          type: string
          minLength: 1
          maxLength: 255
          example: wh_1234567890abcdef
        project_id:
          description: The ID of the project the webhook integration belongs to
          type: string
          minLength: 1
          maxLength: 255
          example: proj_1234567890abcdef
        name:
          description: The display name of the webhook integration
          type: string
          minLength: 1
          maxLength: 1500
          example: Customer updates webhook
        url:
          description: The URL RevenueCat will send webhook notifications to
          type: string
          format: uri
          maxLength: 5000
          example: https://hooks.example.com/revenuecat
        environment:
          description: >-
            The environment the webhook integration is configured for. Only
            events for the selected environment will be sent.
          type: string
          nullable: true
          enum:
            - production
            - sandbox
            - null
        event_types:
          description: >-
            Event types that will trigger the webhook. Only events for the
            selected event types will be sent.
          type: array
          nullable: true
          items:
            type: string
            description: >-
              The event type. Known values include: initial_purchase, renewal,
              product_change, cancellation, billing_issue,
              non_renewing_purchase, uncancellation, transfer,
              subscription_paused, expiration, subscription_extended,
              invoice_issuance, temporary_entitlement_grant, refund_reversed,
              virtual_currency_transaction. New event types may be added in the
              future.
            example: initial_purchase
        app_id:
          description: >-
            The ID of the app the webhook integration is scoped to. If not
            provided, the webhook integration will be scoped to all apps in the
            project.
          type: string
          nullable: true
          minLength: 1
          maxLength: 255
          example: app_1234567890abcdef
        signing_secret:
          description: >-
            The plaintext HMAC signing secret. Only returned in the response to
            a rotate request.
          type: string
          example: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
        created_at:
          description: >-
            The timestamp in ms since epoch when the webhook integration was
            created
          type: integer
          format: int64
          example: 1658399423658
      additionalProperties: false
  headers:
    RateLimitCurrentLimit:
      required: true
      description: The rate limit for this endpoint, expressed in requests per minute.
      schema:
        type: integer
      example: 30
    RateLimitCurrentUsage:
      required: true
      description: >-
        The current number of requests used for the current limit (including the
        current request).
      schema:
        type: integer
      example: 25
    RateLimitRetryAfter:
      required: true
      description: >-
        The number of seconds to wait before retrying a rate limited
        request.Only present when a request is rate limited.
      schema:
        type: integer
      example: 10
  responses:
    BadGateway:
      description: Bad gateway
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - server_error
            example:
              object: error
              type: server_error
              message: Upstream service returned an invalid response
              retryable: true
              doc_url: https://errors.rev.cat/server-error
              backoff_ms: 1000
    BadRequest:
      description: Bad request
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - parameter_error
                      - invalid_request
          examples:
            parameter_error:
              value:
                object: error
                type: parameter_error
                param: customer_id
                message: id is too long
                retryable: false
                doc_url: https://errors.rev.cat/parameter-error
            invalid_request:
              value:
                object: error
                type: invalid_request
                message: Content-Type not application/json
                retryable: false
                doc_url: https://errors.rev.cat/invalid-request
    Conflict:
      description: Conflict
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - resource_already_exists
                      - idempotency_error
                      - invalid_request
          examples:
            resource_already_exists:
              value:
                object: error
                type: resource_already_exists
                message: Name is already taken
                retryable: false
                doc_url: https://errors.rev.cat/resource-already-exists
            idempotency_error:
              value:
                object: error
                type: idempotency_error
                message: Idempotency key already used for a different request
                retryable: false
                doc_url: https://errors.rev.cat/idempotency-error
            invalid_request:
              value:
                object: error
                type: invalid_request
                message: Request conflicts with the current resource state
                retryable: false
                doc_url: https://errors.rev.cat/invalid-request
    Forbidden:
      description: Access denied
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - authorization_error
            example:
              object: error
              type: authorization_error
              message: You're not authorized to access this resource
              retryable: false
              doc_url: https://errors.rev.cat/authorization-error
    InternalError:
      description: Internal server error
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - server_error
            example:
              object: error
              type: server_error
              message: There was an internal server error
              retryable: true
              doc_url: https://errors.rev.cat/server-error
              backoff_ms: 1000
    Locked:
      description: Locked
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - resource_locked_error
            example:
              object: error
              type: resource_locked_error
              message: The resource is currently being modified by a concurrent request
              retryable: true
              doc_url: https://errors.rev.cat/resource-locked-error
              backoff_ms: 1000
    NotFound:
      description: Not found
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - resource_missing
            example:
              object: error
              type: resource_missing
              message: Resource not found
              retryable: false
              doc_url: https://errors.rev.cat/resource-missing
    RateLimited:
      description: >-
        The request could not be completed because the rate limiting domain for
        this endpoint is currently at its limit for this project.
      headers:
        RevenueCat-Rate-Limit-Current-Usage:
          $ref: '#/components/headers/RateLimitCurrentUsage'
        RevenueCat-Rate-Limit-Current-Limit:
          $ref: '#/components/headers/RateLimitCurrentLimit'
        Retry-After:
          $ref: '#/components/headers/RateLimitRetryAfter'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - rate_limit_error
            example:
              object: error
              type: rate_limit_error
              message: Rate limit exceeded
              retryable: true
              doc_url: https://errors.rev.cat/rate-limit-error
              backoff_ms: 1000
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - authentication_error
            example:
              object: error
              type: authentication_error
              message: Invalid API key
              retryable: false
              doc_url: https://errors.rev.cat/authentication-error
    UnprocessableEntity:
      description: Unprocessable entity
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/Error'
              - type: object
                properties:
                  type:
                    type: string
                    enum:
                      - unprocessable_entity_error
                      - parameter_error
                      - store_error
                      - entity_references_archived_entities
          examples:
            unprocessable_entity:
              value:
                object: error
                type: unprocessable_entity_error
                message: Cannot delete a product that has purchases
                retryable: false
                doc_url: https://errors.rev.cat/unprocessable-entity-error
            parameter_error:
              value:
                object: error
                type: parameter_error
                message: Date must in the future
                retryable: false
                doc_url: https://errors.rev.cat/parameter-error
            store_error:
              value:
                object: error
                type: store_error
                message: There was a problem on the App Store
                retryable: true
                doc_url: https://errors.rev.cat/store-error
                backoff_ms: 1000
            entity_references_archived_entities:
              value:
                object: error
                type: entity_references_archived_entities
                message: >-
                  This offering references inactive products. You will need to
                  make the products active first before making the offering
                  active.
                retryable: false
                doc_url: https://errors.rev.cat/entity-references-archived-entities
                referenced_object_ids:
                  - prodabcd1234
                  - prodwxyz5678
security:
  - BearerAuth: []
servers:
  - url: https://api.revenuecat.com/v2
x-tagGroups:
  - name: General
    tags:
      - Overview (v2)
      - Pagination
      - Rate Limit
      - Expandables
      - Error Handling
      - Representation of Subscriptions
  - name: Model Reference
    tags:
      - Subscription Data Model
  - name: Endpoint Reference
    tags:
      - App
      - Audit Log
      - Charts & Metrics
      - Collaborator
      - Customer
      - Entitlement
      - Offering
      - Package
      - Product
      - Virtual Currency
      - Purchase
      - Subscription
      - Invoice
      - Paywall
      - Integration
      - Project
openapi: 3.0.3
