# Get All Studio Templates

> Retrieve studio templates from your workspace with pagination

- **URL**: https://orshot.com/docs/api-reference/studio-templates-list

---

List all studio templates in your workspace with pagination support.

## Endpoint

### GET /templates/all

Returns templates with pagination support.```markdown tab="Endpoint"
https://api.orshot.com/v1/studio/templates/all?page=1&limit=10
```## Query Parameters

| Parameter     | Type    | Required | Default | Description                                                              |
| ------------- | ------- | -------- | ------- | ------------------------------------------------------------------------ |
| `page`        | Integer | No       | 1       | Page number (must be > 0)                                                |
| `limit`       | Integer | No       | 10      | Templates per page (max: 40, must be > 0)                                |
| `search`      | String  | No       | -       | Filter templates by name (case-insensitive substring match, server-side) |
| `tags`        | String  | No       | -       | Comma-separated list of tags. Returns templates that have **all** of the specified tags |
| `embedId`     | String  | No\*     | -       | Embed instance ID (for user-specific filtering)                          |
| `embedUserId` | String  | No\*     | -       | User ID to filter templates for a specific user                          |

\*Both `embedId` and `embedUserId` are required together for user-specific filtering.

## Request Example```js
await fetch("https://api.orshot.com/v1/studio/templates/all?page=1&limit=10", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer <ORSHOT_API_KEY>",
  },
});
```## Filtering by Search and Tags

You can filter templates by name and tags:```js
// Search by name and filter by tags
await fetch(
  "https://api.orshot.com/v1/studio/templates/all?search=banner&tags=social,marketing&page=1&limit=10",
  {
    method: "GET",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer <ORSHOT_API_KEY>",
    },
  },
);
```- `search` performs a case-insensitive substring match on the template name.
- `tags` is a comma-separated list — only templates that contain **all** specified tags are returned.

## Filtering by Embed User

To retrieve templates for a specific embed user, pass both `embedId` and `embedUserId`:```js
await fetch(
  "https://api.orshot.com/v1/studio/templates/all?embedId=YOUR_EMBED_ID&embedUserId=user_123&page=1&limit=10",
  {
    method: "GET",
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer <ORSHOT_API_KEY>",
    },
  },
);
```This returns only templates belonging to the specified user. Without these parameters, the endpoint returns all workspace templates (including user-specific ones).

## Response Example```json
{
  "data": [
    {
      "id": 123,
      "created_at": "2025-09-10T15:30:45.123Z",
      "workspace_id": "workspace-uuid-456",
      "user_id": "user-uuid-789",
      "canvas_width": 1200,
      "canvas_height": 630,
      "updated_at": "2025-10-15T10:20:30.456Z",
      "name": "Social Media Post",
      "description": "Template for social media posts",
      "tags": ["social", "marketing"],
      "thumbnail_url": "https://storage.orshot.com/thumbnails/template-123.png",
      "embed_user_id": null,
      "pages_data": [
        {
          "page_id": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
          "name": "Page 1",
          "thumbnail_url": "https://storage.orshot.com/thumbnails/page-1.png"
        }
      ],
      "modifications": [
        {
          "key": "title",
          "id": "title",
          "type": "text",
          "description": "Heading — Text content",
          "help_text": "Heading — Text content",
          "element_name": "Heading",
          "example": "Hello World",
          "page_number": 1,
          "page_id": "a1b2c3d4-5e6f-7890-abcd-ef1234567890"
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 45,
    "totalPages": 5
  }
}
```## Pagination Response Fields

| Field        | Type    | Description                     |
| ------------ | ------- | ------------------------------- |
| `page`       | Integer | Current page number             |
| `limit`      | Integer | Number of templates per page    |
| `total`      | Integer | Total number of templates       |
| `totalPages` | Integer | Total number of available pages |

## Template Response Fields

| Field           | Type    | Description                                                  |
| --------------- | ------- | ------------------------------------------------------------ |
| `id`            | Integer | Unique identifier for the template                           |
| `created_at`    | String  | Timestamp when the template was created                      |
| `workspace_id`  | String  | ID of the workspace the template belongs to                  |
| `user_id`       | String  | ID of the user who created the template                      |
| `canvas_width`  | Number  | Width of the template canvas in pixels                       |
| `canvas_height` | Number  | Height of the template canvas in pixels                      |
| `updated_at`    | String  | Timestamp when the template was last updated                 |
| `name`          | String  | Name of the template                                         |
| `description`   | String  | Description of the template                                  |
| `tags`          | Array   | Array of tag strings assigned to the template                |
| `thumbnail_url` | String  | URL to the template's thumbnail image                        |
| `embed_user_id` | String  | Internal ID of the embed user (null for workspace templates) |
| `pages_data`    | Array   | Array of pages (for multi-page templates)                    |
| `modifications` | Array   | Array of available modifications for parameters              |

## Modification Fields

Each modification object contains:

| Field          | Type    | Description                                                                                                          |
| -------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| `key`          | String  | Unique key for the modification. For multi-page templates this is prefixed, e.g. `page1@title`                       |
| `id`           | String  | Same as `key`                                                                                                        |
| `type`         | String  | Type of modification (`text`, `imageUrl`, `videoUrl`, `backgroundColor`, `fill`, `color`, `stroke`)                  |
| `description`  | String  | Human-readable description, e.g. `"Heading — Text content"` or `"Image URL"` when no element name is set            |
| `help_text`    | String  | Same as `description`                                                                                                |
| `element_name` | String  | Layer name of the element in the editor (only present when the element has a name)                                   |
| `example`      | String  | Default/example value for the field                                                                                  |
| `page_number`  | Integer | 1-based page number this modification belongs to                                                                     |
| `page_id`      | String  | Stable UUID of the page this modification belongs to — use this to reliably map modifications to pages after reorder |

## Page Fields

Each entry in `pages_data` contains:

| Field           | Type   | Description                            |
| --------------- | ------ | -------------------------------------- |
| `page_id`       | String | Stable UUID for the page               |
| `name`          | String | Display name of the page               |
| `thumbnail_url` | String | URL to the thumbnail image of the page |

## Rate Limits

This endpoint is rate limited to **20 requests per minute** per API key. Rate limit headers are included in every response:

| Header                  | Description                                      |
| ----------------------- | ------------------------------------------------ |
| `RateLimit-Limit`       | Maximum requests per minute                      |
| `RateLimit-Remaining`   | Remaining requests in the current window          |
| `RateLimit-Reset`       | Seconds until the rate limit window resets         |
| `Retry-After`           | Seconds to wait (only on `429` responses)         |

## Error Responses

| Code | Description                            |
| ---- | -------------------------------------- |
| 400  | Invalid page/limit parameters          |
| 403  | Missing or invalid API key             |
| 403  | No studio templates found in workspace |