POST: Create Studio Template
Create a single studio template programmatically via API
Enterprise Only
This is an Enterprise only private endpoint. Checkout the Enterprise Pricing to get access.
Create a new studio template in your workspace programmatically. This endpoint allows you to define the template structure, dimensions, and optionally include pre-built pages with elements.
For detailed information about the template data structure, see Anatomy of a Template.
Endpoint
https://api.orshot.com/v1/studio/templates/createRequest
// Create a blank template with specified dimensions
await fetch("https://api.orshot.com/v1/studio/templates/create", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
name: "Product Banner",
description: "E-commerce product showcase banner",
canvas_width: 1200,
canvas_height: 628
}),
});// Create a template with pre-built page structure
await fetch("https://api.orshot.com/v1/studio/templates/create", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
name: "Social Media Post",
description: "Instagram post template",
canvas_width: 1080,
canvas_height: 1080,
pages_data: [
{
id: "page-1-uuid",
name: "Page 1",
canvas: {
width: 1080,
height: 1080,
backgroundColor: "#ffffff"
},
elements: [
{
id: "headline-element",
type: "text",
x: 100,
y: 200,
width: 880,
height: 100,
content: "Your Headline Here",
parameterId: "headline",
parameterizable: true
},
{
id: "image-element",
type: "image",
x: 100,
y: 350,
width: 880,
height: 500,
src: "https://example.com/placeholder.png",
parameterId: "product_image",
parameterizable: true
}
],
modifications: []
}
]
}),
});{
"success": true,
"template": {
"id": 12345,
"name": "Product Banner",
"canvas_width": 1200,
"canvas_height": 628,
"pages_count": 1,
"modifications": [
{
"id": "headline",
"type": "text",
"description": "Dynamic content for text element"
},
{
"id": "product_image",
"type": "image",
"description": "Dynamic content for image element"
}
],
"created_at": "2026-01-29T10:30:00.000Z"
}
}Rate Limits
| Limit | Value |
|---|---|
| Requests per minute | 30 |
Request Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | Yes | Name of the template (max 255 characters) |
description | String | No | Description of the template |
canvas_width | Integer | Yes | Width of the canvas in pixels (1-5000) |
canvas_height | Integer | Yes | Height of the canvas in pixels (1-5000) |
pages_data | Array | No | Array of page objects with elements. If not provided, a blank page is created |
thumbnail_url | String | No | URL to a thumbnail image for the template |
Pages Data Structure
Each page in the pages_data array should follow this structure:
| Field | Type | Description |
|---|---|---|
id | String | Unique identifier for the page (UUID recommended) |
name | String | Name of the page (e.g., "Page 1") |
canvas | Object | Canvas settings { width, height, backgroundColor } |
elements | Array | Array of element objects (text, image, shapes, etc.) |
modifications | Array | Array of parameterizable modifications |
thumbnail_url | String | URL to page thumbnail |
Response Fields
| Field | Type | Description |
|---|---|---|
success | Boolean | Whether the operation was successful |
template.id | Integer | Unique identifier for the created template |
template.name | String | Name of the template |
template.canvas_width | Integer | Canvas width in pixels |
template.canvas_height | Integer | Canvas height in pixels |
template.pages_count | Integer | Number of pages in the template |
template.modifications | Array | List of parameterizable modifications extracted from elements |
template.created_at | String | ISO timestamp of creation |
Error Responses
| Status Code | Error | Description |
|---|---|---|
| 400 | Validation failed | Invalid request body parameters |
| 403 | Access Forbidden | Invalid or missing API key |
| 429 | Rate limit exceeded | Too many requests (max 30/min) |
| 500 | Internal server error | Server-side error |
Notes
- If
pages_datais not provided, a blank page with the specified dimensions is automatically created - Elements with
parameterizable: trueand aparameterIdwill be automatically extracted as modifications - The
modificationsarray in the response shows which dynamic parameters are available for rendering