Copy a Version to a New Template
Create a new template from an earlier version without touching the live template
Updated
POST
/v1/studio/templates/{templateId}/versions/{versionId}/duplicatecurl -X POST "https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions/<VERSION_ID>/duplicate" \
-H "Authorization: Bearer <ORSHOT_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"name": "<NAME>"
}'const res = await fetch("https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions/<VERSION_ID>/duplicate", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
"name": "<NAME>"
}),
});
const data = await res.json();import requests
response = requests.post(
"https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions/<VERSION_ID>/duplicate",
headers={"Authorization": "Bearer <ORSHOT_API_KEY>"},
json={
"name": "<NAME>"
},
)
data = response.json()$ch = curl_init("https://api.orshot.com/v1/studio/templates/<TEMPLATE_ID>/versions/<VERSION_ID>/duplicate");
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([
"name" => "<NAME>"
]));
$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/<VERSION_ID>/duplicate")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer <ORSHOT_API_KEY>"
req["Content-Type"] = "application/json"
req.body = {
"name": "<NAME>"
}.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.
Creates a new template in the same workspace from the version's design, so an old design can be reused while the live template keeps going. The same plan rules as restore apply.
Endpoint#
https://api.orshot.com/v1/studio/templates/:templateId/versions/:versionId/duplicateURL Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
templateId | Integer | Yes | ID of the studio template |
versionId | Integer | Yes | ID of the version to copy |
Request Body#
| Field | Type | Required | Description |
|---|---|---|---|
name | String | No | Name of the new template. Default: <template name> (<version label or vN>) |
Request#
await fetch(
"https://api.orshot.com/v1/studio/templates/12345/versions/48/duplicate",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({ name: "Launch banner (spring edition)" }),
},
);{
"success": true,
"template": {
"id": 12399,
"name": "Launch banner (spring edition)",
"updated_at": "2026-09-15T11:45:02.004+00:00",
"workspace_id": 50
},
"from": { "id": 48, "number": 9, "kind": "session", "label": null }
}Error Responses#
| Status Code | Code | Description |
|---|---|---|
| 400 | invalid_name | name is empty, not a string, or longer than 255 characters |
| 400 | invalid_version_id | versionId is not a numeric id |
| 403 | PLAN_LOCKED | Copying versions needs a paid workspace plan |
| 403 | PLAN_REACH | This version is older than the plan can restore |
| 403 | enterprise_required | API key without the Enterprise version history feature |
| 404 | VERSION_NOT_FOUND | No such version on this template |
| 500 | COPY_FAILED | Server-side error |
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