[Skip to main content](/content/docs/api-v2#__docusaurus_skipToContent_fallback/index.html)

- General
  - Overview (v2)
    - About RevenueCat’s REST API
    - Should I use this REST API or the RevenueCat SDK?
    - Base URL
    - Authentication
    - API v2 Permissions
    - Request Payload
    - Params
  - Pagination
    - Parameters
  - Rate Limit
    - Rate Limits by Domain
    - Rate Limit Headers
  - Expandables
  - Error Handling
    - Error Codes
    - Error Types
  - Representation of Subscriptions
    - What constitutes a new subscription
- Model Reference
  - Subscription Data Model
- Endpoint Reference
  - App
    - getGet a list of the public API keys of an app
    - getGet a list of apps
    - postCreate an app
    - getGet an app
    - postUpdate an app
    - delDelete an app
    - getGet the StoreKit configuration for an app
  - Audit Log
    - getList audit logs
  - Charts & Metrics
    - getGet overview metrics for a project
    - getGet revenue for a project
    - getGet chart data
    - getGet available options for a chart
  - Collaborator
    - getGet a list of collaborators
  - Customer
    - getGet a list of customers
    - postCreate a customer
    - getGet a customer
    - delDelete a customer
    - getGet customer center configuration
    - postTransfer customer's subscriptions and one-time purchases to another customer
    - postGrant an entitlement to a customer
    - postRevoke a granted entitlement from a customer
    - postAssign or clear an offering override for a customer
    - postRestore a Google Play purchase by order ID
    - getGet a list of subscriptions associated with a customer
    - getGet a list of purchases associated with a customer
    - getGet a list of customer's active entitlements
    - getGet a list of the customer's aliases
    - getGet a list of customer's virtual currencies balances
    - postCreate a virtual currencies transaction
    - postUpdate a virtual currencies balance without creating a transaction
    - getGet a list of the customer's attributes
    - postSet a customer's attributes
  - Entitlement
    - getGet an entitlement
    - postUpdate an entitlement
    - delDelete an entitlement
    - getGet a list of entitlements
    - postCreate an entitlement
    - getGet a list of products attached to a given entitlement
    - postArchive an entitlement
    - postUnarchive an entitlement
    - postAttach a set of products to an entitlement
    - postDetach a set of product from an entitlement
  - Offering
    - getGet an offering
    - postUpdate an offering
    - delDelete an offering and its attached packages
    - postArchive an offering
    - postUnarchive an offering
    - getGet a list of offerings
    - postCreate an offering
  - Package
    - getGet a package
    - postUpdate a package
    - delDelete a package
    - getGet a list of packages in an offering
    - postCreate a package
    - getGet a list of products attached to a given package of an offering
    - postAttach a set of products to a package
    - postDetach a set of products from a package
  - Product
    - getGet a product
    - postUpdate a product
    - delDelete a product
    - postArchive a product
    - postUnarchive a product
    - postPush a product to the store
    - getGet a list of products
    - postCreate a product
  - Virtual Currency
    - getGet a list of virtual currencies
    - postCreate a virtual currency
    - getGet a virtual currency
    - postUpdate a virtual currency
    - delDelete a virtual currency
    - postArchive a virtual currency
    - postUnarchive a virtual currency
  - Purchase
    - getGet a purchase
    - getGet a list of entitlements associated with a purchase
    - postRefund a Web Billing purchase
    - getSearch one-time purchases by store purchase identifier
  - Subscription
    - getGet a subscription
    - getGet a Play Store or App Store subscription's transactions
    - postRefund a Play Store or Galaxy subscription's transaction
    - getGet a list of entitlements associated with a subscription
    - postCancel an active Web Billing subscription
    - postExtend the current billing period of a subscription
    - postRefund an active Web Billing subscription
    - getGet an authenticated subscription management URL
    - getSearch subscriptions by store subscription identifier
  - Invoice
    - getGet a list of the customer's invoices
    - getGet an invoice
  - Paywall
    - postUpload a media asset
    - getGet a list of paywalls
    - postCreate a paywall
    - getGet a paywall
    - patchUpdate a paywall draft
    - delDelete a paywall
  - Integration
    - getList webhook integrations
    - postCreate a webhook integration
    - getGet a webhook integration
    - postUpdate a webhook integration
    - delDelete a webhook integration
  - Project
    - getGet a list of projects
    - postCreates a new project

API docs by Redocly](https://redocly.com/redoc/)

# Developer API (2.0.0)

Download OpenAPI specification: [Download](/content/docs/redocusaurus/plugin-redoc-0.yaml)

## [tag/Overview-(v2)](/content/docs/api-v2\#tag/Overview-(v2/index.html)) Overview (v2)

New to RevenueCat?

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 [Quickstart](/content/docs/getting-started/quickstart/index.html) for more information on getting started with RevenueCat.

API v2 under development

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.

## [tag/Overview-(v2)/About-RevenueCat's-REST-API](/content/docs/api-v2\#tag/Overview-(v2/index.html)/About-RevenueCat's-REST-API) 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.

## [tag/Overview-(v2)/Should-I-use-this-REST-API-or-the-RevenueCat-SDK](/content/docs/api-v2\#tag/Overview-(v2/index.html)/Should-I-use-this-REST-API-or-the-RevenueCat-SDK) 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](/content/docs/getting-started/installation/index.html).

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.

## [tag/Overview-(v2)/Base-URL](/content/docs/api-v2\#tag/Overview-(v2/index.html)/Base-URL) Base URL

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

## [tag/Overview-(v2)/Authentication](/content/docs/api-v2\#tag/Overview-(v2/index.html)/Authentication) 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](/content/docs/welcome/authentication/index.html) for more information.

```text
Authorization: Bearer YOUR_REVENUECAT_API_KEY
```

Authorization type \`Bearer\` required in header

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.

API v1 keys will not work with REST API v2

In order to utilize the RevenueCat API v2, please create new v2 secret keys and define your permissions.

## [tag/Overview-(v2)/API-v2-Permissions](/content/docs/api-v2\#tag/Overview-(v2/index.html)/API-v2-Permissions) API v2 Permissions

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

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

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

## [tag/Overview-(v2)/Request-Payload](/content/docs/api-v2\#tag/Overview-(v2/index.html)/Request-Payload) Request Payload

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

```text
Content-Type: application/json
```

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

## [tag/Overview-(v2)/Params](/content/docs/api-v2\#tag/Overview-(v2/index.html)/Params) Params

Encode your URL params

For URL params, such as the \`app\_user\_id\`, make sure you URL encode them before using them.

## [tag/Pagination](/content/docs/api-v2\#tag/Pagination/index.html) Pagination

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
{
  "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.

## [tag/Pagination/Parameters](/content/docs/api-v2\#tag/Pagination/Parameters/index.html) 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.

## [tag/Rate-Limit](/content/docs/api-v2\#tag/Rate-Limit/index.html) Rate Limit

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.

## [tag/Rate-Limit/Rate-Limits-by-Domain](/content/docs/api-v2\#tag/Rate-Limit/Rate-Limits-by-Domain/index.html) Rate Limits by Domain

| Domain | Rate Limit (requests per minute) |
| --- | --- |
| Customer Information | 480 |
| Charts & Metrics | 25 |
| 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).

## [tag/Rate-Limit/Rate-Limit-Headers](/content/docs/api-v2\#tag/Rate-Limit/Rate-Limit-Headers/index.html) 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
}
```

## [tag/Expandables](/content/docs/api-v2\#tag/Expandables/index.html) Expandables

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
{
  "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
{
  "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.

## [tag/Error-Handling](/content/docs/api-v2\#tag/Error-Handling/index.html) Error Handling

RevenueCat uses [standard HTTP status codes](/content/docs/api-v2#tag/Error-Handling/Error-Codes/index.html) 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
{
  "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](/content/docs/api-v2#tag/Error-Handling/Error-Types/index.html) documentation.

## [tag/Error-Handling/Error-Codes](/content/docs/api-v2\#tag/Error-Handling/Error-Codes/index.html) 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](/content/docs/api-v2#tag/Rate-Limit/index.html) |
| 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 |

## [tag/Error-Handling/Error-Types](/content/docs/api-v2\#tag/Error-Handling/Error-Types/index.html) 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](/content/docs/api-v2#tag/Rate-Limit/index.html) 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.

## [tag/Representation-of-Subscriptions](/content/docs/api-v2\#tag/Representation-of-Subscriptions/index.html) Representation of Subscriptions

In comparison to our [v1 REST API](/content/docs/api-v1#tag/customer_info_model/index.html), 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](/content/docs/api-v2#tag/Subscription-Data-Model/index.html).

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

## [tag/Representation-of-Subscriptions/What-constitutes-a-new-subscription](/content/docs/api-v2\#tag/Representation-of-Subscriptions/What-constitutes-a-new-subscription/index.html) 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

#### Billing issue: recovered

#### Lapsed subscription

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

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

#### Product changes (with trial)

#### Subscription paused: Recovery

#### Subscription paused: Billing issue, recovered

#### Subscription paused: Billing issue, unrecovered

#### Family shared subscriptions

#### Family shared subscriptions: regranted

## [tag/Subscription-Data-Model](/content/docs/api-v2\#tag/Subscription-Data-Model/index.html) Subscription Data Model

|     |     |
| --- | --- |
| object<br>required | string<br>Value:"subscription"<br>String representing the object's type. Objects of the same type share the same value. |
| id<br>required | string \[ 1 .. 255 \] characters <br>The ID of the subscription (generated by RevenueCat) |
| customer\_id<br>required | string \[ 1 .. 1500 \] characters <br>The ID of the customer |
| original\_customer\_id<br>required | string \[ 1 .. 1500 \] characters <br>The ID of the original customer. Relevant for subscriptions that were transferred from one customer to another |
| product\_id<br>required | string or null \[ 1 .. 255 \] characters <br>The RevenueCat ID of the product that the customer is subscribed to. Exists for all store types except for promotional. |
| starts\_at<br>required | integer <int64> <br>The date when the subscription originally started in ms since epoch |
| current\_period\_starts\_at<br>required | integer <int64> <br>The date when the subscription billing period started in ms since epoch |
| current\_period\_ends\_at<br>required | integer or null <int64> <br>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. |
| ends\_at<br>required | integer or null <int64> <br>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. |
| gives\_access<br>required | boolean<br>Determines whether the customer should currently be provided access to the entitlements associated with the subscription |
| pending\_payment<br>required | boolean<br>Determines whether there is a pending payment associated with the subscription |
| auto\_renewal\_status<br>required | string<br>Enum:"will\_renew""will\_not\_renew""will\_change\_product""will\_pause""requires\_price\_increase\_consent""has\_already\_renewed"<br>The auto renewal status of a subscription.<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) |
| status<br>required | string<br>Enum:"trialing""active""expired""in\_grace\_period""in\_billing\_retry""paused""unknown""incomplete"<br>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>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. |
| total\_revenue\_in\_usd<br>required | MonetaryAmount (object)<br>Total revenue generated by a subscription in USD |
| One of

MonetaryAmount

|     |     |
| --- | --- |
| currency<br>required | string (Currency) <br>Enum:"AED""AFN""ALL""AMD""ANG""AOA""ARS""AUD""AWG""AZN"… 160 more<br>ISO 4217 currency code |
| gross<br>required | number<br>Total revenue generated (excluding taxes and commission) |
| commission | number<br>Store commission or payment processor fees deducted from gross revenue (if any) |
| tax<br>required | number<br>Estimated taxes deducted from gross revenue |
| proceeds<br>required | number<br>Net revenue after store commission / fees and taxes |
| property name\*<br>additional property | any | |
| presented\_offering\_id<br>required | string or null \[ 1 .. 200 \] characters <br>The ID of the offering the customer saw when purchasing the subscription |
| entitlements<br>required | object (EntitlementList) |
| |     |     |
| --- | --- |
| object<br>required | string<br>Value:"list"<br>String representing the object's type. Objects of the same type share the same value. Always has the value `list`. |
| items<br>required | Array of objects (Entitlement) <br>Details about each object. |
| next\_page<br>required | string or null<br>URL to access the next page of the customer's entitlements. If not present / null, there is no next page |
| url<br>required | string <= 5000 characters <br>The URL where this list can be accessed. | |
| environment<br>required | Environment (string)<br>The store environment |
| One of <br>Environment<br>string (Environment) <br>Enum:"production""sandbox"<br>The store environment |
| store<br>required | string<br>Enum:"amazon""app\_store""mac\_app\_store""play\_store""promotional""stripe""rc\_billing""external""roku""paddle"… 3 more<br>Store the subscription belongs to |
| store\_subscription\_identifier<br>required | string \[ 1 .. 255 \] characters <br>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) |
| ownership<br>required | Ownership (string)<br>Ownership of the subscription |
| One of <br>Ownership<br>string (Ownership) <br>Enum:"purchased""family\_shared"<br>Ownership of the subscription |
| pending\_changes | object or null<br>Expected changes to the subscription that will occur at the end of the current period. Present when the subscription has a pending product change, has already renewed for the next period, or has a failed upcoming renewal. Only fields that differ from the current subscription state are included. |
| |     |     |
| --- | --- |
| product | object or null<br>The product that will be active as of the next renewal |
| current\_period\_starts\_at | integer or null <int64> <br>Expected start of the next billing period in ms since epoch. Omitted when unchanged from the current subscription. |
| current\_period\_ends\_at | integer or null <int64> <br>Expected end of the next billing period in ms since epoch. Omitted when unchanged from the current subscription. |
| store\_subscription\_identifier | string or null \[ 1 .. 255 \] characters <br>Expected store subscription identifier for the next period. Omitted when unchanged from the current subscription. |
| auto\_renewal\_status | string or null<br>Enum:"will\_renew""will\_not\_renew""will\_change\_product""will\_pause""requires\_price\_increase\_consent""has\_already\_renewed"<br>Expected auto renewal status for the next period. Omitted when unchanged from the current subscription. |
| status | string or null<br>Enum:"trialing""active""expired""in\_grace\_period""in\_billing\_retry""paused""unknown""incomplete"<br>Expected subscription status for the next period. Omitted when unchanged from the current subscription. |
| pending\_payment | boolean or null<br>Expected pending payment flag for the next period. Omitted when unchanged from the current subscription. |
| gives\_access | boolean or null<br>Expected access flag for the next period. Omitted when unchanged from the current subscription. |
| property name\*<br>additional property | any | |
| country | string or null (Country) <br>Enum:null"AF""AL""DZ""AS""AD""AO""AI""AQ""AG"… 240 more<br>The country that the object is associated with, in ISO alpha 2 code |
| management\_url<br>required | string or null<br>The URL to manage the subscription |

Copy
Expand all  Collapse all

`{"object": "subscription",

"id": "sub1ab2c3d4e5",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"starts_at": 1658399423658,

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1658399423658,

"ends_at": 1658399423658,

"gives_access": true,

"pending_payment": true,

"auto_renewal_status": "will_renew",

"status": "trialing",

"total_revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"items": [{"state": "active",\
\
"object": "entitlement",\
\
"project_id": "proj1ab2c3d4",\
\
"id": "entla1b2c3d4e5",\
\
"lookup_key": "premium",\
\
"display_name": "Premium",\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": "P1M",\
\
"grace_period_duration": "P3D",\
\
"trial_duration": "P1W"\
\
},\
\
"one_time": {"is_consumable": true\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": "string"\
\
}\
\
},\
\
"indicative_price": {"object": "indicative_price",\
\
"currency": "USD",\
\
"country": "US",\
\
"amount_micros": "For 99.99, the value should be 99990000"\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_subscription_identifier": 12345678,

"ownership": "purchased",

"pending_changes": {"product": {"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

},

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1660991423658,

"store_subscription_identifier": 12345679,

"auto_renewal_status": "will_renew",

"status": "active",

"pending_payment": false,

"gives_access": true

},

"country": "US",

"management_url": "https://apps.apple.com/account/subscriptions"

}`

## [tag/App](/content/docs/api-v2\#tag/App/index.html) App

Operations about apps.

## [tag/App/operation/list-app-public-api-keys](/content/docs/api-v2\#tag/App/operation/list-app-public-api-keys/index.html) Get a list of the public API keys of an app

get/projects/{project\_id}/apps/{app\_id}/public\_api\_keys

https://api.revenuecat.com/v2/projects/{project\_id}/apps/{app\_id}/public\_api\_keys

Returns public API keys for the app. RC Checkout public keys are omitted. Sandbox keys are always included. Production keys are omitted when the app uses Stripe or Web Billing and the linked Stripe connected account is sandbox or test-only (same behavior as the RevenueCat dashboard list).
This endpoint requires the following permission(s): `project_configuration:apps:read`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| app\_id<br>required | string <= 255 characters <br>Example: app1ab2c3d4<br>ID of the app |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "public_api_key",\
\
"id": "apikey12345",\
\
"key": "goog_1ab2c3d4",\
\
"environment": "production",\
\
"app_id": "app1a2b3c4",\
\
"created_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/projec1a2b3c4d/apps/app1a2b3c4d/public_api_keys?starting_after=pub1a2b3c4d",

"url": "/v2/projects/projec1a2b3c4d/apps/app1a2b3c4d/public_api_keys"

}`

## [tag/App/operation/list-apps](/content/docs/api-v2\#tag/App/operation/list-apps/index.html) Get a list of apps

get/projects/{project\_id}/apps

https://api.revenuecat.com/v2/projects/{project\_id}/apps

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": "string"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/projec1a2b3c4d/apps?starting_after=app1a2b3c4d",

"url": "/v2/projects/projec1a2b3c4d/apps"

}`

## [tag/App/operation/create-app](/content/docs/api-v2\#tag/App/operation/create-app/index.html) Create an app

post/projects/{project\_id}/apps

https://api.revenuecat.com/v2/projects/{project\_id}/apps

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| name<br>required | string \[ 1 .. 255 \] characters <br>The name of the app |
| type<br>required | string<br>The platform of the app.<br>Mac App Store is disabled by default. See [Legacy Mac Apps](/content/docs/legacy-mac-apps/index.html) for more details.<br>paddlerokurc\_billingstripeplay\_storemac\_app\_storeapp\_storeamazonamazon |
| amazon<br>required | object<br>Amazon type details. Should only be used when type is amazon. |
| |     |     |
| --- | --- |
| package\_name<br>required | string \[ 1 .. 256 \] characters <br>The package name of the app |
| shared\_secret | string<br>Your Amazon Developer Identity Shared Key | |

### Responses

**201**

Success. The app was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

App StorePlay StoreStripeAmazonWeb BillingRokuPaddleApp Store

Copy
Expand all  Collapse all

`{"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-----\nMHQCAQEEIGAkwOF0qkGO19yJlIzQVcOg+HBfvLL4KDXDtL+MMHk2oAcGBSuBBAAK\noUQDQgAEhDP7RaX4c6qOHkE1nIWMr5C90ybtr87VRGFm4VsfWqG47NPN+/dHcfwJ\nJPZGFgMcgvBc37AxQPPQjyXYjhhQDg==\n-----END EC PRIVATE KEY-----",

"subscription_key_id": "6345942CC3",

"subscription_key_issuer": "5a049d62-1b9b-453c-b605-1988189d8129"

}

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Example

amazonapp\_storemac\_app\_storeplay\_storestriperc\_billingrokupaddletest\_storeamazon

Copy
Expand all  Collapse all

`{"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

}`

## [tag/App/operation/get-app](/content/docs/api-v2\#tag/App/operation/get-app/index.html) Get an app

get/projects/{project\_id}/apps/{app\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/apps/{app\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Example

amazonapp\_storemac\_app\_storeplay\_storestriperc\_billingrokupaddletest\_storeamazon

Copy
Expand all  Collapse all

`{"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

}`

## [tag/App/operation/update-app](/content/docs/api-v2\#tag/App/operation/update-app/index.html) Update an app

post/projects/{project\_id}/apps/{app\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/apps/{app\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| name | string \[ 1 .. 255 \] characters <br>The name of the app |
| amazon | object<br>Amazon type details. Should only be used when type is amazon. |
| |     |     |
| --- | --- |
| package\_name | string \[ 1 .. 256 \] characters <br>The package name of the app |
| shared\_secret | string or null<br>Your Amazon Developer Identity Shared Key | |
| app\_store | object<br>App Store type details. Should only be used when type is app\_store. |
| |     |     |
| --- | --- |
| bundle\_id | string \[ 1 .. 256 \] characters <br>The bundle ID of the app |
| shared\_secret | string or null = 32 characters <br>The shared secret of the app |
| subscription\_private\_key | string<br>PKCS |
| subscription\_key\_id | string<br>In App Key id. The ID of the downloaded in app key. You can get it from App Store Connect |
| subscription\_key\_issuer | string<br>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](/content/docs/in-app-purchase-key-configuration#3-providing-the-issuer-id-to-revenuecat/index.html) |
| app\_store\_connect\_api\_key | string<br>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. |
| app\_store\_connect\_api\_key\_id | string<br>App Store Connect API Key ID. The ID of the downloaded API key. You can get it from App Store Connect. |
| app\_store\_connect\_api\_key\_issuer | string<br>App Store Connect API Key Issuer ID. |
| app\_store\_connect\_vendor\_number | string<br>Your vendor number from App Store Connect. Required for some features like financial reports. | |
| mac\_app\_store | object<br>Legacy Mac App Store type details. Should only be used when type is mac\_app\_store. |
| |     |     |
| --- | --- |
| bundle\_id | string \[ 1 .. 256 \] characters <br>The bundle ID of the app |
| shared\_secret | string or null = 32 characters <br>The shared secret of the app | |
| play\_store | object<br>Play Store type details. Should only be used when type is play\_store. |
| |     |     |
| --- | --- |
| package\_name<br>required | string \[ 1 .. 256 \] characters <br>The package name of the app | |
| stripe | object<br>Stripe type details. Should only be used when type is stripe. |
| |     |     |
| --- | --- |
| stripe\_account\_id | string \[ 1 .. 256 \] characters <br>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. | |
| rc\_billing | object<br>Web Billing type details. Should only be used when type is rc\_billing. |
| |     |     |
| --- | --- |
| stripe\_account\_id | string or null \[ 1 .. 256 \] characters <br>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. |
| app\_name | string or null \[ 1 .. 256 \] characters <br>Shown in checkout, emails, and receipts sent to customers. |
| support\_email | string or null \[ 1 .. 320 \] characters <br>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. |
| default\_currency | string (RCBillingCurrency) <br>Enum:"USD""EUR""JPY""GBP""AUD""CAD""BRL""KRW""CNY""MXN"… 36 more<br>ISO 4217 currency code | |
| roku | object<br>Roku Channel Store type details. Should only be used when type is roku. |
| |     |     |
| --- | --- |
| roku\_api\_key | string or null = 33 characters <br>Roku Pay API key provided on the Roku Pay Web Services page. |
| roku\_channel\_id | string or null = 6 characters <br>Channel ID provided on the Roku Channel page. |
| roku\_channel\_name | string or null \[ 1 .. 30 \] characters <br>Channel name that is displayed on the Roku Channel page. | |
| paddle | object<br>Paddle Billing type details. Should only be used when type is paddle. |
| |     |     |
| --- | --- |
| paddle\_api\_key | string or null = 50 characters <br>Paddle Server-side API key provided on the Paddle dashboard. |
| paddle\_is\_sandbox | boolean<br>Whether the app is tied to the sandbox environment. | |

### Responses

**200**

Success. The app was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

Update App Store App propertiesUpdate App Store App secretRemove App Store App secretUpdate App Store App properties

Copy
Expand all  Collapse all

`{"name": "New App name",

"app_store": {"bundle_id": "com.my.new-app",

"shared_secret": "1234567890abcdef1234567890abcdef"

}

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Example

amazonapp\_storemac\_app\_storeplay\_storestriperc\_billingrokupaddletest\_storeamazon

Copy
Expand all  Collapse all

`{"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

}`

## [tag/App/operation/delete-app](/content/docs/api-v2\#tag/App/operation/delete-app/index.html) Delete an app

delete/projects/{project\_id}/apps/{app\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/apps/{app\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/App/operation/get-app-storekit-config](/content/docs/api-v2\#tag/App/operation/get-app-storekit-config/index.html) Get the StoreKit configuration for an app

get/projects/{project\_id}/apps/{app\_id}/store\_kit\_config

https://api.revenuecat.com/v2/projects/{project\_id}/apps/{app\_id}/store\_kit\_config

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "store_kit_config_file",

"contents": { }

}`

## [tag/Audit-Log](/content/docs/api-v2\#tag/Audit-Log/index.html) Audit Log

Operations about audit logs.

## [tag/Audit-Log/operation/list-audit-logs](/content/docs/api-v2\#tag/Audit-Log/operation/list-audit-logs/index.html) List audit logs

get/projects/{project\_id}/audit\_logs

https://api.revenuecat.com/v2/projects/{project\_id}/audit\_logs

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=log1ab2c3d4e5<br>Cursor for pagination. Returns audit logs after the specified audit log ID, using descending order by audit log ID. |
| start\_date | string <date> <br>Example: start\_date=2024-01-01<br>Start date for the data range (ISO 8601 format) |
| end\_date | string <date> <br>Example: end\_date=2024-12-31<br>End date for the data range (ISO 8601 format) |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "audit_log",\
\
"id": "log1ab2c3d4e5",\
\
"project_id": "proj1ab2c3d4",\
\
"action_type": "project_name_updated",\
\
"target_type": "project",\
\
"target_identifier": "proj1ab2c3d4",\
\
"actor_type": "user",\
\
"actor_identifier": "user_abc123",\
\
"occurred_at": 1713297600000,\
\
"additional_data": { }\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/audit_logs?starting_after=log1ab2c3d4e5",

"url": "/v2/projects/proj1ab2c3d4/audit_logs"

}`

## [tag/Charts-and-Metrics](/content/docs/api-v2\#tag/Charts-and-Metrics/index.html) Charts & Metrics

Operations about chart metrics.

## [tag/Charts-and-Metrics/operation/get-overview-metrics](/content/docs/api-v2\#tag/Charts-and-Metrics/operation/get-overview-metrics/index.html) Get overview metrics for a project

get/projects/{project\_id}/metrics/overview

https://api.revenuecat.com/v2/projects/{project\_id}/metrics/overview

This endpoint requires the following permission(s): `charts_metrics:overview:read`. This endpoint belongs to the **Charts & Metrics** domain, which has a default rate limit of **25 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| currency | string<br>Enum:"USD""EUR""GBP""AUD""CAD""JPY""BRL""KRW""CNY""MXN"… 4 more<br>Example: currency=EUR<br>The currency to return metrics data in |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "overview_metrics",

"metrics": [{"object": "overview_metric",\
\
"id": "active_trials",\
\
"name": "Active Trials",\
\
"description": "string",\
\
"unit": "$",\
\
"period": "P0D",\
\
"value": 34765,\
\
"last_updated_at": 1658399423658,\
\
"last_updated_at_iso8601": "2022-10-13 09:45:00.123000+00:00"\
\
}\
\
],

"currency": "EUR"

}`

## [tag/Charts-and-Metrics/operation/get-revenue-metric](/content/docs/api-v2\#tag/Charts-and-Metrics/operation/get-revenue-metric/index.html) Get revenue for a project

get/projects/{project\_id}/metrics/revenue

https://api.revenuecat.com/v2/projects/{project\_id}/metrics/revenue

Returns the total revenue for the project across all of its apps for the
given inclusive date range `[start_date, end_date]`. The value is expressed
in the project's primary currency unless `currency` is provided.

Use `revenue_type` to choose which revenue definition the `value` represents:
gross `revenue` (default), `revenue_net_of_taxes`, or `proceeds` (net of both
taxes and store commission — the amount the developer keeps).

This endpoint is backed by the same realtime (v3) revenue chart that powers
the dashboard. It is intended for cases where an app needs an authoritative
revenue total without inferring it from the transaction list.

Note that the most recent day in the range may be partial if it includes
today, since transactions for today are still arriving.
This endpoint requires the following permission(s): `charts_metrics:overview:read`. This endpoint belongs to the **Charts & Metrics** domain, which has a default rate limit of **25 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| start\_date<br>required | string <date> <br>Example: start\_date=2024-01-01<br>Start date for the data range (ISO 8601 format) |
| end\_date<br>required | string <date> <br>Example: end\_date=2024-12-31<br>End date for the data range (ISO 8601 format) |
| currency | string<br>Enum:"USD""EUR""GBP""AUD""CAD""JPY""BRL""KRW""CNY""MXN"… 4 more<br>Example: currency=EUR<br>The currency to return metrics data in |
| revenue\_type | string<br>Default: "revenue"<br>Enum:"revenue""revenue\_net\_of\_taxes""proceeds"<br>Example: revenue\_type=proceeds<br>Which revenue definition to return as the metric value:<br>- `revenue`: gross revenue.<br>- `revenue_net_of_taxes`: revenue with taxes subtracted.<br>- `proceeds`: revenue net of both taxes and store commission (the amount the<br>developer keeps). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "revenue_metric",

"start_date": "2026-01-01",

"end_date": "2026-01-31",

"currency": "USD",

"value": 12345.67,

"revenue_type": "proceeds"

}`

## [tag/Charts-and-Metrics/operation/get-chart-data](/content/docs/api-v2\#tag/Charts-and-Metrics/operation/get-chart-data/index.html) Get chart data

get/projects/{project\_id}/charts/{chart\_name}

https://api.revenuecat.com/v2/projects/{project\_id}/charts/{chart\_name}

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.

**Incomplete data**
For the most recent periods, data may be flagged as incomplete, and may not be appropriate to use for analysis.
This endpoint requires the following permission(s): `charts_metrics:charts:read`. This endpoint belongs to the **Charts & Metrics** domain, which has a default rate limit of **25 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| chart\_name<br>required | string <= 255 characters <br>Enum:"actives""actives\_movement""actives\_new""arr""churn""cohort\_explorer""conversion\_to\_paying""customers\_new""initial\_conversion""ltv\_per\_customer"… 14 more<br>Example: revenue<br>Name of the chart to retrieve:<br>- actives: Active (paying) subscriptions <br>- actives\_movement: Period-over-period delta of active (paying) subscriptions<br>- actives\_new: New paying subscriptions, including trial conversions, resubscriptions, and product changes<br>- arr: Annual recurring revenue<br>- churn: Churn rate: active and expired subscriptions per period<br>- cohort\_explorer: allows measuring the performance of various cohort definitions over time for revenue, retained subscriptions, and cohort LTV<br>- conversion\_to\_paying: Conversion of new customers to paying<br>- customers\_new: Newly seen customers<br>- initial\_conversion: Initial conversion of new customers to paying within fixed windows (0, 3, 7, 14, 30 days, and unbounded)<br>- ltv\_per\_customer: Realized LTV per customer, also known as ARPU, cohorted by first seen date<br>- ltv\_per\_paying\_customer: Realized LTV per paying customer, also known as ARPPU, cohorted by first seen date<br>- mrr: Monthly recurring revenue<br>- mrr\_movement: Period-over-period delta of monthly recurring revenue<br>- prediction\_explorer: similar to cohort\_explorer but including future predictions<br>- refund\_rate: transactions per period, refunds, refund rate<br>- revenue: revenue (gross, net of taxes, or proceeds net of taxes and commissions) and number of transactions (subscriptions and non-subscriptions) per period<br>- subscription\_retention: Per-period retention of paying subscriptions by duration<br>- subscription\_status: Break down paying subscriptions, trials, MRR, ARR, or revenue by whether the subscription is set to renew, cancelled, or in billing recovery<br>- trials: Active trials<br>- trials\_movement: Movement of active trials<br>- trials\_new: New trials<br>- customers\_active: Customers seen during the period (also known as DAU/MAU/WAU/etc.)<br>- trial\_conversion\_rate: Number of trials started in a period and ratio of them converting to paying<br>- non-subscription\_purchases: Number of non-subscription purchases per period |

##### query Parameters

|     |     |
| --- | --- |
| realtime | boolean<br>Default: true<br>Whether to request real-time (v3) charts. Defaults to true. Set to false to request the v2 charts. |
| filters | string<br>Example: filters=\[{"name":"country","values":\["US","UK"\]}\]<br>JSON array of chart filters. Each filter is a ChartFilter object. |
| selectors | string<br>Example: selectors={"conversion\_timeframe":"7\_days","revenue\_type":"proceeds"}<br>JSON object of chart selectors. |
| aggregate | Array of strings non-empty  unique <br>Items Enum:"average""total"<br>Example: aggregate=average,total<br>Comma-separated aggregate operations to return in `summary` without raw `values`. |
| currency | string<br>Enum:"USD""EUR""GBP""AUD""CAD""JPY""BRL""KRW""CNY""MXN"… 4 more<br>Example: currency=EUR<br>The currency to return metrics data in |
| resolution | string<br>Example: resolution=0<br>Time resolution for the chart data.<br>Use the chart options endpoint to discover available resolutions and their IDs. |
| start\_date | string <date> <br>Example: start\_date=2024-01-01<br>Start date for the data range (ISO 8601 format) |
| end\_date | string <date> <br>Example: end\_date=2024-12-31<br>End date for the data range (ISO 8601 format) |
| segment | string<br>Example: segment=country<br>Segment the data by this dimension. Use the chart options endpoint<br>to discover available segments for a chart. |
| limit\_num\_segments | integer >= 1 <br>Example: limit\_num\_segments=10<br>If set, limits the number of segments returned to the top N by value.<br>All remaining segments are aggregated into an "Other" segment.<br>Only applies when a segment is specified. |
| include\_annotations | boolean<br>Default: false<br>Example: include\_annotations=true<br>When true, includes chart annotations for the project in the response, filtered to the chart's date window. |

### Responses

**200**

Chart data retrieved successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "chart_data",

"category": "revenue",

"display_type": "line",

"display_name": "Revenue",

"description": "string",

"documentation_link": "string",

"last_computed_at": 0,

"start_date": 0,

"end_date": 0,

"yaxis_currency": "USD",

"filtering_allowed": true,

"segmenting_allowed": true,

"resolution": "day",

"values": [[0\
\
]\
\
],

"summary": { },

"yaxis": "$",

"segments": [{"id": "string",\
\
"display_name": "string"\
\
}\
\
],

"segments_limit": 0,

"measures": [{ }\
\
],

"user_selectors": {"property1": "string",

"property2": "string"

},

"unsupported_params": {"filters": ["string"\
\
],

"segment": "string"

},

"annotations": [{"object": "chart_annotation",\
\
"id": "chartannot1a2b3c",\
\
"description": "App version 2.0 released",\
\
"start_date": "2024-01-15",\
\
"end_date": "2024-01-20"\
\
}\
\
]

}`

## [tag/Charts-and-Metrics/operation/get-chart-options](/content/docs/api-v2\#tag/Charts-and-Metrics/operation/get-chart-options/index.html) Get available options for a chart

get/projects/{project\_id}/charts/{chart\_name}/options

https://api.revenuecat.com/v2/projects/{project\_id}/charts/{chart\_name}/options

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): `charts_metrics:charts:read`. This endpoint belongs to the **Charts & Metrics** domain, which has a default rate limit of **25 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| realtime | boolean<br>Default: true<br>Whether to request real-time (v3) charts. Defaults to true. Set to false to request the v2 charts. |

### Responses

**200**

Chart options retrieved successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "chart_options",

"resolutions": [{"id": "0",\
\
"display_name": "day"\
\
},\
\
{"id": "1",\
\
"display_name": "week"\
\
},\
\
{"id": "2",\
\
"display_name": "month"\
\
}\
\
],

"segments": [{"object": "chart_segment_option",\
\
"id": "country",\
\
"display_name": "Country",\
\
"group_display_name": "Geography"\
\
}\
\
],

"filters": [{"object": "chart_filter_option",\
\
"id": "country",\
\
"display_name": "Country",\
\
"group_display_name": "Geography",\
\
"options": [{"id": "US",\
\
"display_name": "United States"\
\
}\
\
]\
\
}\
\
],

"user_selectors": {"property1": {"default": "string",

"display_name": "string",

"options": [{"id": "string",\
\
"display_name": "string"\
\
}\
\
]

},

"property2": {"default": "string",

"display_name": "string",

"options": [{"id": "string",\
\
"display_name": "string"\
\
}\
\
]

}

}

}`

## [tag/Collaborator](/content/docs/api-v2\#tag/Collaborator/index.html) Collaborator

Operations about collaborators.

## [tag/Collaborator/operation/list-collaborators](/content/docs/api-v2\#tag/Collaborator/operation/list-collaborators/index.html) Get a list of collaborators

get/projects/{project\_id}/collaborators

https://api.revenuecat.com/v2/projects/{project\_id}/collaborators

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "collaborator",\
\
"id": "collab1a2b3c4d5",\
\
"name": "John Doe",\
\
"email": "john.doe@example.com",\
\
"role": "admin",\
\
"accepted_at": 1658399423658,\
\
"has_mfa": true\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/collaborators?starting_after=collab1a2b3c4d5",

"url": "/v2/projects/proj1ab2c3d4/collaborators"

}`

## [tag/Customer](/content/docs/api-v2\#tag/Customer/index.html) Customer

Operations about customers.

## [tag/Customer/operation/list-customers](/content/docs/api-v2\#tag/Customer/operation/list-customers/index.html) Get a list of customers

get/projects/{project\_id}/customers

https://api.revenuecat.com/v2/projects/{project\_id}/customers

This endpoint requires the following permission(s): `customer_information:customers:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| search | string \[ 1 .. 255 \] characters <br>Example: search=example@example.com<br>Search term. Currently, only searching by email is supported (searching for exact matches in the $email attribute). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "customer",\
\
"id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"project_id": "proj1ab2c3d4",\
\
"first_seen_at": 1658399423658,\
\
"last_seen_at": 1658399423658,\
\
"last_seen_app_version": "1.0.0",\
\
"last_seen_country": "US",\
\
"last_seen_platform": "android",\
\
"last_seen_platform_version": "35",\
\
"active_entitlements": {"object": "list",\
\
"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"\
\
},\
\
"experiment": {"object": "experiment_enrollment",\
\
"id": "string",\
\
"name": "string",\
\
"variant": "a"\
\
},\
\
"attributes": {"object": "list",\
\
"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",\
\
"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/projec1a2b3c4d/customers?starting_after=223xx1100",

"url": "/v2/projects/projec1a2b3c4d/customers"

}`

## [tag/Customer/operation/create-customer](/content/docs/api-v2\#tag/Customer/operation/create-customer/index.html) Create a customer

post/projects/{project\_id}/customers

https://api.revenuecat.com/v2/projects/{project\_id}/customers

This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| id<br>required | string \[ 1 .. 1500 \] characters ^\[0-9a-zA-Z\_-\]\*$<br>The ID of the customer |
| attributes | Array of objects <= 50 characters |
| Array

|     |     |
| --- | --- |
| name<br>required | CustomerAttributeReservedName (string) or CustomerAttributeCustomName (string) \[ 1 .. 40 \] characters <br>The name of the attribute |
| value<br>required | string <= 500 characters <br>The value of the attribute | |

### Responses

**201**

Success. The customer was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"attributes": [{"name": "$email",\
\
"value": "cat@revenuecat.com"\
\
}\
\
]

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}`

## [tag/Customer/operation/get-customer](/content/docs/api-v2\#tag/Customer/operation/get-customer/index.html) Get a customer

get/projects/{project\_id}/customers/{customer\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| customer\_id<br>required | string \[ 1 .. 1500 \] characters <br>Example: 19b8de26-77c1-49f1-aa18-019a391603e2<br>ID of the customer |

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"attributes"<br>Example: expand=attributes<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `attributes` (requires `customer_information:customers:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}`

## [tag/Customer/operation/delete-customer](/content/docs/api-v2\#tag/Customer/operation/delete-customer/index.html) Delete a customer

delete/projects/{project\_id}/customers/{customer\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**202**

Accepted. The customer deletion was queued.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 202
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "customer",

"id": "b5b7bfd2-66fb-4091-af50-7c3cdccfdf24",

"deleted_at": 1658399423658

}`

## [tag/Customer/operation/get-customer-center-config](/content/docs/api-v2\#tag/Customer/operation/get-customer-center-config/index.html) Get customer center configuration

get/projects/{project\_id}/customers/{customer\_id}/customer\_center

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/customer\_center

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| platform | string<br>Enum:"app\_store""play\_store""mac\_app\_store""stripe""amazon"<br>Example: platform=app\_store<br>The platform to process the Customer Center configuration for. When provided, returns the locale-selected, platform-filtered configuration the customer would see. When omitted, returns the full unprocessed configuration for all platforms. Must match a store configured on this project. |
| locale | string<br>Example: locale=en\_US<br>BCP 47 locale string (e.g. en\_US) used to select the appropriate localization when platform is provided. When omitted, the configuration's default locale is used. Has no effect if platform is not provided. |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer_center_config",

"customer_center": { }

}`

## [tag/Customer/operation/transfer-customer-data](/content/docs/api-v2\#tag/Customer/operation/transfer-customer-data/index.html) Transfer customer's subscriptions and one-time purchases to another customer

post/projects/{project\_id}/customers/{customer\_id}/actions/transfer

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/actions/transfer

This endpoint requires the following permission(s): `customer_information:customers:read_write`, `customer_information:subscriptions:read_write`, `customer_information:purchases:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| target\_customer\_id<br>required | string<br>The ID of the customer to whom the subscriptions and one-time purchases will be transferred. |
| app\_ids | Array of strings or null\[ items \[ 1 .. 255 \] characters  \]<br>Optional. The IDs of the apps to filter the transfer by. When specified, only purchases and subscriptions associated with these apps will be transferred. |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"target_customer_id": "string",

"app_ids": ["appa2b3c4d5e"\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"source_customer": {"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

},

"target_customer": {"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}

}`

## [tag/Customer/operation/grant-customer-entitlement](/content/docs/api-v2\#tag/Customer/operation/grant-customer-entitlement/index.html) Grant an entitlement to a customer

post/projects/{project\_id}/customers/{customer\_id}/actions/grant\_entitlement

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/actions/grant\_entitlement

Grants an entitlement to a customer unless one already exists. As a side effect, a promotional subscription is created. This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| entitlement\_id<br>required | string \[ 1 .. 255 \] characters <br>The ID of the entitlement to grant to the customer. |
| expires\_at<br>required | integer <int64> <br>The date after which the access to the entitlement expires in ms since epoch. |

### Responses

**201**

Entitlement granted successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"entitlement_id": "entla1b2c3d4e5",

"expires_at": 1658399423658

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}`

## [tag/Customer/operation/revoke-customer-granted-entitlement](/content/docs/api-v2\#tag/Customer/operation/revoke-customer-granted-entitlement/index.html) Revoke a granted entitlement from a customer

post/projects/{project\_id}/customers/{customer\_id}/actions/revoke\_granted\_entitlement

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/actions/revoke\_granted\_entitlement

Revokes a granted entitlement from a customer. As a side effect, the promotional subscription associated with the granted entitlement is expired. This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| entitlement\_id<br>required | string \[ 1 .. 255 \] characters <br>The ID of the granted entitlement to revoke from the customer. |

### Responses

**200**

Entitlement revoked successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"entitlement_id": "entla1b2c3d4e5"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}`

## [tag/Customer/operation/assign-customer-offering](/content/docs/api-v2\#tag/Customer/operation/assign-customer-offering/index.html) Assign or clear an offering override for a customer

post/projects/{project\_id}/customers/{customer\_id}/actions/assign\_offering

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/actions/assign\_offering

This endpoint requires the following permission(s): `project_configuration:offerings:read`, `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| offering\_id<br>required | string or null \[ 1 .. 255 \] characters <br>The ID of the offering to assign to the customer. Set to null to clear any existing override. |

### Responses

**200**

Offering assigned successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"offering_id": "offrng1b2c3d4e5"

}`

### Response samples

- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Example

parameter\_errorinvalid\_requestparameter\_error

Copy

`{"object": "error",

"type": "parameter_error",

"param": "customer_id",

"message": "id is too long",

"retryable": false,

"doc_url": "https://errors.rev.cat/parameter-error"

}`

## [tag/Customer/operation/restore-purchase-by-order-id](/content/docs/api-v2\#tag/Customer/operation/restore-purchase-by-order-id/index.html) Restore a Google Play purchase by order ID

post/projects/{project\_id}/customers/{customer\_id}/actions/restore\_purchase\_by\_order\_id

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/actions/restore\_purchase\_by\_order\_id

Restores a Google Play purchase to the specified customer using a Google Play order ID. This endpoint requires the following permission(s): `customer_information:customers:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| order\_id<br>required | string non-empty <br>The Google Play order ID to restore. |

### Responses

**200**

Purchase restored successfully

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"order_id": "GPA.1234-5678-9012-34567"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "customer",

"id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"project_id": "proj1ab2c3d4",

"first_seen_at": 1658399423658,

"last_seen_at": 1658399423658,

"last_seen_app_version": "1.0.0",

"last_seen_country": "US",

"last_seen_platform": "android",

"last_seen_platform_version": "35",

"active_entitlements": {"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

},

"experiment": {"object": "experiment_enrollment",

"id": "string",

"name": "string",

"variant": "a"

},

"attributes": {"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}

}`

## [tag/Customer/operation/list-subscriptions](/content/docs/api-v2\#tag/Customer/operation/list-subscriptions/index.html) Get a list of subscriptions associated with a customer

get/projects/{project\_id}/customers/{customer\_id}/subscriptions

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/subscriptions

This endpoint requires the following permission(s): `customer_information:subscriptions:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| environment | string<br>Enum:"sandbox""production"<br>Example: environment=production |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "subscription",\
\
"id": "sub1ab2c3d4e5",\
\
"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"product_id": "prod1a2b3c4d5e",\
\
"starts_at": 1658399423658,\
\
"current_period_starts_at": 1658399423658,\
\
"current_period_ends_at": 1658399423658,\
\
"ends_at": 1658399423658,\
\
"gives_access": true,\
\
"pending_payment": true,\
\
"auto_renewal_status": "will_renew",\
\
"status": "trialing",\
\
"total_revenue_in_usd": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
},\
\
"presented_offering_id": "ofrnge1a2b3c4d5",\
\
"entitlements": {"object": "list",\
\
"items": [{"state": "active",\
\
"object": "entitlement",\
\
"project_id": "proj1ab2c3d4",\
\
"id": "entla1b2c3d4e5",\
\
"lookup_key": "premium",\
\
"display_name": "Premium",\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": null,\
\
"grace_period_duration": null,\
\
"trial_duration": null\
\
},\
\
"one_time": {"is_consumable": null\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": null,\
\
"id": null,\
\
"name": null,\
\
"created_at": null,\
\
"type": null,\
\
"project_id": null,\
\
"amazon": { }\
\
},\
\
"indicative_price": {"object": null,\
\
"currency": null,\
\
"country": null,\
\
"amount_micros": null\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"\
\
}\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"\
\
},\
\
"environment": "production",\
\
"store": "amazon",\
\
"store_subscription_identifier": 12345678,\
\
"ownership": "purchased",\
\
"pending_changes": {"product": {"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": "P1M",\
\
"grace_period_duration": "P3D",\
\
"trial_duration": "P1W"\
\
},\
\
"one_time": {"is_consumable": true\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": "string"\
\
}\
\
},\
\
"indicative_price": {"object": "indicative_price",\
\
"currency": "USD",\
\
"country": "US",\
\
"amount_micros": "For 99.99, the value should be 99990000"\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
},\
\
"current_period_starts_at": 1658399423658,\
\
"current_period_ends_at": 1660991423658,\
\
"store_subscription_identifier": 12345679,\
\
"auto_renewal_status": "will_renew",\
\
"status": "active",\
\
"pending_payment": false,\
\
"gives_access": true\
\
},\
\
"country": "US",\
\
"management_url": "https://apps.apple.com/account/subscriptions"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions?starting_after=sub1a2b3c4d",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions"

}`

## [tag/Customer/operation/list-purchases](/content/docs/api-v2\#tag/Customer/operation/list-purchases/index.html) Get a list of purchases associated with a customer

get/projects/{project\_id}/customers/{customer\_id}/purchases

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/purchases

This endpoint requires the following permission(s): `customer_information:purchases:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "purchase",\
\
"id": "purch1a2b3c4d5e",\
\
"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"product_id": "prod1a2b3c4d5e",\
\
"purchased_at": 1658399423658,\
\
"revenue_in_usd": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
},\
\
"quantity": 1,\
\
"status": "owned",\
\
"presented_offering_id": "ofrnge1a2b3c4d5",\
\
"entitlements": {"object": "list",\
\
"items": [{"state": "active",\
\
"object": "entitlement",\
\
"project_id": "proj1ab2c3d4",\
\
"id": "entla1b2c3d4e5",\
\
"lookup_key": "premium",\
\
"display_name": "Premium",\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": null,\
\
"grace_period_duration": null,\
\
"trial_duration": null\
\
},\
\
"one_time": {"is_consumable": null\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": null,\
\
"id": null,\
\
"name": null,\
\
"created_at": null,\
\
"type": null,\
\
"project_id": null,\
\
"amazon": { }\
\
},\
\
"indicative_price": {"object": null,\
\
"currency": null,\
\
"country": null,\
\
"amount_micros": null\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"\
\
}\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements"\
\
},\
\
"environment": "production",\
\
"store": "amazon",\
\
"store_purchase_identifier": 12345678,\
\
"ownership": "purchased",\
\
"country": "US"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases?starting_after=purc1a2b3c4d5e",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases"

}`

## [tag/Customer/operation/list-customer-active-entitlements](/content/docs/api-v2\#tag/Customer/operation/list-customer-active-entitlements/index.html) Get a list of customer's active entitlements

get/projects/{project\_id}/customers/{customer\_id}/active\_entitlements

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/active\_entitlements

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "customer.active_entitlement",\
\
"entitlement_id": "entla1b2c3d4e5",\
\
"expires_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/active_entitlements"

}`

## [tag/Customer/operation/list-customer-aliases](/content/docs/api-v2\#tag/Customer/operation/list-customer-aliases/index.html) Get a list of the customer's aliases

get/projects/{project\_id}/customers/{customer\_id}/aliases

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/aliases

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "customer.alias",\
\
"id": "19b8de26-77c1-49f1-aa18-019a391603e2",\
\
"created_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases?starting_after=9fjeja8fjed",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/aliases"

}`

## [tag/Customer/operation/list-virtual-currencies-balances](/content/docs/api-v2\#tag/Customer/operation/list-virtual-currencies-balances/index.html) Get a list of customer's virtual currencies balances

get/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| include\_empty\_balances | boolean<br>Example: include\_empty\_balances=true |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "virtual_currency_balance",\
\
"currency_code": "string",\
\
"balance": 0,\
\
"description": "string",\
\
"name": "string"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies?starting_after=9fjeja8fjed",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies"

}`

## [tag/Customer/operation/create-virtual-currencies-transaction](/content/docs/api-v2\#tag/Customer/operation/create-virtual-currencies-transaction/index.html) Create a virtual currencies transaction

post/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies/transactions

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies/transactions

This endpoint requires the following permission(s): `customer_information:purchases:read_write`. This endpoint belongs to the **Virtual Currencies - Create Transaction** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| include\_empty\_balances | boolean<br>Example: include\_empty\_balances=true |

##### header Parameters

|     |     |
| --- | --- |
| Idempotency-Key | string<br>Example: 1234-5678-9101-1121<br>This is an optional idempotency key to ensure exactly once execution of the request. |

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

|     |     |
| --- | --- |
| adjustments<br>required | object<br>The adjustments to the virtual currencies |
| |     |     |
| --- | --- |
| property name\*<br>additional property | integer | |
| reference | string or null<br>The reference of the transaction |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"adjustments": {"property1": 0,

"property2": 0

},

"reference": "string"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "virtual_currency_balance",\
\
"currency_code": "string",\
\
"balance": 0,\
\
"description": "string",\
\
"name": "string"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies?starting_after=9fjeja8fjed",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies"

}`

## [tag/Customer/operation/update-virtual-currencies-balance](/content/docs/api-v2\#tag/Customer/operation/update-virtual-currencies-balance/index.html) Update a virtual currencies balance without creating a transaction

post/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies/update\_balance

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/virtual\_currencies/update\_balance

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| include\_empty\_balances | boolean<br>Example: include\_empty\_balances=true |

##### header Parameters

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

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"adjustments": {"property1": 0,

"property2": 0

},

"reference": "string"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "virtual_currency_balance",\
\
"currency_code": "string",\
\
"balance": 0,\
\
"description": "string",\
\
"name": "string"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies?starting_after=9fjeja8fjed",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/virtual_currencies"

}`

## [tag/Customer/operation/list-customer-attributes](/content/docs/api-v2\#tag/Customer/operation/list-customer-attributes/index.html) Get a list of the customer's attributes

get/projects/{project\_id}/customers/{customer\_id}/attributes

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/attributes

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}`

## [tag/Customer/operation/set-customer-attributes](/content/docs/api-v2\#tag/Customer/operation/set-customer-attributes/index.html) Set a customer's attributes

post/projects/{project\_id}/customers/{customer\_id}/attributes

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/attributes

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| attributes<br>required | Array of objects \[ 1 .. 50 \] items |
| Array (\[ 1 .. 50 \] items)

|     |     |
| --- | --- |
| name<br>required | CustomerAttributeReservedName (string) or CustomerAttributeCustomName (string) \[ 1 .. 40 \] characters <br>The name of the attribute |
| value<br>required | string or null <= 500 characters <br>The value of the attribute. Use null to delete the attribute. | |

### Responses

**200**

Success. The customer attributes were set

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"attributes": [{"name": "$email",\
\
"value": "support@revenuecat.com"\
\
},\
\
{"name": "$displayName",\
\
"value": "John Appleseed"\
\
},\
\
{"name": "my_custom_attr",\
\
"value": "custom value"\
\
}\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "customer.attribute",\
\
"name": "$email",\
\
"value": "garfield@revenuecat.com",\
\
"updated_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes?starting_after=myCustomAttribute",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/attributes"

}`

## [tag/Entitlement](/content/docs/api-v2\#tag/Entitlement/index.html) Entitlement

Operations about entitlements.

## [tag/Entitlement/operation/get-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/get-entitlement/index.html) Get an entitlement

get/projects/{project\_id}/entitlements/{entitlement\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| entitlement\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: entla1b2c3d4e5<br>ID of the entitlement |

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"product"<br>Example: expand=product<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `product` (requires `project_configuration:products:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"items": [{"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": "P1M",\
\
"grace_period_duration": "P3D",\
\
"trial_duration": "P1W"\
\
},\
\
"one_time": {"is_consumable": true\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": "string"\
\
}\
\
},\
\
"indicative_price": {"object": "indicative_price",\
\
"currency": "USD",\
\
"country": "US",\
\
"amount_micros": "For 99.99, the value should be 99990000"\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/update-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/update-entitlement/index.html) Update an entitlement

post/projects/{project\_id}/entitlements/{entitlement\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| display\_name<br>required | string \[ 1 .. 1500 \] characters <br>The display name of the entitlement |

### Responses

**200**

Success. The entitlement was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"display_name": "Premium"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/delete-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/delete-entitlement/index.html) Delete an entitlement

delete/projects/{project\_id}/entitlements/{entitlement\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Entitlement/operation/list-entitlements](/content/docs/api-v2\#tag/Entitlement/operation/list-entitlements/index.html) Get a list of entitlements

get/projects/{project\_id}/entitlements

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"items.product"<br>Example: expand=items.product<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `items.product` (requires `project_configuration:products:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements"

}`

## [tag/Entitlement/operation/create-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/create-entitlement/index.html) Create an entitlement

post/projects/{project\_id}/entitlements

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| lookup\_key<br>required | string \[ 1 .. 200 \] characters <br>The identifier of the entitlement |
| display\_name<br>required | string \[ 1 .. 1500 \] characters <br>The display name of the entitlement |

### Responses

**201**

Success. The entitlement was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"lookup_key": "premium",

"display_name": "Premium access to all features"

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/get-products-from-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/get-products-from-entitlement/index.html) Get a list of products attached to a given entitlement

get/projects/{project\_id}/entitlements/{entitlement\_id}/products

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}/products

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entla1b2c3d4e5/products?starting_after=prod1a2b3c4d5",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entla1b2c3d4e5/products"

}`

## [tag/Entitlement/operation/archive-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/archive-entitlement/index.html) Archive an entitlement

post/projects/{project\_id}/entitlements/{entitlement\_id}/actions/archive

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}/actions/archive

Archives an entitlement (makes it inactive).
This endpoint requires the following permission(s): `project_configuration:entitlements:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The entitlement was archived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/unarchive-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/unarchive-entitlement/index.html) Unarchive an entitlement

post/projects/{project\_id}/entitlements/{entitlement\_id}/actions/unarchive

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}/actions/unarchive

Unarchives an entitlement (makes it active).
This endpoint requires the following permission(s): `project_configuration:entitlements:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The entitlement was unarchived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/attach-products-to-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/attach-products-to-entitlement/index.html) Attach a set of products to an entitlement

post/projects/{project\_id}/entitlements/{entitlement\_id}/actions/attach\_products

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}/actions/attach\_products

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| product\_ids<br>required | Array of strings \[ 1 .. 50 \] characters \[ items \[ 1 .. 255 \] characters  \]<br>IDs of the products to be attached to the entitlement. |

### Responses

**200**

Success. The products were attached to the entitlement

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"product_ids": ["prod1a2b3c4d5e"\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Entitlement/operation/detach-products-from-entitlement](/content/docs/api-v2\#tag/Entitlement/operation/detach-products-from-entitlement/index.html) Detach a set of product from an entitlement

post/projects/{project\_id}/entitlements/{entitlement\_id}/actions/detach\_products

https://api.revenuecat.com/v2/projects/{project\_id}/entitlements/{entitlement\_id}/actions/detach\_products

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| product\_ids<br>required | Array of strings \[ 1 .. 50 \] characters \[ items \[ 1 .. 255 \] characters  \]<br>IDs of the products to be detached from the entitlement. |

### Responses

**200**

Success. The products were detached from the entitlement

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"product_ids": ["prod1a2b3c4d5e"\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "entitlement",

"project_id": "proj1ab2c3d4",

"id": "entla1b2c3d4e5",

"lookup_key": "premium",

"display_name": "Premium",

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products?starting_after=prodeab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements/entle1a2b3c4d5/products"

}

}`

## [tag/Offering](/content/docs/api-v2\#tag/Offering/index.html) Offering

Operations about offerings.

## [tag/Offering/operation/get-offering](/content/docs/api-v2\#tag/Offering/operation/get-offering/index.html) Get an offering

get/projects/{project\_id}/offerings/{offering\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| offering\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: ofrnge1a2b3c4d5<br>ID of the offering |

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Enum:"package""package.product"<br>Example: expand=package<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `package` (requires `project_configuration:packages:read` permission), `package.product` (requires `project_configuration:products:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"items": [{"object": "package",\
\
"id": "pkge1a2b3c4d5",\
\
"lookup_key": "monthly",\
\
"display_name": "Monthly discounted with 3-day trial",\
\
"position": 1,\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"product": {"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": "P1M",\
\
"grace_period_duration": "P3D",\
\
"trial_duration": "P1W"\
\
},\
\
"one_time": {"is_consumable": true\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": null\
\
}\
\
},\
\
"indicative_price": {"object": "indicative_price",\
\
"currency": "USD",\
\
"country": "US",\
\
"amount_micros": "For 99.99, the value should be 99990000"\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
},\
\
"eligibility_criteria": "all"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

}`

## [tag/Offering/operation/update-offering](/content/docs/api-v2\#tag/Offering/operation/update-offering/index.html) Update an offering

post/projects/{project\_id}/offerings/{offering\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| display\_name | string \[ 1 .. 1500 \] characters <br>The display name of the offering |
| is\_current | boolean<br>Indicates if the offering is the current offering |
| metadata | object or null (OfferingMetadata) <br>Custom metadata of the offering |
| |     |     |
| --- | --- |
| property name\*<br>additional property | any | |

### Responses

**200**

Success. The offering was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"display_name": "premium access to features",

"is_current": true,

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

}

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

}`

## [tag/Offering/operation/delete-offering](/content/docs/api-v2\#tag/Offering/operation/delete-offering/index.html) Delete an offering and its attached packages

delete/projects/{project\_id}/offerings/{offering\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Offering/operation/archive-offering](/content/docs/api-v2\#tag/Offering/operation/archive-offering/index.html) Archive an offering

post/projects/{project\_id}/offerings/{offering\_id}/actions/archive

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}/actions/archive

Archives an offering (makes it inactive).
This endpoint requires the following permission(s): `project_configuration:offerings:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The offering was archived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

}`

## [tag/Offering/operation/unarchive-offering](/content/docs/api-v2\#tag/Offering/operation/unarchive-offering/index.html) Unarchive an offering

post/projects/{project\_id}/offerings/{offering\_id}/actions/unarchive

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}/actions/unarchive

Unarchives an offering (makes it active).
This endpoint requires the following permission(s): `project_configuration:offerings:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| unarchive\_referenced\_entities | boolean<br>Default: false<br>If true, also unarchive any archived products referenced by this offering's packages. |

### Responses

**200**

Success. The offering was unarchived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"unarchive_referenced_entities": false

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

}`

## [tag/Offering/operation/list-offerings](/content/docs/api-v2\#tag/Offering/operation/list-offerings/index.html) Get a list of offerings

get/projects/{project\_id}/offerings

https://api.revenuecat.com/v2/projects/{project\_id}/offerings

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Enum:"items.package""items.package.product"<br>Example: expand=items.package<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `items.package` (requires `project_configuration:packages:read` permission), `items.package.product` (requires `project_configuration:products:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"state": "active",\
\
"object": "offering",\
\
"id": "ofrnge1a2b3c4d5",\
\
"lookup_key": "default",\
\
"display_name": "The standard set of packages",\
\
"is_current": true,\
\
"created_at": 1658399423658,\
\
"project_id": "proj1ab2c3d4",\
\
"metadata": {"color": "blue",\
\
"call_to_action": "Subscribe Now!"\
\
},\
\
"packages": {"object": "list",\
\
"items": [{"object": "package",\
\
"id": "pkge1a2b3c4d5",\
\
"lookup_key": "monthly",\
\
"display_name": "Monthly discounted with 3-day trial",\
\
"position": 1,\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"product": {"state": null,\
\
"object": null,\
\
"id": null,\
\
"store_identifier": null,\
\
"type": null,\
\
"subscription": null,\
\
"one_time": null,\
\
"created_at": null,\
\
"app_id": null,\
\
"app": null,\
\
"indicative_price": null,\
\
"display_name": null\
\
},\
\
"eligibility_criteria": "all"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"\
\
}\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/offerings?starting_after=ofrngeab21da",

"url": "/v2/projects/proj1ab2c3d4/offerings"

}`

## [tag/Offering/operation/create-offering](/content/docs/api-v2\#tag/Offering/operation/create-offering/index.html) Create an offering

post/projects/{project\_id}/offerings

https://api.revenuecat.com/v2/projects/{project\_id}/offerings

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| lookup\_key<br>required | string \[ 1 .. 200 \] characters <br>The custom identifier of the offering |
| display\_name<br>required | string \[ 1 .. 1500 \] characters <br>The display\_name of the offering |
| metadata | object or null (OfferingMetadata) <br>Custom metadata of the offering |
| |     |     |
| --- | --- |
| property name\*<br>additional property | any | |

### Responses

**201**

Success. The offering was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"lookup_key": "default",

"display_name": "The standard set of packages",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

}

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

}`

## [tag/Package](/content/docs/api-v2\#tag/Package/index.html) Package

Operations about packages.

## [tag/Package/operation/get-package](/content/docs/api-v2\#tag/Package/operation/get-package/index.html) Get a package

get/projects/{project\_id}/packages/{package\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| package\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: pkge1a2b3c4d5<br>ID of the package |

##### query Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "package",

"id": "pkge1a2b3c4d5",

"lookup_key": "monthly",

"display_name": "Monthly discounted with 3-day trial",

"position": 1,

"created_at": 1658399423658,

"products": {"object": "list",

"items": [{"product": {"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": "P1M",\
\
"grace_period_duration": "P3D",\
\
"trial_duration": "P1W"\
\
},\
\
"one_time": {"is_consumable": true\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": "app",\
\
"id": "app1a2b3c4",\
\
"name": "string",\
\
"created_at": 1658399423658,\
\
"type": "amazon",\
\
"project_id": "proj1a2b3c4",\
\
"amazon": {"package_name": "string"\
\
}\
\
},\
\
"indicative_price": {"object": "indicative_price",\
\
"currency": "USD",\
\
"country": "US",\
\
"amount_micros": "For 99.99, the value should be 99990000"\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
},\
\
"eligibility_criteria": "all"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"

}

}`

## [tag/Package/operation/update-package](/content/docs/api-v2\#tag/Package/operation/update-package/index.html) Update a package

post/projects/{project\_id}/packages/{package\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| display\_name | string \[ 1 .. 1500 \] characters <br>The display name of the package |
| position | integer >= 1 <br>The position of the package within the offering |

### Responses

**200**

Success. The package was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"display_name": "monthly with one-week trial",

"position": 2

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "package",

"id": "pkge1a2b3c4d5",

"lookup_key": "monthly",

"display_name": "Monthly discounted with 3-day trial",

"position": 1,

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"

}

}`

## [tag/Package/operation/delete-package-from-offering](/content/docs/api-v2\#tag/Package/operation/delete-package-from-offering/index.html) Delete a package

delete/projects/{project\_id}/packages/{package\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Package/operation/list-packages](/content/docs/api-v2\#tag/Package/operation/list-packages/index.html) Get a list of packages in an offering

get/projects/{project\_id}/offerings/{offering\_id}/packages

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}/packages

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}`

## [tag/Package/operation/create-packages](/content/docs/api-v2\#tag/Package/operation/create-packages/index.html) Create a package

post/projects/{project\_id}/offerings/{offering\_id}/packages

https://api.revenuecat.com/v2/projects/{project\_id}/offerings/{offering\_id}/packages

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| lookup\_key<br>required | string \[ 1 .. 200 \] characters <br>The lookup\_key of the package |
| display\_name<br>required | string \[ 1 .. 1500 \] characters <br>The display name of the package |
| position | integer<br>The position of the package in the offering |

### Responses

**201**

Success. The package was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"lookup_key": "monthly",

"display_name": "monthly with one-week trial",

"position": 1

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "package",

"id": "pkge1a2b3c4d5",

"lookup_key": "monthly",

"display_name": "Monthly discounted with 3-day trial",

"position": 1,

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"

}

}`

## [tag/Package/operation/get-products-from-package](/content/docs/api-v2\#tag/Package/operation/get-products-from-package/index.html) Get a list of products attached to a given package of an offering

get/projects/{project\_id}/packages/{package\_id}/products

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}/products

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/packages/pkge1a2b3c4d5/products?starting_after=prod1a2b3c4d5",

"url": "/v2/projects/proj1ab2c3d4/packages/pkge1a2b3c4d5/products"

}`

## [tag/Package/operation/attach-products-to-package](/content/docs/api-v2\#tag/Package/operation/attach-products-to-package/index.html) Attach a set of products to a package

post/projects/{project\_id}/packages/{package\_id}/actions/attach\_products

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}/actions/attach\_products

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| products<br>required | Array of objects (PackageProductIDAssociation)  \[ 1 .. 50 \] characters <br>Product association list |
| Array

|     |     |
| --- | --- |
| product\_id<br>required | string \[ 1 .. 255 \] characters |
| eligibility\_criteria<br>required | string (EligibilityCriteria) <br>Enum:"all""google\_sdk\_lt\_6""google\_sdk\_ge\_6" | |

### Responses

**200**

Success. The products were attached to the package.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

Single product for package (applies to any store)Play Store with different products depending on SDK version (SDK v6+ and SDK <v5) for one packageSingle product for package (applies to any store)

Copy
Expand all  Collapse all

`{"products": [{"product_id": "prod1a2b3c4d5e",\
\
"eligibility_criteria": "all"\
\
}\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "package",

"id": "pkge1a2b3c4d5",

"lookup_key": "monthly",

"display_name": "Monthly discounted with 3-day trial",

"position": 1,

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"

}

}`

## [tag/Package/operation/detach-products-from-package](/content/docs/api-v2\#tag/Package/operation/detach-products-from-package/index.html) Detach a set of products from a package

post/projects/{project\_id}/packages/{package\_id}/actions/detach\_products

https://api.revenuecat.com/v2/projects/{project\_id}/packages/{package\_id}/actions/detach\_products

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| product\_ids<br>required | Array of strings \[ 1 .. 50 \] characters \[ items \[ 1 .. 255 \] characters  \]<br>IDs of the products to detach from the package |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"product_ids": ["prod1a2b3c4d5e"\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "package",

"id": "pkge1a2b3c4d5",

"lookup_key": "monthly",

"display_name": "Monthly discounted with 3-day trial",

"position": 1,

"created_at": 1658399423658,

"products": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"

}

}`

## [tag/Product](/content/docs/api-v2\#tag/Product/index.html) Product

Operations about products.

## [tag/Product/operation/get-product](/content/docs/api-v2\#tag/Product/operation/get-product/index.html) Get a product

get/projects/{project\_id}/products/{product\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| product\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: prod1a2b3c4d5<br>ID of the product |

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"app"<br>Example: expand=app<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `app` (requires `project_configuration:apps:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

}`

## [tag/Product/operation/update-product](/content/docs/api-v2\#tag/Product/operation/update-product/index.html) Update a product

post/projects/{project\_id}/products/{product\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}

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

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Specifies which fields in the response should be expanded. |

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

|     |     |
| --- | --- |
| display\_name | string <= 1500 characters <br>The display name of the product |

### Responses

**200**

Success. The product was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"display_name": "string"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

}`

## [tag/Product/operation/delete-product](/content/docs/api-v2\#tag/Product/operation/delete-product/index.html) Delete a product

delete/projects/{project\_id}/products/{product\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Product/operation/archive-product](/content/docs/api-v2\#tag/Product/operation/archive-product/index.html) Archive a product

post/projects/{project\_id}/products/{product\_id}/actions/archive

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}/actions/archive

Archives a product (makes it inactive).
This endpoint requires the following permission(s): `project_configuration:products:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The product was archived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

}`

## [tag/Product/operation/unarchive-product](/content/docs/api-v2\#tag/Product/operation/unarchive-product/index.html) Unarchive a product

post/projects/{project\_id}/products/{product\_id}/actions/unarchive

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}/actions/unarchive

Unarchives a product (makes it active).
This endpoint requires the following permission(s): `project_configuration:products:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The product was unarchived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

}`

## [tag/Product/operation/create-product-in-store](/content/docs/api-v2\#tag/Product/operation/create-product-in-store/index.html) Push a product to the store

post/projects/{project\_id}/products/{product\_id}/create\_in\_store

https://api.revenuecat.com/v2/projects/{project\_id}/products/{product\_id}/create\_in\_store

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): `project_configuration:products:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

Store-specific information. Only required for subscription products.
For in-app purchase products, send an empty body or omit the request body entirely.

|     |     |
| --- | --- |
| store\_information | CreateAppStoreConnectSubscriptionInput (object) or CreateAppStoreConnectInAppPurchaseInput (object)<br>Store-specific information for creating the product in the store |
| One of

CreateAppStoreConnectSubscriptionInputCreateAppStoreConnectInAppPurchaseInput

|     |     |
| --- | --- |
| duration<br>required | string<br>Enum:"ONE\_WEEK""ONE\_MONTH""TWO\_MONTHS""THREE\_MONTHS""SIX\_MONTHS""ONE\_YEAR"<br>The subscription duration period |
| subscription\_group\_name<br>required | string \[ 1 .. 255 \] characters <br>The name of the subscription group |
| subscription\_group\_id | string or null \[ 1 .. 255 \] characters <br>The ID of the subscription group (optional) | |

### Responses

**201**

Success. The product was pushed to the store

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

Creating a subscription productCreating an in-app purchase product (no body needed)Creating a subscription product

Copy
Expand all  Collapse all

`{"store_information": {"duration": "ONE_MONTH",

"subscription_group_name": "Premium Subscriptions",

"subscription_group_id": "sub_group_123"

}

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"created_product": {"object": "store_product",

"id": 1234567890,

"name": "Premium Monthly Subscription",

"product_identifier": "com.example.premium_monthly"

}

}`

## [tag/Product/operation/list-products](/content/docs/api-v2\#tag/Product/operation/list-products/index.html) Get a list of products

get/projects/{project\_id}/products

https://api.revenuecat.com/v2/projects/{project\_id}/products

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| app\_id | string<br>Example: app\_id=app1a2b3c4<br>This is an optional query parameter to get a list of products of a given entitlement associated with a particular app |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"items.app"<br>Example: expand=items.app<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `items.app` (requires `project_configuration:apps:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/products?starting_after=prodab21dac",

"url": "/v2/projects/proj1ab2c3d4/products"

}`

## [tag/Product/operation/create-product](/content/docs/api-v2\#tag/Product/operation/create-product/index.html) Create a product

post/projects/{project\_id}/products

https://api.revenuecat.com/v2/projects/{project\_id}/products

Warning

This endpoint does not allow to create Web Billing products.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| store\_identifier<br>required | string \[ 1 .. 200 \] characters <br>The store identifier of the product.<br>- For Apple App Store products this is the product ID of the subscription or in-app product.<br>- For Google's Play Store, it should follow the format 'productId:basePlanId' for subscription products and SKU for one-time purchase products.<br>- For Stripe, the product identifier that always starts with "prod\_"<br>- 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.<br>- For Roku, this is the product identifier of the subscription or one-time purchase product. |
| app\_id<br>required | string \[ 1 .. 255 \] characters <br>The ID of the app |
| type<br>required | string (ProductType) <br>Enum:"subscription""one\_time""consumable""non\_consumable""non\_renewing\_subscription" |
| display\_name | string or null \[ 1 .. 1500 \] characters <br>The display name of the product |
| subscription | object or null (ProductSubscriptionInput) <br>Subscription parameters for product creation. Only supported for simulated store products. |
| |     |     |
| --- | --- |
| duration<br>required | string (Duration) <br>Enum:"P1W""P1M""P2M""P3M""P6M""P1Y"<br>The duration of the product subscription. This field is only supported for the test store and it is ignored for other stores. | |
| title | string or null \[ 1 .. 1500 \] characters <br>The user-facing title of the product. This field is required for Test Store products. |

### Responses

**201**

Success. The product was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

App StorePlay Store Billing Client 4StripeAmazonPlay Store Subscription Billing Client 5Play Store One-time Billing Client 5Test StoreApp Store

Copy

`{"store_identifier": "com.revenuecat.magicweather.monthly9.99",

"app_id": "app1a2b3c4",

"type": "subscription",

"display_name": "Premium Monthly 2023"

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

}`

## [tag/Virtual-Currency](/content/docs/api-v2\#tag/Virtual-Currency/index.html) Virtual Currency

Operations about virtual currencies.

## [tag/Virtual-Currency/operation/list-virtual-currencies](/content/docs/api-v2\#tag/Virtual-Currency/operation/list-virtual-currencies/index.html) Get a list of virtual currencies

get/projects/{project\_id}/virtual\_currencies

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"state": "active",\
\
"object": "virtual_currency",\
\
"project_id": "proj1ab2c3d4",\
\
"code": "GLD",\
\
"name": "Gold",\
\
"created_at": 1658399423658,\
\
"description": "Gold currency used in the game",\
\
"product_grants": [{"object": "virtual_currency.product_grant",\
\
"product_ids": ["prode1a2b3c4d5"\
\
],\
\
"amount": 100,\
\
"trial_amount": 0,\
\
"expire_at_cycle_end": false\
\
}\
\
]\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/virtual_currencies?starting_after=GLD",

"url": "/v2/projects/proj1ab2c3d4/virtual_currencies"

}`

## [tag/Virtual-Currency/operation/create-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/create-virtual-currency/index.html) Create a virtual currency

post/projects/{project\_id}/virtual\_currencies

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| code<br>required | string \[ 1 .. 10 \] characters ^\[a-zA-Z0-9\_\]+$<br>The unique code for this virtual currency |
| name<br>required | string \[ 1 .. 50 \] characters <br>The display name of the virtual currency |
| description | string or null \[ 1 .. 1500 \] characters <br>Description of the virtual currency |
| product\_grants | Array of objects or null (VirtualCurrencyProductGrantInput) <br>Product grants that define how products grant this virtual currency |
| Array

|     |     |
| --- | --- |
| product\_ids<br>required | Array of strings non-empty \[ items \[ 1 .. 255 \] characters  \]<br>The list of product IDs that grant this virtual currency |
| amount<br>required | integer >= 1 <br>The amount of virtual currency granted |
| trial\_amount | integer or null >= 0 <br>The amount of virtual currency granted during trial period |
| expire\_at\_cycle\_end | boolean or null<br>Whether the grant expires at the end of the subscription cycle | |

### Responses

**201**

Success. The virtual currency was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"code": "GLD",

"name": "Gold",

"description": "Gold currency used in the game",

"product_grants": [{"product_ids": ["prode1a2b3c4d5"\
\
],\
\
"amount": 100,\
\
"trial_amount": 0,\
\
"expire_at_cycle_end": false\
\
}\
\
]

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "virtual_currency",

"project_id": "proj1ab2c3d4",

"code": "GLD",

"name": "Gold",

"created_at": 1658399423658,

"description": "Gold currency used in the game",

"product_grants": [{"object": "virtual_currency.product_grant",\
\
"product_ids": ["prode1a2b3c4d5"\
\
],\
\
"amount": 100,\
\
"trial_amount": 0,\
\
"expire_at_cycle_end": false\
\
}\
\
]

}`

## [tag/Virtual-Currency/operation/get-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/get-virtual-currency/index.html) Get a virtual currency

get/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| virtual\_currency\_code<br>required | string \[ 1 .. 10 \] characters ^\[a-zA-Z0-9\_\]+$<br>The virtual currency code |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "virtual_currency",

"project_id": "proj1ab2c3d4",

"code": "GLD",

"name": "Gold",

"created_at": 1658399423658,

"description": "Gold currency used in the game",

}`

## [tag/Virtual-Currency/operation/update-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/update-virtual-currency/index.html) Update a virtual currency

post/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| name | string \[ 1 .. 50 \] characters <br>The display name of the virtual currency |
| description | string or null \[ 1 .. 1500 \] characters <br>Description of the virtual currency |
| product\_grants | Array of objects or null (VirtualCurrencyProductGrantInput) <br>Product grants that define how products grant this virtual currency |
| Array

### Responses

**200**

Success. The virtual currency was updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"name": "Gold",

"description": "Gold currency used in the game",

"product_grants": [{"product_ids": ["prode1a2b3c4d5"\
\
],\
\
"amount": 100,\
\
"trial_amount": 0,\
\
"expire_at_cycle_end": false\
\
}\
\
]

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "virtual_currency",

"project_id": "proj1ab2c3d4",

"code": "GLD",

"name": "Gold",

"created_at": 1658399423658,

"description": "Gold currency used in the game",

}`

## [tag/Virtual-Currency/operation/delete-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/delete-virtual-currency/index.html) Delete a virtual currency

delete/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The virtual currency was deleted

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Virtual-Currency/operation/archive-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/archive-virtual-currency/index.html) Archive a virtual currency

post/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}/actions/archive

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}/actions/archive

Archives a virtual currency (makes it inactive).
This endpoint requires the following permission(s): `project_configuration:virtual_currencies:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The virtual currency was archived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "virtual_currency",

"project_id": "proj1ab2c3d4",

"code": "GLD",

"name": "Gold",

"created_at": 1658399423658,

"description": "Gold currency used in the game",

}`

## [tag/Virtual-Currency/operation/unarchive-virtual-currency](/content/docs/api-v2\#tag/Virtual-Currency/operation/unarchive-virtual-currency/index.html) Unarchive a virtual currency

post/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}/actions/unarchive

https://api.revenuecat.com/v2/projects/{project\_id}/virtual\_currencies/{virtual\_currency\_code}/actions/unarchive

Unarchives a virtual currency (makes it active).
This endpoint requires the following permission(s): `project_configuration:virtual_currencies:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The virtual currency was unarchived

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"state": "active",

"object": "virtual_currency",

"project_id": "proj1ab2c3d4",

"code": "GLD",

"name": "Gold",

"created_at": 1658399423658,

"description": "Gold currency used in the game",

}`

## [tag/Purchase](/content/docs/api-v2\#tag/Purchase/index.html) Purchase

Operations about purchases.

## [tag/Purchase/operation/get-purchase](/content/docs/api-v2\#tag/Purchase/operation/get-purchase/index.html) Get a purchase

get/projects/{project\_id}/purchases/{purchase\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/purchases/{purchase\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| purchase\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: purc1a2b3c4d5e<br>ID of the purchase |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "purchase",

"id": "purch1a2b3c4d5e",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"purchased_at": 1658399423658,

"revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"quantity": 1,

"status": "owned",

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_purchase_identifier": 12345678,

"ownership": "purchased",

"country": "US"

}`

## [tag/Purchase/operation/list-purchase-entitlements](/content/docs/api-v2\#tag/Purchase/operation/list-purchase-entitlements/index.html) Get a list of entitlements associated with a purchase

get/projects/{project\_id}/purchases/{purchase\_id}/entitlements

https://api.revenuecat.com/v2/projects/{project\_id}/purchases/{purchase\_id}/entitlements

Lists all Entitlements granted by a Purchase.
This endpoint requires the following permission(s): `customer_information:purchases:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements"

}`

## [tag/Purchase/operation/refund-purchase](/content/docs/api-v2\#tag/Purchase/operation/refund-purchase/index.html) Refund a Web Billing purchase

post/projects/{project\_id}/purchases/{purchase\_id}/actions/refund

https://api.revenuecat.com/v2/projects/{project\_id}/purchases/{purchase\_id}/actions/refund

Refund a Web Billing purchase and revoke access to associated granted entitlements.
This endpoint requires the following permission(s): `customer_information:purchases:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The purchase has been successfully refunded.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "purchase",

"id": "purch1a2b3c4d5e",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"purchased_at": 1658399423658,

"revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"quantity": 1,

"status": "owned",

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/purchases/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_purchase_identifier": 12345678,

"ownership": "purchased",

"country": "US"

}`

## [tag/Purchase/operation/search-purchases](/content/docs/api-v2\#tag/Purchase/operation/search-purchases/index.html) Search one-time purchases by store purchase identifier

get/projects/{project\_id}/purchases

https://api.revenuecat.com/v2/projects/{project\_id}/purchases

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): `customer_information:purchases:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| store\_purchase\_identifier<br>required | string \[ 1 .. 255 \] characters <br>Examples: <br>- store\_purchase\_identifier=9aJscueFTxLPZXXo-AlBTkI0OnFXR2qiH14C1aqWnOT=:3:11 \- Amazon Appstore <br>- store\_purchase\_identifier=100001234567890 \- Apple App Store<br>- store\_purchase\_identifier=txn\_01jss4bz50g1z5yw121npeb3ag \- Paddle<br>- store\_purchase\_identifier=GPA.1234-5678-9012-34567 \- Google Play Store<br>- store\_purchase\_identifier=txRcb553a54d4738816a63f1a05cfcb1723e3 \- RevenueCat Web Billing<br>- store\_purchase\_identifier=4ab8df12-3003-11f0-9646-8ac68bcdcaed \- Roku<br>- store\_purchase\_identifier=si\_Rww1psqupbKxmt \- Stripe<br>Store ID associated with the one-time purchase. |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases?starting_after=purc1a2b3c4d5e",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/purchases"

}`

## [tag/Subscription](/content/docs/api-v2\#tag/Subscription/index.html) Subscription

Operations about subscriptions.

## [tag/Subscription/operation/get-subscription](/content/docs/api-v2\#tag/Subscription/operation/get-subscription/index.html) Get a subscription

get/projects/{project\_id}/subscriptions/{subscription\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| subscription\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: sub1a2b3c4d5e<br>ID of the subscription |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "subscription",

"id": "sub1ab2c3d4e5",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"starts_at": 1658399423658,

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1658399423658,

"ends_at": 1658399423658,

"gives_access": true,

"pending_payment": true,

"auto_renewal_status": "will_renew",

"status": "trialing",

"total_revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_subscription_identifier": 12345678,

"ownership": "purchased",

"pending_changes": {"product": {"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

},

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1660991423658,

"store_subscription_identifier": 12345679,

"auto_renewal_status": "will_renew",

"status": "active",

"pending_payment": false,

"gives_access": true

},

"country": "US",

"management_url": "https://apps.apple.com/account/subscriptions"

}`

## [tag/Subscription/operation/get-play-store-or-app-store-subscription-transactions](/content/docs/api-v2\#tag/Subscription/operation/get-play-store-or-app-store-subscription-transactions/index.html) Get a Play Store or App Store subscription's transactions

get/projects/{project\_id}/subscriptions/{subscription\_id}/transactions

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/transactions

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| sort | string<br>Default: "id"<br>Enum:"id""purchased\_at"<br>Example: sort=purchased\_at<br>Column to sort the result list by. |
| direction | string<br>Default: "asc"<br>Enum:"asc""desc"<br>Example: direction=desc<br>Sort direction for the result list. |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "subscription_transaction",\
\
"id": "GPA.0000-0000-0000-00000",\
\
"purchased_at": 1658399423658,\
\
"product_store_identifier": "com.example.product",\
\
"revenue_in_local_currency": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
},\
\
"revenue_in_usd": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
},\
\
"expiration_date": 1658399423658,\
\
"effective_expiration_date": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj123/subscriptions/sub123/transactions?starting_after=GPA.0000-0000-0000-00000",

"url": "/v2/projects/proj123/subscriptions/sub123/transactions"

}`

## [tag/Subscription/operation/refund-play-store-or-galaxy-subscription-transaction](/content/docs/api-v2\#tag/Subscription/operation/refund-play-store-or-galaxy-subscription-transaction/index.html) Refund a Play Store or Galaxy subscription's transaction

post/projects/{project\_id}/subscriptions/{subscription\_id}/transactions/{transaction\_id}/actions/refund

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/transactions/{transaction\_id}/actions/refund

Refund and cancel a Play Store or Galaxy subscription's transaction. Access to the subscription will be revoked. This endpoint requires the following permission(s): `customer_information:subscriptions:read_write`. This endpoint belongs to the **Subscription Transactions Refunds** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| subscription\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: sub1a2b3c4d5e<br>ID of the subscription |
| transaction\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: GPA.000-000-000-000<br>Identifier of the transaction in the store |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "subscription_transaction",

"id": "GPA.0000-0000-0000-00000",

"purchased_at": 1658399423658,

"product_store_identifier": "com.example.product",

"revenue_in_local_currency": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"expiration_date": 1658399423658,

"effective_expiration_date": 1658399423658

}`

## [tag/Subscription/operation/list-subscription-entitlements](/content/docs/api-v2\#tag/Subscription/operation/list-subscription-entitlements/index.html) Get a list of entitlements associated with a subscription

get/projects/{project\_id}/subscriptions/{subscription\_id}/entitlements

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/entitlements

Lists all Entitlements granted by a Subscription.
This endpoint requires the following permission(s): `customer_information:subscriptions:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/entitlements?starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/entitlements"

}`

## [tag/Subscription/operation/cancel-subscription](/content/docs/api-v2\#tag/Subscription/operation/cancel-subscription/index.html) Cancel an active Web Billing subscription

post/projects/{project\_id}/subscriptions/{subscription\_id}/actions/cancel

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/actions/cancel

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): `customer_information:subscriptions:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The subscription has been successfully canceled.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "subscription",

"id": "sub1ab2c3d4e5",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"starts_at": 1658399423658,

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1658399423658,

"ends_at": 1658399423658,

"gives_access": true,

"pending_payment": true,

"auto_renewal_status": "will_renew",

"status": "trialing",

"total_revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_subscription_identifier": 12345678,

"ownership": "purchased",

"pending_changes": {"product": {"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

},

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1660991423658,

"store_subscription_identifier": 12345679,

"auto_renewal_status": "will_renew",

"status": "active",

"pending_payment": false,

"gives_access": true

},

"country": "US",

"management_url": "https://apps.apple.com/account/subscriptions"

}`

## [tag/Subscription/operation/extend-subscription](/content/docs/api-v2\#tag/Subscription/operation/extend-subscription/index.html) Extend the current billing period of a subscription

post/projects/{project\_id}/subscriptions/{subscription\_id}/actions/extend

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/actions/extend

Extend the current billing period of a subscription. Provide either `extend_by_days` to extend by a number of days, or `extend_until_ms` to extend to an absolute epoch-millisecond timestamp. Supported on Apple Store, Google Play Store, and Web Billing subscriptions. For Apple Store subscriptions, `extend_reason_code` is required and the extension is capped at 90 days.
This endpoint requires the following permission(s): `customer_information:subscriptions:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

One of

ExtendSubscriptionByDurationExtendSubscriptionUntilDate

|     |     |
| --- | --- |
| extend\_by\_days<br>required | integer >= 1 <br>Number of days to extend the current billing period by.<br>For Apple Store subscriptions, the maximum allowed value is 90. |
| extend\_reason\_code | string<br>Enum:"undeclared""customer\_satisfaction""other""service\_issue\_or\_outage"<br>Reason for the extension. Required for Apple Store subscriptions;<br>ignored for Google Play and Web Billing subscriptions. |

### Responses

**200**

Success. The subscription's current billing period has been extended.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Example

ExtendSubscriptionByDurationExtendSubscriptionUntilDateExtendSubscriptionByDuration

Copy

`{"extend_by_days": 14,

"extend_reason_code": "customer_satisfaction"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "subscription",

"id": "sub1ab2c3d4e5",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"starts_at": 1658399423658,

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1658399423658,

"ends_at": 1658399423658,

"gives_access": true,

"pending_payment": true,

"auto_renewal_status": "will_renew",

"status": "trialing",

"total_revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_subscription_identifier": 12345678,

"ownership": "purchased",

"pending_changes": {"product": {"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

},

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1660991423658,

"store_subscription_identifier": 12345679,

"auto_renewal_status": "will_renew",

"status": "active",

"pending_payment": false,

"gives_access": true

},

"country": "US",

"management_url": "https://apps.apple.com/account/subscriptions"

}`

## [tag/Subscription/operation/refund-subscription](/content/docs/api-v2\#tag/Subscription/operation/refund-subscription/index.html) Refund an active Web Billing subscription

post/projects/{project\_id}/subscriptions/{subscription\_id}/actions/refund

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/actions/refund

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): `customer_information:subscriptions:read_write`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success. The subscription has been successfully refunded.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "subscription",

"id": "sub1ab2c3d4e5",

"customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"original_customer_id": "19b8de26-77c1-49f1-aa18-019a391603e2",

"product_id": "prod1a2b3c4d5e",

"starts_at": 1658399423658,

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1658399423658,

"ends_at": 1658399423658,

"gives_access": true,

"pending_payment": true,

"auto_renewal_status": "will_renew",

"status": "trialing",

"total_revenue_in_usd": {"currency": "USD",

"gross": 9.99,

"commission": 2.99,

"tax": 0.75,

"proceeds": 6.25

},

"presented_offering_id": "ofrnge1a2b3c4d5",

"entitlements": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements?status=active&starting_after=entlab21dac",

"url": "/v2/projects/proj1ab2c3d4/subscriptions/sub1a2b3c4d5e/entitlements"

},

"environment": "production",

"store": "amazon",

"store_subscription_identifier": 12345678,

"ownership": "purchased",

"pending_changes": {"product": {"state": "active",

"object": "product",

"id": "prod1a2b3c4d5e",

"store_identifier": "rc_1w_199",

"type": "subscription",

"subscription": {"duration": "P1M",

"grace_period_duration": "P3D",

"trial_duration": "P1W"

},

"one_time": {"is_consumable": true

},

"created_at": 1658399423658,

"app_id": "app1a2b3c4",

"app": {"object": "app",

"id": "app1a2b3c4",

"name": "string",

"created_at": 1658399423658,

"type": "amazon",

"project_id": "proj1a2b3c4",

"amazon": {"package_name": "string"

}

},

"indicative_price": {"object": "indicative_price",

"currency": "USD",

"country": "US",

"amount_micros": "For 99.99, the value should be 99990000"

},

"display_name": "Premium Monthly 2023"

},

"current_period_starts_at": 1658399423658,

"current_period_ends_at": 1660991423658,

"store_subscription_identifier": 12345679,

"auto_renewal_status": "will_renew",

"status": "active",

"pending_payment": false,

"gives_access": true

},

"country": "US",

"management_url": "https://apps.apple.com/account/subscriptions"

}`

## [tag/Subscription/operation/get-authorized-subscription-management-url](/content/docs/api-v2\#tag/Subscription/operation/get-authorized-subscription-management-url/index.html) Get an authenticated subscription management URL

get/projects/{project\_id}/subscriptions/{subscription\_id}/authenticated\_management\_url

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions/{subscription\_id}/authenticated\_management\_url

Get a secure, single-use URL that allows customers to access their Web Billing customer portal.
This endpoint requires the following permission(s): `customer_information:subscriptions:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**502**

Bad gateway

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 502
- 503

Content type

application/json

Copy

`{"object": "authenticated_management_url",

"management_url": "https://billing.revenuecat.com/app1a2b3c4/sub1ab2c3d4e5?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"

}`

## [tag/Subscription/operation/search-subscriptions](/content/docs/api-v2\#tag/Subscription/operation/search-subscriptions/index.html) Search subscriptions by store subscription identifier

get/projects/{project\_id}/subscriptions

https://api.revenuecat.com/v2/projects/{project\_id}/subscriptions

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): `customer_information:subscriptions:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| store\_subscription\_identifier<br>required | string \[ 1 .. 255 \] characters <br>Examples: <br>- store\_subscription\_identifier=9aJscueFTxLPZXXo-AlBTkI0OnFXR2qiH14C1aqWnOT=:3:11..8 \- Amazon Appstore <br>- store\_subscription\_identifier=100001234567890 \- Apple App Store<br>- store\_subscription\_identifier=txn\_01jss4bz50g1z5yw121npeb3ag \- Paddle<br>- store\_subscription\_identifier=GPA.1234-5678-9012-34567..0 \- Google Play Store<br>- store\_subscription\_identifier=txRcb553a54d4738816a63f1a05cfcb1723e3..1746748685 \- RevenueCat Web Billing<br>- store\_subscription\_identifier=4ab8df12-3003-11f0-9646-8ac68bcdcaed \- Roku<br>- store\_subscription\_identifier=si\_Rww1psqupbKxmt \- Stripe<br>Store ID associated with the subscription for the current or next period. |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions?starting_after=sub1a2b3c4d",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/subscriptions"

}`

## [tag/Invoice](/content/docs/api-v2\#tag/Invoice/index.html) Invoice

Operations about invoices.

## [tag/Invoice/operation/list-customer-invoices](/content/docs/api-v2\#tag/Invoice/operation/list-customer-invoices/index.html) Get a list of the customer's invoices

get/projects/{project\_id}/customers/{customer\_id}/invoices

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/invoices

This endpoint requires the following permission(s): `customer_information:invoices:read`. This endpoint belongs to the **Customer Information** domain, which has a default rate limit of **480 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "invoice",\
\
"id": "rcbin1a2b3c4d5e",\
\
"total_amount": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
},\
\
"line_items": [{"object": "invoice.line_item",\
\
"product_identifier": "rc_1w_199",\
\
"product_display_name": "Premium Monthly 2023",\
\
"product_duration": "P1M",\
\
"quantity": 1,\
\
"unit_amount": {"currency": "USD",\
\
"gross": 9.99,\
\
"commission": 2.99,\
\
"tax": 0.75,\
\
"proceeds": 6.25\
\
}\
\
}\
\
],\
\
"issued_at": 1658399423658,\
\
"paid_at": 1658399423658,\
\
"invoice_url": "https://api.revenuecat.com/v2/projects/proj1ab2c3d4/customers/cust1ab2c3d4/invoices/inv1ab2c3d4/file"\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/invoices?starting_after=rcbin1a2b3c4d5e",

"url": "/v2/projects/proj1ab2c3d4/customers/19b8de26-77c1-49f1-aa18-019a391603e2/invoices"

}`

## [tag/Invoice/operation/get-invoice](/content/docs/api-v2\#tag/Invoice/operation/get-invoice/index.html) Get an invoice

get/projects/{project\_id}/customers/{customer\_id}/invoices/{invoice\_id}/file

https://api.revenuecat.com/v2/projects/{project\_id}/customers/{customer\_id}/invoices/{invoice\_id}/file

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| customer\_id<br>required | string \[ 1 .. 1500 \] characters <br>Example: 19b8de26-77c1-49f1-aa18-019a391603e2<br>ID of the customer |
| invoice\_id<br>required | string \[ 1 .. 1500 \] characters <br>Example: rcbin1a2b3c4d5e<br>ID of the invoice |

### Responses

**302**

File found. Needs to be downloaded from the location header

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Example

parameter\_errorinvalid\_requestparameter\_error

Copy

`{"object": "error",

"type": "parameter_error",

"param": "customer_id",

"message": "id is too long",

"retryable": false,

"doc_url": "https://errors.rev.cat/parameter-error"

}`

## [tag/Paywall](/content/docs/api-v2\#tag/Paywall/index.html) Paywall

Operations about paywalls.

## [tag/Paywall/operation/create-media-asset](/content/docs/api-v2\#tag/Paywall/operation/create-media-asset/index.html) Upload a media asset

post/projects/{project\_id}/media\_assets

https://api.revenuecat.com/v2/projects/{project\_id}/media\_assets

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| filename<br>required | string \[ 1 .. 255 \] characters <br>File name for the uploaded image. |
| content\_type<br>required | string<br>Enum:"image/jpeg""image/png""image/avif""image/heic""image/heif""image/webp"<br>MIME type for the uploaded image. |
| file\_data\_base64<br>required | string \[ 1 .. 2796204 \] characters <br>Base64-encoded image bytes. |

### Responses

**201**

Success. The media asset was uploaded.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"filename": "hero.webp",

"content_type": "image/webp",

"file_data_base64": "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "media_asset",

"id": "mediaasset123456789abcdef",

"object_name": "paywalls/originals/abc123.webp",

"original_name": "hero.webp",

"original_size": 12345,

"original_width": 1024,

"original_height": 1024,

"formats": {"property1": {"object": "media_asset_format",

"object_name": "paywalls/abc123.webp",

"size": 12345,

"width": 1024,

"height": 1024

},

"property2": {"object": "media_asset_format",

"object_name": "paywalls/abc123.webp",

"size": 12345,

"width": 1024,

"height": 1024

}

},

"alt_text": "A dog looking at a phone",

"is_decorative": false,

"asset_base_url": "https://paywalls-assets.revenuecat.com",

"asset_type": "image",

"video_metadata": { },

"transcoding_status": null

}`

## [tag/Paywall/operation/list-paywalls](/content/docs/api-v2\#tag/Paywall/operation/list-paywalls/index.html) Get a list of paywalls

get/projects/{project\_id}/paywalls

https://api.revenuecat.com/v2/projects/{project\_id}/paywalls

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Value:"items.offering"<br>Example: expand=items.offering<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `items.offering` (requires `project_configuration:offerings:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "paywall",\
\
"id": "pw123456789abcdef",\
\
"name": "My Awesome Paywall",\
\
"offering_id": "ofrng123456789a",\
\
"created_at": 1658399423658,\
\
"published_at": 1658399423958,\
\
"automatically_scale_font_size": true,\
\
"offering": {"state": "active",\
\
"object": "offering",\
\
"id": "ofrnge1a2b3c4d5",\
\
"lookup_key": "default",\
\
"display_name": "The standard set of packages",\
\
"is_current": true,\
\
"created_at": 1658399423658,\
\
"project_id": "proj1ab2c3d4",\
\
"metadata": {"color": "blue",\
\
"call_to_action": "Subscribe Now!"\
\
},\
\
"packages": {"object": "list",\
\
"items": [{"object": "package",\
\
"id": "pkge1a2b3c4d5",\
\
"lookup_key": "monthly",\
\
"display_name": "Monthly discounted with 3-day trial",\
\
"position": 1,\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"product": null,\
\
"eligibility_criteria": null\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"\
\
}\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"\
\
}\
\
},\
\
"components": {"published": {"revision": 1,\
\
"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",\
\
"type": "stack",\
\
"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]\
\
},\
\
"sticky_footer": {"id": "UJJRRPzRuz",\
\
"type": "footer"\
\
}\
\
}\
\
},\
\
"default_locale": "en_US",\
\
"components_localizations": {"en_US": {"title": "Premium"\
\
}\
\
},\
\
"automatically_scale_font_size": true,\
\
"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"\
\
}\
\
}\
\
},\
\
"draft": {"revision": 1,\
\
"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",\
\
"type": "stack",\
\
"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]\
\
},\
\
"sticky_footer": {"id": "UJJRRPzRuz",\
\
"type": "footer"\
\
}\
\
}\
\
},\
\
"default_locale": "en_US",\
\
"components_localizations": {"en_US": {"title": "Premium"\
\
}\
\
},\
\
"automatically_scale_font_size": true,\
\
"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"\
\
}\
\
}\
\
}\
\
}\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/paywalls?starting_after=pwXXXXXXXXXXXXXX",

"url": "/v2/projects/proj1ab2c3d4/paywalls"

}`

## [tag/Paywall/operation/create-paywall](/content/docs/api-v2\#tag/Paywall/operation/create-paywall/index.html) Create a paywall

post/projects/{project\_id}/paywalls

https://api.revenuecat.com/v2/projects/{project\_id}/paywalls

Create a paywall draft for a project. You can either use the offering template shortcut or provide full draft components directly.
This endpoint requires the following permission(s): `project_configuration:offerings:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

One of

objectobject

|     |     |
| --- | --- |
| offering\_id<br>required | string \[ 1 .. 200 \] characters <br>The ID of the offering the paywall will be created for. |
| automatically\_scale\_font\_size | boolean<br>Default: true<br>Whether font sizes should automatically scale for this paywall. Defaults to true. |

### Responses

**201**

Success. The paywall was created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"offering_id": "ofrng123456789a",

"name": "Main Paywall",

"components_config": {"base": {"stack": {"id": "main_stack",

"type": "stack",

"components": [ ]

}

}

},

"components_localizations": {"en_US": {"title": "Premium"

}

},

"default_locale": "en_US",

"automatically_scale_font_size": true

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "paywall",

"id": "pw123456789abcdef",

"name": "My Awesome Paywall",

"offering_id": "ofrng123456789a",

"created_at": 1658399423658,

"published_at": 1658399423958,

"automatically_scale_font_size": true,

"offering": {"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"items": [{"object": "package",\
\
"id": "pkge1a2b3c4d5",\
\
"lookup_key": "monthly",\
\
"display_name": "Monthly discounted with 3-day trial",\
\
"position": 1,\
\
"created_at": 1658399423658,\
\
"products": {"object": "list",\
\
"items": [{"product": {"state": "active",\
\
"object": "product",\
\
"id": "prod1a2b3c4d5e",\
\
"store_identifier": "rc_1w_199",\
\
"type": "subscription",\
\
"subscription": {"duration": null,\
\
"grace_period_duration": null,\
\
"trial_duration": null\
\
},\
\
"one_time": {"is_consumable": null\
\
},\
\
"created_at": 1658399423658,\
\
"app_id": "app1a2b3c4",\
\
"app": {"object": null,\
\
"id": null,\
\
"name": null,\
\
"created_at": null,\
\
"type": null,\
\
"project_id": null,\
\
"amazon": { }\
\
},\
\
"indicative_price": {"object": null,\
\
"currency": null,\
\
"country": null,\
\
"amount_micros": null\
\
},\
\
"display_name": "Premium Monthly 2023"\
\
},\
\
"eligibility_criteria": "all"\
\
}\
\
],\
\
"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products?starting_after=prodab21dac",\
\
"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages/pkge1a2b3c4d5/products"\
\
}\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

},

"components": {"published": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

},

"draft": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

}

}

}`

## [tag/Paywall/operation/get-paywall](/content/docs/api-v2\#tag/Paywall/operation/get-paywall/index.html) Get a paywall

get/projects/{project\_id}/paywalls/{paywall\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/paywalls/{paywall\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| paywall\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: pwXXXXXXXXXXXXXX<br>ID of the paywall |

##### query Parameters

|     |     |
| --- | --- |
| expand | Array of strings\[ items \[ 1 .. 5000 \] characters  \]<br>Items Enum:"offering""components"<br>Example: expand=offering<br>Specifies which fields in the response should be expanded.<br>Accepted values are: `offering` (requires `project_configuration:offerings:read` permission), `components` (requires `project_configuration:offerings:read` permission). |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "paywall",

"id": "pw123456789abcdef",

"name": "My Awesome Paywall",

"offering_id": "ofrng123456789a",

"created_at": 1658399423658,

"published_at": 1658399423958,

"automatically_scale_font_size": true,

"offering": {"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

},

"components": {"published": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

},

"draft": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

}

}

}`

## [tag/Paywall/operation/update-paywall](/content/docs/api-v2\#tag/Paywall/operation/update-paywall/index.html) Update a paywall draft

patch/projects/{project\_id}/paywalls/{paywall\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/paywalls/{paywall\_id}

Update a paywall draft. If the paywall is already published, this updates its draft version without changing the published version.
This endpoint requires the following permission(s): `project_configuration:offerings:read_write`. This endpoint belongs to the **Project Configuration** domain, which has a default rate limit of **60 requests per minute**.

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| revision<br>required | integer<br>The current draft revision. Used to reject stale writes. |
| components\_config<br>required | object<br>The raw paywall components configuration to save as the draft. |
| |     |     |
| --- | --- |
| property name\*<br>additional property | any | |
| components\_localizations<br>required | object<br>Localized component values keyed by locale. |
| |     |     |
| --- | --- |
| property name\*<br>additional property | object |
| |     |     |
| --- | --- |
| property name\*<br>additional property | any | | |
| default\_locale<br>required | string \[ 1 .. 255 \] characters <br>The default locale for this paywall. |
| name | string or null \[ 1 .. 255 \] characters <br>Optional paywall name. |
| automatically\_scale\_font\_size | boolean<br>Whether font sizes should automatically scale for this paywall draft. |

### Responses

**200**

Success. The paywall draft was updated.

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"revision": 1,

"components_config": {"base": {"stack": {"id": "main_stack",

"type": "stack",

"components": [ ]

}

}

},

"components_localizations": {"en_US": {"title": "Premium"

}

},

"default_locale": "en_US",

"name": "Main Paywall",

"automatically_scale_font_size": true

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "paywall",

"id": "pw123456789abcdef",

"name": "My Awesome Paywall",

"offering_id": "ofrng123456789a",

"created_at": 1658399423658,

"published_at": 1658399423958,

"automatically_scale_font_size": true,

"offering": {"state": "active",

"object": "offering",

"id": "ofrnge1a2b3c4d5",

"lookup_key": "default",

"display_name": "The standard set of packages",

"is_current": true,

"created_at": 1658399423658,

"project_id": "proj1ab2c3d4",

"metadata": {"color": "blue",

"call_to_action": "Subscribe Now!"

},

"packages": {"object": "list",

"next_page": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages?starting_after=pkgeab21dac",

"url": "/v2/projects/proj1ab2c3d4/offerings/ofrnge1a2b3c4d5/packages"

}

},

"components": {"published": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

},

"draft": {"revision": 1,

"components_config": {"base": {"stack": {"id": "l7Ylx2UZeA",

"type": "stack",

"components": [{"id": "LFVZUCf9yW",\
\
"type": "text",\
\
"text_lid": "OBUxLwsvXb"\
\
}\
\
]

},

"sticky_footer": {"id": "UJJRRPzRuz",

"type": "footer"

}

}

},

"default_locale": "en_US",

"components_localizations": {"en_US": {"title": "Premium"

}

},

"automatically_scale_font_size": true,

"fonts": {"CustomFont": {"src": "https://example.com/font.ttf"

}

}

}

}

}`

## [tag/Paywall/operation/delete-paywall](/content/docs/api-v2\#tag/Paywall/operation/delete-paywall/index.html) Delete a paywall

delete/projects/{project\_id}/paywalls/{paywall\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/paywalls/{paywall\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Integration](/content/docs/api-v2\#tag/Integration/index.html) Integration

Operations about integrations.

## [tag/Integration/operation/list-webhook-integrations](/content/docs/api-v2\#tag/Integration/operation/list-webhook-integrations/index.html) List webhook integrations

get/projects/{project\_id}/integrations/webhooks

https://api.revenuecat.com/v2/projects/{project\_id}/integrations/webhooks

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "webhook_integration",\
\
"id": "wh_1234567890abcdef",\
\
"project_id": "proj_1234567890abcdef",\
\
"name": "Customer updates webhook",\
\
"url": "https://hooks.example.com/revenuecat",\
\
"environment": "production",\
\
"event_types": ["initial_purchase"\
\
],\
\
"app_id": "app_1234567890abcdef",\
\
"created_at": 1658399423658\
\
}\
\
],

"next_page": "/v2/projects/proj1ab2c3d4/integrations/webhooks?starting_after=whintgr1a2b3c4d",

"url": "/v2/projects/proj1ab2c3d4/integrations/webhooks"

}`

## [tag/Integration/operation/create-webhook-integration](/content/docs/api-v2\#tag/Integration/operation/create-webhook-integration/index.html) Create a webhook integration

post/projects/{project\_id}/integrations/webhooks

https://api.revenuecat.com/v2/projects/{project\_id}/integrations/webhooks

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

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |

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

|     |     |
| --- | --- |
| name<br>required | string \[ 1 .. 1500 \] characters <br>The display name of the webhook integration |
| url<br>required | string <uri>  <= 5000 characters <br>The URL RevenueCat will send webhook notifications to |
| authorization\_header | string or null <= 5000 characters <br>Optional authorization header that will be sent with webhook notifications |
| environment | string or null<br>Enum:"production""sandbox"null<br>The environment the webhook integration is configured for |
| event\_types | Array of strings or null (WebhookEventType) <br>Enum:"initial\_purchase""renewal""product\_change""cancellation""billing\_issue""non\_renewing\_purchase""uncancellation""transfer""subscription\_paused""expiration"… 5 more<br>Event types that will trigger the webhook |
| app\_id | string or null \[ 1 .. 255 \] characters <br>The ID of the app the webhook integration is scoped to |

### Responses

**201**

Webhook integration created

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"name": "Customer updates webhook",

"url": "https://hooks.example.com/revenuecat",

"authorization_header": "Bearer 123456",

"environment": "production",

"event_types": ["initial_purchase"\
\
],

"app_id": "app_1234567890abcdef"

}`

### Response samples

- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "webhook_integration",

"id": "wh_1234567890abcdef",

"project_id": "proj_1234567890abcdef",

"name": "Customer updates webhook",

"url": "https://hooks.example.com/revenuecat",

"environment": "production",

"event_types": ["initial_purchase"\
\
],

"app_id": "app_1234567890abcdef",

"created_at": 1658399423658

}`

## [tag/Integration/operation/get-webhook-integration](/content/docs/api-v2\#tag/Integration/operation/get-webhook-integration/index.html) Get a webhook integration

get/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

|     |     |
| --- | --- |
| project\_id<br>required | string <= 255 characters <br>Example: proj1ab2c3d4<br>ID of the project |
| webhook\_integration\_id<br>required | string \[ 1 .. 255 \] characters <br>Example: wh\_1234567890abcdef<br>The ID of the webhook integration |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "webhook_integration",

"id": "wh_1234567890abcdef",

"project_id": "proj_1234567890abcdef",

"name": "Customer updates webhook",

"url": "https://hooks.example.com/revenuecat",

"environment": "production",

"event_types": ["initial_purchase"\
\
],

"app_id": "app_1234567890abcdef",

"created_at": 1658399423658

}`

## [tag/Integration/operation/update-webhook-integration](/content/docs/api-v2\#tag/Integration/operation/update-webhook-integration/index.html) Update a webhook integration

post/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

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

|     |     |
| --- | --- |
| name | string \[ 1 .. 1500 \] characters <br>The display name of the webhook integration |
| url | string <uri>  <= 5000 characters <br>The URL RevenueCat will send webhook notifications to |
| authorization\_header | string or null <= 5000 characters <br>Optional authorization header that will be sent with webhook notifications |
| environment | string or null<br>Enum:"production""sandbox"null<br>The environment the webhook integration is configured for |
| event\_types | Array of strings or null (WebhookEventType) <br>Enum:"initial\_purchase""renewal""product\_change""cancellation""billing\_issue""non\_renewing\_purchase""uncancellation""transfer""subscription\_paused""expiration"… 5 more<br>Event types that will trigger the webhook |
| app\_id | string or null \[ 1 .. 255 \] characters <br>The ID of the app the webhook integration is scoped to |

### Responses

**200**

Webhook integration updated

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy
Expand all  Collapse all

`{"name": "Customer updates webhook",

"url": "https://hooks.example.com/revenuecat",

"authorization_header": "Bearer 123456",

"environment": "production",

"event_types": ["initial_purchase"\
\
],

"app_id": "app_1234567890abcdef"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "webhook_integration",

"id": "wh_1234567890abcdef",

"project_id": "proj_1234567890abcdef",

"name": "Customer updates webhook",

"url": "https://hooks.example.com/revenuecat",

"environment": "production",

"event_types": ["initial_purchase"\
\
],

"app_id": "app_1234567890abcdef",

"created_at": 1658399423658

}`

## [tag/Integration/operation/delete-webhook-integration](/content/docs/api-v2\#tag/Integration/operation/delete-webhook-integration/index.html) Delete a webhook integration

delete/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

https://api.revenuecat.com/v2/projects/{project\_id}/integrations/webhooks/{webhook\_integration\_id}

##### Authorizations:

_BearerAuth_

##### path Parameters

### Responses

**200**

Webhook integration deleted

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "app",

"id": "string",

"deleted_at": 1658399423658

}`

## [tag/Project](/content/docs/api-v2\#tag/Project/index.html) Project

Operations about projects.

## [tag/Project/operation/list-projects](/content/docs/api-v2\#tag/Project/operation/list-projects/index.html) Get a list of projects

get/projects

https://api.revenuecat.com/v2/projects

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

##### Authorizations:

_BearerAuth_

##### query Parameters

|     |     |
| --- | --- |
| starting\_after | string<br>Example: starting\_after=ent12354 |
| limit | integer<br>Default: 20<br>Example: limit=10 |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

- 200
- 400
- 401
- 403
- 404
- 423
- 429
- 500
- 503

Content type

application/json

Copy
Expand all  Collapse all

`{"object": "list",

"items": [{"object": "project",\
\
"id": "proj1ab2c3d4",\
\
"name": "MagicWeather",\
\
"created_at": 1658399423658,\
\
"icon_url": "https://www.appatar.io/abc123/small",\
\
"icon_url_large": "https://www.appatar.io/abc123/large"\
\
}\
\
],

"next_page": "/v2/projects?starting_after=projab21dac",

"url": "/v2/projects"

}`

## [tag/Project/operation/create-project](/content/docs/api-v2\#tag/Project/operation/create-project/index.html) Creates a new project

post/projects

https://api.revenuecat.com/v2/projects

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

##### Authorizations:

_BearerAuth_

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

|     |     |
| --- | --- |
| name<br>required | string \[ 1 .. 255 \] characters <br>The name of the project |

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**409**

Conflict

**422**

Unprocessable entity

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Request samples

- Payload

Content type

application/json

Copy

`{"name": "string"

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 423
- 429
- 500
- 503

Content type

application/json

Copy

`{"object": "project",

"id": "proj1ab2c3d4",

"name": "MagicWeather",

"created_at": 1658399423658,

"icon_url": "https://www.appatar.io/abc123/small",

"icon_url_large": "https://www.appatar.io/abc123/large"

}`
