---
title: "Paywall Fonts & Media"
permalink: "/docs/api-v2/paywall/assets"
description: "Open API Reference Docs for the API"
original_source: "openapi-spec/api-v2.yaml"
---

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


# Developer API (2.0.0)

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

## <a id="tag/Paywall"></a>Paywall Fonts & Media

Part of the [REST API v2 Reference](/docs/api-v2). More Paywall endpoints: [Paywall](/docs/api-v2/paywall), [Paywall Publishing](/docs/api-v2/paywall/publishing).

Operations about paywalls.

#### Endpoints

-   [Get a list of fonts](#tag/Paywall/operation/list-fonts) — `GET /projects/{project_id}/fonts`
-   [Upload a font](#tag/Paywall/operation/create-font) — `POST /projects/{project_id}/fonts`
-   [Get a list of media assets](#tag/Paywall/operation/list-media-assets) — `GET /projects/{project_id}/media_assets`
-   [Upload a media asset](#tag/Paywall/operation/create-media-asset) — `POST /projects/{project_id}/media_assets`

## <a id="tag/Paywall/operation/list-fonts"></a>Get a list of fonts

get/projects/{project_id}/fonts

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

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` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### query Parameters

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

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "font",
      "id": "font123456789abcdef",
      "name": "GoodSans-Bold",
      "family_name": "Good Sans",
      "style": "normal",
      "weight": 700,
      "url": "https://fonts.revenuecat.com/1_abc123_def456.ttf",
      "font_key": "RCFM:1_font123456789abcdef:GoodSans-Bold"
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/fonts?starting_after=font123456789abcdef",
  "url": "/v2/projects/proj1ab2c3d4/fonts"
}
```

## <a id="tag/Paywall/operation/create-font"></a>Upload a font

post/projects/{project_id}/fonts

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

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` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

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

required

- `filename` (required): string [ 1 .. 255 ] characters — File name for the uploaded font. Must have a .ttf or .otf extension.
- `content_type` (required): string Enum: "font/ttf" "font/otf" — MIME type for the uploaded font.
- `file_data_base64` (required): string [ 1 .. 6990508 ] characters — 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

### Request samples

Content type

application/json

```json
{
  "filename": "GoodSans-Bold.ttf",
  "content_type": "font/ttf",
  "file_data_base64": "AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAaVsyKAAABHA"
}
```

### Response samples

Content type

application/json

```json
{
  "object": "font",
  "id": "font123456789abcdef",
  "name": "GoodSans-Bold",
  "family_name": "Good Sans",
  "style": "normal",
  "weight": 700,
  "url": "https://fonts.revenuecat.com/1_abc123_def456.ttf",
  "font_key": "RCFM:1_font123456789abcdef:GoodSans-Bold"
}
```

## <a id="tag/Paywall/operation/list-media-assets"></a>Get a list of media assets

get/projects/{project_id}/media_assets

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

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` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

##### query Parameters

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

### Responses

**200**

Success

**400**

Bad request

**401**

Unauthorized

**403**

Access denied

**404**

Not found

**423**

Locked

**429**

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

**500**

Internal server error

**503**

Internal server error

### Response samples

Content type

application/json

 

```json
{
  "object": "list",
  "items": [
    {
      "object": "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
    }
  ],
  "next_page": "/v2/projects/proj1ab2c3d4/media_assets?starting_after=mediaasset123456789abcdef",
  "url": "/v2/projects/proj1ab2c3d4/media_assets"
}
```

## <a id="tag/Paywall/operation/create-media-asset"></a>Upload a media asset

post/projects/{project_id}/media_assets

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

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` (required): string <= 255 characters Example: proj1ab2c3d4 — ID of the project

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

required

- `filename` (required): string [ 1 .. 255 ] characters — File name for the uploaded image.
- `content_type` (required): string Enum: "image/jpeg" "image/png" "image/avif" "image/heic" "image/heif" "image/webp" — MIME type for the uploaded image.
- `file_data_base64` (required): string [ 1 .. 2796204 ] characters — 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

Content type

application/json

```json
{
  "filename": "hero.webp",
  "content_type": "image/webp",
  "file_data_base64": "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA"
}
```

### Response samples

Content type

application/json

 

```json
{
  "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
}
```

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

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

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

## Response schema reference

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

### ListFonts

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

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of Font — Details about each object.
  - `object` (required): string — one of `font`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 1–255; The ID of the font.
  - `name` (required): string — length 1–255; The PostScript name of the font.
  - `family_name` (required): string — length 1–255; The font family name.
  - `style` (required): string — one of `normal`, `italic`; The font style.
  - `weight` (required): integer — The font weight.
  - `url` (required): string — length 1–5000; The URL where the font file is hosted.
  - `font_key` (required): string — length 1–1000; The key that identifies this font in a paywall's components config.
- `next_page` (required): string or null — URL to access the next page of the project's fonts. If not present / null, there is no next page
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### Font

- Used by `POST /projects/{project_id}/fonts (201) — Upload a font`

- `object` (required): string — one of `font`; String representing the object's type. Objects of the same type share the same value.
- `id` (required): string — length 1–255; The ID of the font.
- `name` (required): string — length 1–255; The PostScript name of the font.
- `family_name` (required): string — length 1–255; The font family name.
- `style` (required): string — one of `normal`, `italic`; The font style.
- `weight` (required): integer — The font weight.
- `url` (required): string — length 1–5000; The URL where the font file is hosted.
- `font_key` (required): string — length 1–1000; The key that identifies this font in a paywall's components config.

### ListMediaAssets

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

- `object` (required): string — one of `list`; String representing the object's type. Objects of the same type share the same value. Always has the value `list`.
- `items` (required): array of MediaAsset — Details about each object.
  - `object` (required): string — one of `media_asset`; String representing the object's type. Objects of the same type share the same value.
  - `id` (required): string — length 1–255; The ID of the media asset.
  - `object_name` (required): string — length 1–5000; The storage object name for the original asset.
  - `original_name` (required): string — length 1–5000; The uploaded file name.
  - `original_size` (required): integer (format: `int64`) — The original file size in kilobytes.
  - `original_width` (required): integer or null — The original image width in pixels.
  - `original_height` (required): integer or null — The original image height in pixels.
  - `formats` (required): object or null — Rendered image formats keyed by format name.
  - `alt_text` (required): string or null — length 0–1500; Alt text for the asset.
  - `is_decorative` (required): boolean — Whether this asset is decorative.
  - `asset_base_url` (required): string or null — length 0–5000; The base URL where asset object names can be resolved.
  - `asset_type` (required): string — one of `image`, `video`; The media asset type.
  - `video_metadata` (required): object or null — Video metadata, if this is a video asset.
  - `transcoding_status` (required): string or null — The video transcoding status, if this is a video asset.
- `next_page` (required): string or null — URL to access the next page of the project's media assets. If not present / null, there is no next page
- `url` (required): string — length 0–5000; The URL where this list can be accessed.

### MediaAsset

- Used by `POST /projects/{project_id}/media_assets (201) — Upload a media asset`

- `object` (required): string — one of `media_asset`; String representing the object's type. Objects of the same type share the same value.
- `id` (required): string — length 1–255; The ID of the media asset.
- `object_name` (required): string — length 1–5000; The storage object name for the original asset.
- `original_name` (required): string — length 1–5000; The uploaded file name.
- `original_size` (required): integer (format: `int64`) — The original file size in kilobytes.
- `original_width` (required): integer or null — The original image width in pixels.
- `original_height` (required): integer or null — The original image height in pixels.
- `formats` (required): object or null — Rendered image formats keyed by format name.
- `alt_text` (required): string or null — length 0–1500; Alt text for the asset.
- `is_decorative` (required): boolean — Whether this asset is decorative.
- `asset_base_url` (required): string or null — length 0–5000; The base URL where asset object names can be resolved.
- `asset_type` (required): string — one of `image`, `video`; The media asset type.
- `video_metadata` (required): object or null — Video metadata, if this is a video asset.
- `transcoding_status` (required): string or null — The video transcoding status, if this is a video asset.
