Name the Current Version
Keep the template as it is now under a name. Named versions are never pruned
Updated
POST
/v1/studio/templates/{templateId}/versionscurl -X POST "https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions" \
-H "Authorization: Bearer <ORSHOT_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"label": "<LABEL>"
}'const res = await fetch("https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
"label": "<LABEL>"
}),
});
const data = await res.json();import requests
response = requests.post(
"https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions",
headers={"Authorization": "Bearer <ORSHOT_API_KEY>"},
json={
"label": "<LABEL>"
},
)
data = response.json()$ch = curl_init("https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer <ORSHOT_API_KEY>",
"Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"label" => "<LABEL>"
]));
$data = json_decode(curl_exec($ch), true);
curl_close($ch);require "net/http"
require "json"
uri = URI("https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer <ORSHOT_API_KEY>"
req["Content-Type"] = "application/json"
req.body = {
"label": "<LABEL>"
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)Enterprise Only
Version history endpoints are available to first party clients like the Orshot MCP server and workspaces on the Enterprise plan. Checkout the Enterprise Pricing to get access.
Stores the template exactly as it is now as a named version. Named versions are never pruned and can always be restored on a paid plan. If the current design is already on the timeline, that row is promoted to a named version instead of stored twice.
Endpoint#
https://api.orshot.com/v1/studio/templates/:templateId/versionsURL Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
templateId | Integer | Yes | ID of the studio template |
Request Body#
| Field | Type | Required | Description |
|---|---|---|---|
label | String | Yes | Name of the version, 1 to 80 characters |
Request#
await fetch("https://api.orshot.com/v1/studio/templates/12345/versions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({ label: "Approved for launch" }),
});{
"success": true,
"version": {
"id": 57,
"number": 12,
"kind": "named",
"label": "Approved for launch",
"protected": true,
"row_updated_at": "2026-09-15T11:31:19.576+00:00",
"page_count": 3,
"previews": ["https://storage.orshot.com/.../p1.png", "", ""]
}
}Returns 201 when a new row was written and 200 when an existing state was promoted or renamed.
Error Responses#
| Status Code | Code | Description |
|---|---|---|
| 400 | label_required | label missing or empty |
| 400 | invalid_label | label is not a string |
| 400 | label_too_long | label is longer than 80 characters |
| 400 | invalid_body | Request body is not a JSON object |
| 403 | PLAN_LOCKED | Naming versions needs a paid workspace plan |
| 403 | enterprise_required | API key without the Enterprise version history feature |
| 404 | — | Template not found in your workspace |
| 409 | NAMED_CAP | The plan's named-version slots for this template are used up |
Was this page helpful?
Ready to automate?
Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.
Get your API key- Image, PDF and video generation via API
- Visual editor with AI and smart layouts
- Zapier, Make, MCP and 50+ integrations
- White-label embed for your own app
- 30 free credits — no credit card required