---
title: "Paywall Publishing & Assets"
permalink: "/docs/api-v2/paywall/publishing"
original_source: "openapi-spec/api-v2.yaml"
---

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

# Paywall Publishing & Assets

## Paywall

Operations about paywalls.

### Get a list of fonts

`GET /projects/{project_id}/fonts`

Operation ID: `list-fonts`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `starting_after` | query | no | Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page. |
| `limit` | query | no | Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected. |

**Responses**

- `200` — Success
- `400` — Bad request
- `401` — Unauthorized
- `403` — Access denied
- `404` — Not found
- `423` — Locked
- `429` — The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.
- `500` — Internal server error
- `503` — Internal server error

**Response `200` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. Always has the value `list`. One of: `list` |
| `items` | array of Font | yes | Details about each object. |
| `next_page` | string | yes | URL to access the next page of the project's fonts. If not present / null, there is no next page |
| `url` | string | yes | The URL where this list can be accessed. |

<details><summary><code>items</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `font` |
| `id` | string | yes | The ID of the font. |
| `name` | string | yes | The PostScript name of the font. |
| `family_name` | string | yes | The font family name. |
| `style` | string | yes | The font style. One of: `normal`, `italic` |
| `weight` | integer | yes | The font weight. |
| `url` | string | yes | The URL where the font file is hosted. |
| `font_key` | string | yes | The key that identifies this font in a paywall's components config. |

</details>
### Upload a font

`POST /projects/{project_id}/fonts`

Operation ID: `create-font`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |

**Request body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `filename` | string | yes | File name for the uploaded font. Must have a .ttf or .otf extension. |
| `content_type` | string | yes | MIME type for the uploaded font. One of: `font/ttf`, `font/otf` |
| `file_data_base64` | string | yes | Base64-encoded font bytes. |

**Responses**

- `201` — Success. The font 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

**Response `201` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `font` |
| `id` | string | yes | The ID of the font. |
| `name` | string | yes | The PostScript name of the font. |
| `family_name` | string | yes | The font family name. |
| `style` | string | yes | The font style. One of: `normal`, `italic` |
| `weight` | integer | yes | The font weight. |
| `url` | string | yes | The URL where the font file is hosted. |
| `font_key` | string | yes | The key that identifies this font in a paywall's components config. |

### Get a list of media assets

`GET /projects/{project_id}/media_assets`

Operation ID: `list-media-assets`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `starting_after` | query | no | Pagination cursor. Pass the id of the last item from the previous page to fetch the next page; omit for the first page. |
| `limit` | query | no | Maximum number of items to return per page. Values below 1 or above 100 are clamped to that range rather than rejected. |

**Responses**

- `200` — Success
- `400` — Bad request
- `401` — Unauthorized
- `403` — Access denied
- `404` — Not found
- `423` — Locked
- `429` — The request could not be completed because the rate limiting domain for this endpoint is currently at its limit for this project.
- `500` — Internal server error
- `503` — Internal server error

**Response `200` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. Always has the value `list`. One of: `list` |
| `items` | array of MediaAsset | yes | Details about each object. |
| `next_page` | string | yes | URL to access the next page of the project's media assets. If not present / null, there is no next page |
| `url` | string | yes | The URL where this list can be accessed. |

<details><summary><code>items</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `media_asset` |
| `id` | string | yes | The ID of the media asset. |
| `object_name` | string | yes | The storage object name for the original asset. |
| `original_name` | string | yes | The uploaded file name. |
| `original_size` | integer | yes | The original file size in kilobytes. |
| `original_width` | integer | yes | The original image width in pixels. |
| `original_height` | integer | yes | The original image height in pixels. |
| `formats` | object | yes | Rendered image formats keyed by format name. |
| `alt_text` | string | yes | Alt text for the asset. |
| `is_decorative` | boolean | yes | Whether this asset is decorative. |
| `asset_base_url` | string | yes | The base URL where asset object names can be resolved. |
| `asset_type` | string | yes | The media asset type. One of: `image`, `video` |
| `video_metadata` | object | yes | Video metadata, if this is a video asset. |
| `transcoding_status` | string | yes | The video transcoding status, if this is a video asset. |

</details>
### Upload a media asset

`POST /projects/{project_id}/media_assets`

Operation ID: `create-media-asset`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |

**Request body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `filename` | string | yes | File name for the uploaded image. |
| `content_type` | string | yes | MIME type for the uploaded image. One of: `image/jpeg`, `image/png`, `image/avif`, `image/heic`, `image/heif`, `image/webp` |
| `file_data_base64` | string | yes | 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

**Response `201` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `media_asset` |
| `id` | string | yes | The ID of the media asset. |
| `object_name` | string | yes | The storage object name for the original asset. |
| `original_name` | string | yes | The uploaded file name. |
| `original_size` | integer | yes | The original file size in kilobytes. |
| `original_width` | integer | yes | The original image width in pixels. |
| `original_height` | integer | yes | The original image height in pixels. |
| `formats` | object | yes | Rendered image formats keyed by format name. |
| `alt_text` | string | yes | Alt text for the asset. |
| `is_decorative` | boolean | yes | Whether this asset is decorative. |
| `asset_base_url` | string | yes | The base URL where asset object names can be resolved. |
| `asset_type` | string | yes | The media asset type. One of: `image`, `video` |
| `video_metadata` | object | yes | Video metadata, if this is a video asset. |
| `transcoding_status` | string | yes | The video transcoding status, if this is a video asset. |

### Duplicate a paywall

`POST /projects/{project_id}/paywalls/{paywall_id}/actions/duplicate`

Operation ID: `duplicate-paywall`

Duplicate an existing paywall's current draft into a new, unpublished paywall in the same project. By default the duplicated paywall is not attached to an offering; provide an offering to also duplicate the source paywall's offering (packages only) and attach the new paywall to it. This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `paywall_id` | path | yes | ID of the paywall |

**Request body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no | Optional name for the duplicated paywall. Defaults to the original paywall's name with a "Copy" suffix. |
| `offering` | object | no | Optional. When provided, the source paywall's offering is duplicated (packages only, without its own checkout config or paywall) and the duplicated paywall is attached to it. Omit to leave the duplicated paywall detached from any offering. Fails with a conflict if the source paywall is not associated with an offering. |

<details><summary><code>offering</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `lookup_key` | string | yes | The custom identifier of the duplicated offering |
| `display_name` | string | yes | The display name of the duplicated offering |

</details>
**Responses**

- `201` — Success. The paywall was duplicated.
- `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 `201` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `paywall` |
| `id` | string | yes | The id of the paywall |
| `name` | string | yes | The name of the paywall |
| `offering_id` | string | yes | The ID of the offering the paywall is for. |
| `created_at` | integer | yes | The date the paywall was created at in ms since epoch |
| `published_at` | integer | yes | The date the paywall was published at in ms since epoch |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `offering` | Offering | no |  |
| `components` | PaywallComponents | no |  |

<details><summary><code>offering</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `state` | string | yes | Whether the offering is active or inactive (archived). Inactive offerings are not returned by the SDK. One of: `active`, `inactive` |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `offering` |
| `id` | string | yes | The id of the offering |
| `lookup_key` | string | yes | A custom identifier of the entitlement |
| `display_name` | string | yes | The display name of the offering |
| `is_current` | boolean | yes | Indicates if the offering is the current offering |
| `created_at` | integer | yes | The date the offering was created at in ms since epoch |
| `project_id` | string | yes | ID of the project to which the offering belongs |
| `paywall_id` | string | yes | ID of the v2-visible paywall attached to this offering, or null if none. |
| `metadata` | OfferingMetadata | no | Custom metadata of the offering |
| `packages` | object | no |  |

<details><summary><code>packages</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. Always has the value `list`. One of: `list` |
| `items` | array of Package | yes | Details about each object. |
| `next_page` | string | yes | URL to access the next page of the Offering's packages. If not present / null, there is no next page |
| `url` | string | yes | The URL where this list can be accessed. |

</details>
</details>

<details><summary><code>components</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `published` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |
| `draft` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |

<details><summary><code>published</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>

<details><summary><code>draft</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>
</details>
### Publish a paywall

`POST /projects/{project_id}/paywalls/{paywall_id}/actions/publish`

Operation ID: `publish-paywall`

Publish the current paywall draft so RevenueCat SDKs can serve it to customers. This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `paywall_id` | path | yes | ID of the paywall |

**Responses**

- `200` — Success. The paywall draft was published.
- `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 `200` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `paywall` |
| `id` | string | yes | The id of the paywall |
| `name` | string | yes | The name of the paywall |
| `offering_id` | string | yes | The ID of the offering the paywall is for. |
| `created_at` | integer | yes | The date the paywall was created at in ms since epoch |
| `published_at` | integer | yes | The date the paywall was published at in ms since epoch |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `offering` | Offering | no |  |
| `components` | PaywallComponents | no |  |

<details><summary><code>offering</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `state` | string | yes | Whether the offering is active or inactive (archived). Inactive offerings are not returned by the SDK. One of: `active`, `inactive` |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `offering` |
| `id` | string | yes | The id of the offering |
| `lookup_key` | string | yes | A custom identifier of the entitlement |
| `display_name` | string | yes | The display name of the offering |
| `is_current` | boolean | yes | Indicates if the offering is the current offering |
| `created_at` | integer | yes | The date the offering was created at in ms since epoch |
| `project_id` | string | yes | ID of the project to which the offering belongs |
| `paywall_id` | string | yes | ID of the v2-visible paywall attached to this offering, or null if none. |
| `metadata` | OfferingMetadata | no | Custom metadata of the offering |
| `packages` | object | no |  |

<details><summary><code>packages</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. Always has the value `list`. One of: `list` |
| `items` | array of Package | yes | Details about each object. |
| `next_page` | string | yes | URL to access the next page of the Offering's packages. If not present / null, there is no next page |
| `url` | string | yes | The URL where this list can be accessed. |

</details>
</details>

<details><summary><code>components</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `published` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |
| `draft` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |

<details><summary><code>published</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>

<details><summary><code>draft</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>
</details>
### Unpublish a paywall

`POST /projects/{project_id}/paywalls/{paywall_id}/actions/unpublish`

Operation ID: `unpublish-paywall`

Unpublish the current paywall so RevenueCat SDKs stop serving it to customers. This endpoint requires the following permission(s): <code>project_configuration:offerings:read_write</code>. This endpoint belongs to the <strong>Project Configuration</strong> domain, which has a default rate limit of <strong>60 requests per minute</strong>.

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `paywall_id` | path | yes | ID of the paywall |

**Responses**

- `200` — Success. The paywall was unpublished.
- `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 `200` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `paywall` |
| `id` | string | yes | The id of the paywall |
| `name` | string | yes | The name of the paywall |
| `offering_id` | string | yes | The ID of the offering the paywall is for. |
| `created_at` | integer | yes | The date the paywall was created at in ms since epoch |
| `published_at` | integer | yes | The date the paywall was published at in ms since epoch |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `offering` | Offering | no |  |
| `components` | PaywallComponents | no |  |

<details><summary><code>offering</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `state` | string | yes | Whether the offering is active or inactive (archived). Inactive offerings are not returned by the SDK. One of: `active`, `inactive` |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `offering` |
| `id` | string | yes | The id of the offering |
| `lookup_key` | string | yes | A custom identifier of the entitlement |
| `display_name` | string | yes | The display name of the offering |
| `is_current` | boolean | yes | Indicates if the offering is the current offering |
| `created_at` | integer | yes | The date the offering was created at in ms since epoch |
| `project_id` | string | yes | ID of the project to which the offering belongs |
| `paywall_id` | string | yes | ID of the v2-visible paywall attached to this offering, or null if none. |
| `metadata` | OfferingMetadata | no | Custom metadata of the offering |
| `packages` | object | no |  |

<details><summary><code>packages</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. Always has the value `list`. One of: `list` |
| `items` | array of Package | yes | Details about each object. |
| `next_page` | string | yes | URL to access the next page of the Offering's packages. If not present / null, there is no next page |
| `url` | string | yes | The URL where this list can be accessed. |

</details>
</details>

<details><summary><code>components</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `published` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |
| `draft` | PaywallComponentsVersion | yes | A specific version (published or draft) of a paywall's components configuration. |

<details><summary><code>published</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>

<details><summary><code>draft</code></summary>

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `revision` | integer | yes | The revision number of this version. |
| `components_config` | object | yes | The raw, schemaless JSON payload for paywall components configuration. |
| `default_locale` | string | yes | The default locale for the paywall. |
| `components_localizations` | object | yes | Localized values keyed by locale code. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall. |
| `fonts` | object | no | Font objects used by the published paywall components. Only present on published versions. |

</details>
</details>
### Create a paywall version

`POST /projects/{project_id}/paywalls/{paywall_id}/versions`

Operation ID: `create-paywall-version`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `paywall_id` | path | yes | ID of the paywall |

**Request body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | yes | A human-readable name for the paywall version snapshot. |

**Responses**

- `201` — Success. The paywall version 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

**Response `201` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `paywall_version` |
| `id` | string | yes | The id of the paywall version. |
| `name` | string | yes | The name of the paywall version. |
| `revision` | integer | yes | The paywall revision captured by this version. |
| `created_at` | integer | yes | The date the paywall version was created at in ms since epoch. |
| `components_config` | object | yes | The raw paywall components configuration captured by this version. |
| `components_localizations` | object | yes | Localized component values keyed by locale. |
| `default_locale` | string | yes | The default locale captured by this version. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall version. |
| `exit_offers` | object | yes | Exit offer configuration captured by this version. |
| `state_declarations` | object | yes | State declarations captured by this version. |
| `play_store_product_change_mode` | object | yes | Play Store product change mode configuration captured by this version. |

### Get a paywall version

`GET /projects/{project_id}/paywalls/{paywall_id}/versions/{version_id}`

Operation ID: `get-paywall-version`

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

**Parameters**

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `project_id` | path | yes | ID of the project |
| `paywall_id` | path | yes | ID of the paywall |
| `version_id` | path | yes | The id of the paywall version. |

**Responses**

- `200` — Success. The paywall version was returned.
- `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 `200` body**

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | String representing the object's type. Objects of the same type share the same value. One of: `paywall_version` |
| `id` | string | yes | The id of the paywall version. |
| `name` | string | yes | The name of the paywall version. |
| `revision` | integer | yes | The paywall revision captured by this version. |
| `created_at` | integer | yes | The date the paywall version was created at in ms since epoch. |
| `components_config` | object | yes | The raw paywall components configuration captured by this version. |
| `components_localizations` | object | yes | Localized component values keyed by locale. |
| `default_locale` | string | yes | The default locale captured by this version. |
| `automatically_scale_font_size` | boolean | yes | Whether font sizes should automatically scale for this paywall version. |
| `exit_offers` | object | yes | Exit offer configuration captured by this version. |
| `state_declarations` | object | yes | State declarations captured by this version. |
| `play_store_product_change_mode` | object | yes | Play Store product change mode configuration captured by this version. |

