developer-api

Developer API

v2.0.0Base: https://api.revenuecat.com/v2Auth: bearer
Chat with this API

Use this API

Web

Chat in the browser →

CLI (one command)

agentbridge chat developer-api

SDK / Agents

fetch("/api/developer-api/manifest")

MCP (Claude Desktop / Cursor / Windsurf)

{
  "mcpServers": {
    "developer-api": {
      "command": "npx",
      "args": ["@agentbridgeai/mcp", "--api", "developer-api"]
    }
  }
}

Add to ~/.claude/claude_desktop_config.json or Cursor/Windsurf MCP settings.

Actions (94)

GET/projects/{project_id}/paywalls

list-paywalls

Get a list of paywalls

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `items.offering` (requires `project_configuration:offerings:read` permission).
POST/projects/{project_id}/paywalls

create-paywall

Create a paywall

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredThe ID of the offering the paywall will be created for.
GET/projects/{project_id}/paywalls/{paywall_id}

get-paywall

Get a paywall

Parameters

project_idstringrequiredID of the project
paywall_idstringrequiredID of the paywall
expandarraySpecifies 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).
DELETE/projects/{project_id}/paywalls/{paywall_id}

delete-paywall

Delete a paywall

Parameters

project_idstringrequiredID of the project
paywall_idstringrequiredID of the paywall
GET/projects/{project_id}/apps/{app_id}/public_api_keys

list-app-public-api-keys

Get a list of the public API keys of an app

Parameters

project_idstringrequiredID of the project
app_idstringrequiredID of the app
GET/projects

list-projects

Get a list of projects

Parameters

starting_afterstringstarting_after
limitintegerlimit
POST/projects

create-project

Creates a new project

Parameters

bodyobjectrequiredRequest body
GET/projects/{project_id}/apps

list-apps

Get a list of apps

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/apps

create-app

Create an App

Parameters

project_idstringrequiredID of the project
bodyobjectrequiredRequest body
GET/projects/{project_id}/apps/{app_id}

get-app

Get an app

Parameters

project_idstringrequiredID of the project
app_idstringrequiredID of the app
POST/projects/{project_id}/apps/{app_id}

update-app

Update an app

Parameters

project_idstringrequiredID of the project
app_idstringrequiredID of the app
namestringThe name of the app
amazonobjectAmazon type details. Should only be used when type is amazon.
app_storeobjectApp Store type details. Should only be used when type is app_store.
mac_app_storeobjectLegacy Mac App Store type details. Should only be used when type is mac_app_store.
play_storeobjectPlay Store type details. Should only be used when type is play_store.
stripeobjectStripe type details. Should only be used when type is stripe.
rc_billingobjectWeb Billing type details. Should only be used when type is rc_billing.
rokuobjectRoku Channel Store type details. Should only be used when type is roku.
paddleobjectPaddle Billing type details. Should only be used when type is paddle.
DELETE/projects/{project_id}/apps/{app_id}

delete-app

Delete an app

Parameters

project_idstringrequiredID of the project
app_idstringrequiredID of the app
GET/projects/{project_id}/apps/{app_id}/store_kit_config

get-app-storekit-config

Get the StoreKit configuration for an app

Parameters

project_idstringrequiredID of the project
app_idstringrequiredID of the app
GET/projects/{project_id}/audit_logs

list-audit-logs

List audit logs

Parameters

project_idstringrequiredID of the project
starting_afterstringCursor for pagination. Returns audit logs after the specified audit log ID, using descending order by audit log ID.
start_datestringStart date for the data range (ISO 8601 format)
end_datestringEnd date for the data range (ISO 8601 format)
limitintegerlimit
GET/projects/{project_id}/collaborators

list-collaborators

Get a list of collaborators

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/customers

list-customers

Get a list of customers

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
searchstringSearch term. Currently, only searching by email is supported (searching for exact matches in the $email attribute).
POST/projects/{project_id}/customers

create-customer

Create a customer

Parameters

project_idstringrequiredID of the project
idstringrequiredThe ID of the customer
attributesarrayattributes
GET/projects/{project_id}/customers/{customer_id}

get-customer

Get a customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `attributes` (requires `customer_information:customers:read` permission).
DELETE/projects/{project_id}/customers/{customer_id}

delete-customer

Delete a customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
POST/projects/{project_id}/customers/{customer_id}/actions/transfer

transfer-customer-data

Transfer customer's subscriptions and one-time purchases to another customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
target_customer_idstringrequiredThe ID of the customer to whom the subscriptions and one-time purchases will be transferred.
app_idsarrayOptional. The IDs of the apps to filter the transfer by. When specified, only purchases and subscriptions associated with these apps will be transferred.
POST/projects/{project_id}/customers/{customer_id}/actions/grant_entitlement

grant-customer-entitlement

Grant an entitlement to a customer unless one already exists. As a side effect, a promotional subscription is created.

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
entitlement_idstringrequiredThe ID of the entitlement to grant to the customer.
expires_atintegerrequiredThe date after which the access to the entitlement expires in ms since epoch.
POST/projects/{project_id}/customers/{customer_id}/actions/revoke_granted_entitlement

revoke-customer-granted-entitlement

Revoke a granted entitlement from a customer. As a side effect, the promotional subscription associated with the granted entitlement is expired.

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
entitlement_idstringrequiredThe ID of the granted entitlement to revoke from the customer.
POST/projects/{project_id}/customers/{customer_id}/actions/assign_offering

assign-customer-offering

Assign or clear an offering override for a customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
offering_idstringrequiredThe ID of the offering to assign to the customer. Set to null to clear any existing override.
GET/projects/{project_id}/integrations/webhooks

list-webhook-integrations

List webhook integrations

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/integrations/webhooks

create-webhook-integration

Create a webhook integration

Parameters

project_idstringrequiredID of the project
namestringrequiredThe display name of the webhook integration
urlstringrequiredThe URL RevenueCat will send webhook notifications to
authorization_headerstringOptional authorization header that will be sent with webhook notifications
environmentstringThe environment the webhook integration is configured for
event_typesarrayEvent types that will trigger the webhook
app_idstringThe ID of the app the webhook integration is scoped to
GET/projects/{project_id}/integrations/webhooks/{webhook_integration_id}

get-webhook-integration

Get a webhook integration

Parameters

project_idstringrequiredID of the project
webhook_integration_idstringrequiredThe ID of the webhook integration
POST/projects/{project_id}/integrations/webhooks/{webhook_integration_id}

update-webhook-integration

Update a webhook integration

Parameters

project_idstringrequiredID of the project
webhook_integration_idstringrequiredThe ID of the webhook integration
namestringThe display name of the webhook integration
urlstringThe URL RevenueCat will send webhook notifications to
authorization_headerstringOptional authorization header that will be sent with webhook notifications
environmentstringThe environment the webhook integration is configured for
event_typesarrayEvent types that will trigger the webhook
app_idstringThe ID of the app the webhook integration is scoped to
DELETE/projects/{project_id}/integrations/webhooks/{webhook_integration_id}

delete-webhook-integration

Delete a webhook integration

Parameters

project_idstringrequiredID of the project
webhook_integration_idstringrequiredThe ID of the webhook integration
GET/projects/{project_id}/products/{product_id}

get-product

Get a product

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `app` (requires `project_configuration:apps:read` permission).
POST/projects/{project_id}/products/{product_id}

update-product

Update a product

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
expandarraySpecifies which fields in the response should be expanded.
display_namestringThe display name of the product
DELETE/projects/{project_id}/products/{product_id}

delete-product

Delete a product

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
POST/projects/{project_id}/products/{product_id}/actions/archive

archive-product

Archive a product

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
POST/projects/{project_id}/products/{product_id}/actions/unarchive

unarchive-product

Unarchive a product

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
POST/projects/{project_id}/products/{product_id}/create_in_store

create-product-in-store

Push a product to the store

Parameters

project_idstringrequiredID of the project
product_idstringrequiredID of the product
store_informationstringStore-specific information for creating the product in the store
GET/projects/{project_id}/products

list-products

Get a list of products

Parameters

project_idstringrequiredID of the project
app_idstringThis is an optional query parameter to get a list of products of a given entitlement associated with a particular app
starting_afterstringstarting_after
limitintegerlimit
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `items.app` (requires `project_configuration:apps:read` permission).
POST/projects/{project_id}/products

create-product

Create a product

Parameters

project_idstringrequiredID of the project
store_identifierstringrequiredThe 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.
app_idstringrequiredThe ID of the app
typestringrequiredThe product type
display_namestringThe display name of the product
subscriptionstringSubscription parameters. Only supported for test store products.
titlestringThe user-facing title of the product. This field is required for Test Store products.
GET/projects/{project_id}/virtual_currencies

list-virtual-currencies

Get a list of virtual currencies

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/virtual_currencies

create-virtual-currency

Create a virtual currency

Parameters

project_idstringrequiredID of the project
codestringrequiredThe unique code for this virtual currency
namestringrequiredThe display name of the virtual currency
descriptionstringDescription of the virtual currency
product_grantsarrayProduct grants that define how products grant this virtual currency
GET/projects/{project_id}/virtual_currencies/{virtual_currency_code}

get-virtual-currency

Get a virtual currency

Parameters

project_idstringrequiredID of the project
virtual_currency_codestringrequiredThe virtual currency code
POST/projects/{project_id}/virtual_currencies/{virtual_currency_code}

update-virtual-currency

Update a virtual currency

Parameters

project_idstringrequiredID of the project
virtual_currency_codestringrequiredThe virtual currency code
namestringThe display name of the virtual currency
descriptionstringDescription of the virtual currency
product_grantsarrayProduct grants that define how products grant this virtual currency
DELETE/projects/{project_id}/virtual_currencies/{virtual_currency_code}

delete-virtual-currency

Delete a virtual currency

Parameters

project_idstringrequiredID of the project
virtual_currency_codestringrequiredThe virtual currency code
POST/projects/{project_id}/virtual_currencies/{virtual_currency_code}/actions/archive

archive-virtual-currency

Archive a virtual currency

Parameters

project_idstringrequiredID of the project
virtual_currency_codestringrequiredThe virtual currency code
POST/projects/{project_id}/virtual_currencies/{virtual_currency_code}/actions/unarchive

unarchive-virtual-currency

Unarchive a virtual currency

Parameters

project_idstringrequiredID of the project
virtual_currency_codestringrequiredThe virtual currency code
GET/projects/{project_id}/entitlements/{entitlement_id}

get-entitlement

Get an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `product` (requires `project_configuration:products:read` permission).
POST/projects/{project_id}/entitlements/{entitlement_id}

update-entitlement

Update an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
display_namestringrequiredThe display name of the entitlement
DELETE/projects/{project_id}/entitlements/{entitlement_id}

delete-entitlement

Delete an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
GET/projects/{project_id}/entitlements

list-entitlements

Get a list of entitlements

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `items.product` (requires `project_configuration:products:read` permission).
POST/projects/{project_id}/entitlements

create-entitlement

Create an entitlement

Parameters

project_idstringrequiredID of the project
lookup_keystringrequiredThe identifier of the entitlement
display_namestringrequiredThe display name of the entitlement
GET/projects/{project_id}/entitlements/{entitlement_id}/products

get-products-from-entitlement

Get a list of products attached to a given entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/entitlements/{entitlement_id}/actions/archive

archive-entitlement

Archive an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
POST/projects/{project_id}/entitlements/{entitlement_id}/actions/unarchive

unarchive-entitlement

Unarchive an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
POST/projects/{project_id}/entitlements/{entitlement_id}/actions/attach_products

attach-products-to-entitlement

Attach a set of products to an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
product_idsarrayrequiredIDs of the products to be attached to the entitlement.
POST/projects/{project_id}/entitlements/{entitlement_id}/actions/detach_products

detach-products-from-entitlement

Detach a set of product from an entitlement

Parameters

project_idstringrequiredID of the project
entitlement_idstringrequiredID of the entitlement
product_idsarrayrequiredIDs of the products to be detached from the entitlement.
GET/projects/{project_id}/offerings/{offering_id}

get-offering

Get an offering

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
expandarraySpecifies 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).
POST/projects/{project_id}/offerings/{offering_id}

update-offering

Update an offering

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
display_namestringThe display name of the offering
is_currentbooleanIndicates if the offering is the current offering
metadatastringCustom metadata of the offering
DELETE/projects/{project_id}/offerings/{offering_id}

delete-offering

Delete an offering and its attached packages

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
POST/projects/{project_id}/offerings/{offering_id}/actions/archive

archive-offering

Archive an offering

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
POST/projects/{project_id}/offerings/{offering_id}/actions/unarchive

unarchive-offering

Unarchive an offering

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
unarchive_referenced_entitiesbooleanIf true, also unarchive any archived products referenced by this offering's packages.
GET/projects/{project_id}/offerings

list-offerings

Get a list of offerings

Parameters

project_idstringrequiredID of the project
starting_afterstringstarting_after
limitintegerlimit
expandarraySpecifies 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).
POST/projects/{project_id}/offerings

create-offering

Create an offering

Parameters

project_idstringrequiredID of the project
lookup_keystringrequiredThe custom identifier of the offering
display_namestringrequiredThe display_name of the offering
metadatastringCustom metadata of the offering
GET/projects/{project_id}/packages/{package_id}

get-package

Get a package

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `product` (requires `project_configuration:products:read` permission).
POST/projects/{project_id}/packages/{package_id}

update-package

Update a package

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
display_namestringThe display name of the package
positionintegerThe position of the package within the offering
DELETE/projects/{project_id}/packages/{package_id}

delete-package-from-offering

Delete a package

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
GET/projects/{project_id}/offerings/{offering_id}/packages

list-packages

Get a list of packages in an offering

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
starting_afterstringstarting_after
limitintegerlimit
expandarraySpecifies which fields in the response should be expanded. Accepted values are: `items.product` (requires `project_configuration:products:read` permission).
POST/projects/{project_id}/offerings/{offering_id}/packages

create-packages

Create a package

Parameters

project_idstringrequiredID of the project
offering_idstringrequiredID of the offering
lookup_keystringrequiredThe lookup_key of the package
display_namestringrequiredThe display name of the package
positionintegerThe position of the package in the offering
GET/projects/{project_id}/packages/{package_id}/products

get-products-from-package

Get a list of products attached to a given package of an offering

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/packages/{package_id}/actions/attach_products

attach-products-to-package

Attach a set of products to a package

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
productsarrayrequiredProduct association list
POST/projects/{project_id}/packages/{package_id}/actions/detach_products

detach-products-from-package

Detach a set of products from a package

Parameters

project_idstringrequiredID of the project
package_idstringrequiredID of the package
product_idsarrayrequiredIDs of the products to detach from the package
GET/projects/{project_id}/subscriptions/{subscription_id}

get-subscription

Get a subscription

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
GET/projects/{project_id}/subscriptions/{subscription_id}/transactions

get-play-store-or-app-store-subscription-transactions

Get a Play Store or App Store subscription's transactions

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
POST/projects/{project_id}/subscriptions/{subscription_id}/transactions/{transaction_id}/actions/refund

refund-play-store-subscription-transaction

Refund a Play Store subscription's transaction

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
transaction_idstringrequiredIdentifier of the transaction in the store
GET/projects/{project_id}/subscriptions/{subscription_id}/entitlements

list-subscription-entitlements

Get a list of entitlements associated with a subscription

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/subscriptions/{subscription_id}/actions/cancel

cancel-subscription

Cancel an active Web Billing subscription

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
POST/projects/{project_id}/subscriptions/{subscription_id}/actions/refund

refund-subscription

Refund an active Web Billing subscription

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
GET/projects/{project_id}/subscriptions/{subscription_id}/authenticated_management_url

get-authorized-subscription-management-url

Get an authenticated Web Billing customer portal URL

Parameters

project_idstringrequiredID of the project
subscription_idstringrequiredID of the subscription
GET/projects/{project_id}/customers/{customer_id}/subscriptions

list-subscriptions

Get a list of subscriptions associated with a customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
environmentstringenvironment
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/purchases/{purchase_id}

get-purchase

Get a purchase

Parameters

project_idstringrequiredID of the project
purchase_idstringrequiredID of the purchase
GET/projects/{project_id}/purchases/{purchase_id}/entitlements

list-purchase-entitlements

Get a list of entitlements associated with a purchase

Parameters

project_idstringrequiredID of the project
purchase_idstringrequiredID of the purchase
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/purchases/{purchase_id}/actions/refund

refund-purchase

Refund a Web Billing purchase

Parameters

project_idstringrequiredID of the project
purchase_idstringrequiredID of the purchase
GET/projects/{project_id}/customers/{customer_id}/purchases

list-purchases

Get a list of purchases associated with a customer

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
environmentstringenvironment
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/customers/{customer_id}/active_entitlements

list-customer-active-entitlements

Get a list of customer's active entitlements

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/customers/{customer_id}/aliases

list-customer-aliases

Get a list of the customer's aliases

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/customers/{customer_id}/virtual_currencies

list-virtual-currencies-balances

Get a list of customer's virtual currencies balances

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
include_empty_balancesbooleaninclude_empty_balances
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/customers/{customer_id}/virtual_currencies/transactions

create-virtual-currencies-transaction

Create a virtual currencies transaction

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
Idempotency-KeystringThis is an optional idempotency key to ensure exactly once execution of the request.
include_empty_balancesbooleaninclude_empty_balances
adjustmentsobjectrequiredThe adjustments to the virtual currencies
referencestringThe reference of the transaction
POST/projects/{project_id}/customers/{customer_id}/virtual_currencies/update_balance

update-virtual-currencies-balance

Update a virtual currencies balance without creating a transaction

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
Idempotency-KeystringThis is an optional idempotency key to ensure exactly once execution of the request.
include_empty_balancesbooleaninclude_empty_balances
adjustmentsobjectrequiredThe adjustments to the virtual currencies
referencestringThe reference of the transaction
GET/projects/{project_id}/customers/{customer_id}/attributes

list-customer-attributes

Get a list of the customer's attributes

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
starting_afterstringstarting_after
limitintegerlimit
POST/projects/{project_id}/customers/{customer_id}/attributes

set-customer-attributes

Set a customer's attributes

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
attributesarrayrequiredattributes
GET/projects/{project_id}/customers/{customer_id}/invoices

list-customer-invoices

Get a list of the customer's invoices

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
starting_afterstringstarting_after
limitintegerlimit
GET/projects/{project_id}/customers/{customer_id}/invoices/{invoice_id}/file

get-invoice

Get an invoice

Parameters

project_idstringrequiredID of the project
customer_idstringrequiredID of the customer
invoice_idstringrequiredID of the invoice
GET/projects/{project_id}/metrics/overview

get-overview-metrics

Get overview metrics for a project

Parameters

project_idstringrequiredID of the project
currencystringISO 4217 currency code
GET/projects/{project_id}/charts/{chart_name}

get-chart-data

Get chart data

Parameters

project_idstringrequiredID of the project
chart_namestringrequiredName of the chart to retrieve.
realtimebooleanWhether to request real-time (v3) charts. Defaults to true. Set to false to request the v2 charts.
filtersstringJSON array of chart filters. Each filter is a ChartFilter object.
selectorsstringJSON object of chart selectors.
aggregatearrayComma-separated aggregate operations to return in `summary` without raw `values`.
currencystringISO 4217 currency code
resolutionstringTime resolution for the chart data. Use the chart options endpoint to discover available resolutions and their IDs.
start_datestringStart date for the data range (ISO 8601 format)
end_datestringEnd date for the data range (ISO 8601 format)
segmentstringSegment the data by this dimension. Use the chart options endpoint to discover available segments for a chart.
GET/projects/{project_id}/charts/{chart_name}/options

get-chart-options

Get available options for a chart

Parameters

project_idstringrequiredID of the project
chart_namestringrequiredName of the chart to retrieve.
realtimebooleanWhether to request real-time (v3) charts. Defaults to true. Set to false to request the v2 charts.
GET/projects/{project_id}/subscriptions

search-subscriptions

Search subscriptions by store subscription identifier

Parameters

project_idstringrequiredID of the project
store_subscription_identifierstringrequiredStore ID associated with the subscription for the current or next period.
GET/projects/{project_id}/purchases

search-purchases

Search one-time purchases by store purchase identifier

Parameters

project_idstringrequiredID of the project
store_purchase_identifierstringrequiredStore ID associated with the one-time purchase.

Original OpenAPI Spec

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>


      <div class="theme-admonition theme-admonition-info alert alert--info">
        <div class="heading">API v2 under development</div>
        <div>
          REST API v2 is currently under development and does not yet cover all use cases from API v1. For those missing use cases, please use v1 in the meantime.
        </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 | 5 |

      | Project Configuration | 60 |

      | Virtual Currencies - Create Transaction | 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}/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:
              type: object
              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
              additionalProperties: false
      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 for an offering of the project.
         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>.
    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}/apps/{app_id}/public_api_keys:
    get:
      summary: Get a list of the public API keys of an app
      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'
      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:
    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. Currently, only searching by email is supported
            (searching for exact matches in the $email attribute).
          required: false
          in: query
          schema:
            type: string
            minLength: 1
            maxLength: 255
            example: [email protected]
      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: [email protected]
              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'
        '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}/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 unless one already exists. As a side
        effect, a promotional subscription is created.
      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'
      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}/actions/revoke_granted_entitlement:
    post:
      summary: >-
        Revoke a granted entitlement from a customer. As a side effect, the
        promotional subscription associated with the granted entitlement is
        expired.
      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'
      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}/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}/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
      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'
      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/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
      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'
      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}/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
      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'
      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/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
      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'
      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}/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
      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'
      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/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
      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'
      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/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
      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'
      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/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
      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'
      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:
    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
      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 subscription's transaction
      operationId: refund-play-store-subscription-transaction
      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
        - 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 a Play Store subscription's transaction. This endpoint does not
        cancel the subscription or revoke access to it.
         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}/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/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 Web Billing customer portal 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'
        '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: 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: 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>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/transactions:
    post:
      summary: Create a virtual currencies transaction
      operationId: create-virtual-currencies-transaction
      x-revenuecat-rate-limiting-domain: virtual_currencies_create_transaction
      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 - Create Transaction</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_create_transaction
      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 - Create Transaction</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: [email protected]
                  - 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: ISO 4217 currency code
          in: query
          schema:
            type: string
            enum:
              - USD
              - EUR
              - GBP
              - AUD
              - CAD
              - JPY
              - BRL
              - KRW
              - CNY
              - MXN
              - SEK
              - PLN
          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>5 requests per minute</strong>.
  /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.


        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.
         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>5 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.
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            enum:
              - actives
              - actives_movement
              - actives_new
              - arr
              - churn
              - cohort_explorer
              - conversion_to_paying
              - customers_new
              - ltv_per_customer
              - ltv_per_paying_customer
              - mrr
              - mrr_movement
              - refund_rate
              - revenue
              - subscription_retention
              - subscription_status
              - trials
              - trials_movement
              - trials_new
              - customers_active
              - trial_conversion_rate
            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: ISO 4217 currency code
          in: query
          schema:
            type: string
            enum:
              - USD
              - EUR
              - GBP
              - AUD
              - CAD
              - JPY
              - BRL
              - KRW
              - CNY
              - MXN
              - SEK
              - PLN
          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: segment
          description: |
            Segment the data by this dimension. Use the chart options endpoint
            to discover available segments for a chart.
          in: query
          schema:
            type: string
            example: country
      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>5 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.
          required: true
          in: path
          schema:
            type: string
            maxLength: 255
            enum:
              - actives
              - actives_movement
              - actives_new
              - arr
              - churn
              - cohort_explorer
              - conversion_to_paying
              - customers_new
              - ltv_per_customer
              - ltv_per_paying_customer
              - mrr
              - mrr_movement
              - refund_rate
              - revenue
              - subscription_retention
              - subscription_status
              - trials
              - trials_movement
              - trials_new
              - customers_active
              - trial_conversion_rate
            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
      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
      properties:
        amazon:
          description: Amazon type details
          type: object
          required:
            - package_name
          nullable: false
          properties:
            package_name:
              description: The package name of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
    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
    App:
      allOf:
        - type: object
          required:
            - id
            - name
            - created_at
            - type
            - project_id
            - object
          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
                - app_store
                - mac_app_store
                - play_store
                - stripe
                - rc_billing
                - roku
                - paddle
                - test_store
              example: app_store
            project_id:
              description: The id of the project
              nullable: false
              type: string
              minLength: 1
              maxLength: 255
              example: proj1a2b3c4
        - $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'
      additionalProperties: true
    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
      properties:
        app_store:
          description: App Store type details
          type: object
          required:
            - bundle_id
          nullable: false
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
    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
    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
        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, single-use URL that provides temporary access to the
            customer portal for a specific customer. This URL can only be used
            once and expires after use.
          nullable: false
          type: string
          minLength: 1
          maxLength: 255
          example: >-
            https://billing.revenuecat.com/app1a2b3c4/sub1ab2c3d4e5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
      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: Parameters that were provided but not supported
          nullable: true
          type: object
          properties:
            filters:
              type: array
              items:
                type: string
            segment:
              type: string
              nullable: true
      additionalProperties: false
    ChartFilterOption:
      type: object
      description: A filter option for a chart
      required:
        - id
        - display_name
        - options
      properties:
        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
    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:
        - id
        - display_name
      properties:
        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
    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: [email protected]
        role:
          description: The role of the collaborator
          nullable: false
          type: string
          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
    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: [email protected]
        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
    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
            - customer
            - 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
    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
      properties:
        mac_app_store:
          description: Legacy Mac App Store type details
          type: object
          required:
            - bundle_id
          nullable: false
          properties:
            bundle_id:
              description: The bundle ID of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
    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
    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
    Offering:
      type: object
      required:
        - id
        - lookup_key
        - display_name
        - is_current
        - state
        - created_at
        - project_id
        - object
      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
        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
    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
      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
      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
    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
    PaddleApp:
      type: object
      properties:
        paddle:
          description: Paddle Billing type details
          type: object
          nullable: false
          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
    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
    Paywall:
      type: object
      required:
        - id
        - name
        - offering_id
        - created_at
        - published_at
        - 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: false
          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
        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
      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
        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
    PlayStoreApp:
      type: object
      properties:
        play_store:
          description: Play Store type details
          type: object
          required:
            - package_name
          nullable: false
          properties:
            package_name:
              description: The package name of the app
              type: string
              nullable: false
              minLength: 1
              maxLength: 256
    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
    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'
        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
    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
          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
      properties:
        rc_billing:
          description: Revenue Cat Billing Store type details
          type: object
          required:
            - seller_company_name
            - default_currency
          nullable: false
          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'
    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
    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
    RokuApp:
      type: object
      properties:
        roku:
          description: Roku Channel Store type details
          type: object
          nullable: false
          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
    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
    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
      properties:
        stripe:
          description: Stripe type details
          type: object
          nullable: false
          properties:
            stripe_account_id:
              description: Stripe account connected to your RevenueCat account.
              type: string
              nullable: true
              minLength: 1
              maxLength: 256
    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
    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
          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: >-
            Indicates pending product changes. Present if the
            `auto_renewal_status` is `will_change_product`.
          nullable: true
          type: object
          properties:
            product:
              description: The product that will be active as of the next renewal
              nullable: false
              $ref: '#/components/schemas/Product'
        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
    SubscriptionTransaction:
      type: object
      required:
        - id
        - purchased_at
        - object
      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
        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
      additionalProperties: false
    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'
    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
    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
    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
        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:
    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
          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
    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