Skip to main content

Templates

Shotstack templates provide a way to save an edit that you want to re-use at a later date. A template can also be saved with placeholders using double curly braces (handlebars), like {{ FIRST_NAME }}. These placeholders can be replaced with real values when the video is rendered.

A template can be rendered using it's ID and an array of merge fields that replace the placeholders at render time.

Create a template

To create a template you POST an edit to the templates endpoint:

POST https://api.shotstack.io/{{ENV}}/templates/

Where {{ENV}} is the environment you are working with, for example stage or v1.

The following cURL request will create a template in the stage environment. The video src and length use placeholder values {{ URL }} and {{ DURATION }}. The place holders can be replaced when rendering using merge fields.

curl -X POST \
-H "Content-Type: application/json" \
-H "x-api-key: ptmpOiyKgGYMnnONwvXH7FHzDGOazrIjaEDUS7Cf" \
-d '
{
"name": "Basic test template",
"template": {
"timeline": {
"tracks": [
{
"clips": [
{
"asset": {
"type": "video",
"src": "{{ URL }}"
},
"start": 0,
"length": "{{ DURATION }}"
}
]
}
]
},
"output": {
"format": "mp4",
"resolution": "sd"
}
}
}' \
https://api.shotstack.io/stage/templates/

The POST request should return a JSON payload that includes the the template ID; response.id:

{
"success": true,
"message": "Created",
"response": {
"message": "Template Successfully Created",
"id":"ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641"
}
}

Retrieve a template

You can retrieve a template using the following endpoint:

GET https://api.shotstack.io/{{ENV}}/templates/{{ID}}

The following cURL request retrieves the template we just created:

curl -X GET \
-H "Content-Type: application/json" \
-H "x-api-key: ptmpOiyKgGYMnnONwvXH7FHzDGOazrIjaEDUS7Cf" \
https://api.shotstack.io/stage/templates/ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641

The response should look like:

{
"success": true,
"message": "OK",
"response": {
"id": "ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641",
"name": "Basic test template",
"owner": "5ca6hu7s9k",
"template": {
"timeline": {
"tracks": [
{
"clips": [
{
"asset": {
"type": "video",
"src": "{{ URL }}"
},
"start": 0,
"length": "{{ DURATION }}"
}
]
}
]
},
"output": {
"format": "mp4",
"resolution": "sd"
}
}
}
}

Retrieve a list of all templates

You can retrieve a list of template using the following endpoint:

GET https://api.shotstack.io/{{ENV}}/templates/

The following cURL request returns all templates created in the stage environment:

curl -X GET \
-H "Content-Type: application/json" \
-H "x-api-key: ptmpOiyKgGYMnnONwvXH7FHzDGOazrIjaEDUS7Cf" \
https://api.shotstack.io/stage/templates

The response should include a list of all templates:

{
"success": true,
"message": "OK",
"response": {
"owner": "5ca6hu7s9k",
"templates": [
{
"id": "ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641",
"name": "Basic test template",
"created": "2022-12-20T12:24:44.650Z",
"updated": "2022-12-20T12:24:44.451Z"
},
{
"id": "17eff444b-b0f4-8a91-8fcc-7423ef711060",
"name": "Another template",
"created": "2022-12-19T22:37:39.287Z",
"updated": "2022-12-20T03:57:59.827Z"
},
{
"id": "e63874c58-3a62-3c98-8942-2bb70cad3ba9",
"name": "Hello world template",
"created": "2022-10-03T07:10:46.125Z",
"updated": "2022-12-20T03:57:25.865Z"
}
]
}
}

Update an existing template

To update and overwrite an existing template use the following endpoint:

PUT https://api.shotstack.io/{{ENV}}/templates/{{ID}}

The following cURL request updates the template we created earlier and adds a {{ TRIM }} placeholder and changes the resolution to hd:

curl -X PUT \
-H "Content-Type: application/json" \
-H "x-api-key: ptmpOiyKgGYMnnONwvXH7FHzDGOazrIjaEDUS7Cf" \
-d '
{
"name": "Basic test template",
"template": {
"timeline": {
"tracks": [
{
"clips": [
{
"asset": {
"type": "video",
"src": "{{ URL }}",
"trim": "{{ TRIM }}"
},
"start": 0,
"length": "{{ DURATION }}"
}
]
}
]
},
"output": {
"format": "mp4",
"resolution": "hd"
}
}
}' \
https://api.shotstack.io/stage/templates/ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641

The response should indicate the template was updated and return the template id:

{
"success": true,
"message": "OK",
"response": {
"id": "ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641",
"message": "Template Successfully Updated"
}
}

Render a template with merge fields

Once you have saved a template, you can render it at any time in the future. While it is possible to render the template by id only, it is more likely you will want to replace placeholders using merge fields.

To render a template call the following endpoint:

POST https://api.shotstack.io/{{ENV}}/templates/render

The following cURL request will replace the templates placeholders with the provided merge fields and render a video:

curl -X POST \
-H "Content-Type: application/json" \
-H "x-api-key: ptmpOiyKgGYMnnONwvXH7FHzDGOazrIjaEDUS7Cf" \
-d '
{
"id": "ca84c7c5-5fe4-66d3-839e-ee0f1d4c2641",
"merge": [
{
"find": "URL",
"replace": "https://shotstack-assets.s3-ap-southeast-2.amazonaws.com/footage/city-timelapse.mp4"
},
{
"find": "TRIM",
"replace": 3
},
{
"find": "DURATION",
"replace": 10
}
]
}' \
https://api.shotstack.io/stage/templates/render

The following response will be returned including the render task id; response.id:

{
"success": true,
"message": "Created",
"response": {
"message": "Render Successfully Queued",
"id": "b3a3034f-8827-9e33-a6a8-ba745d36fc1"
}
}

The video is now queued for rendering and can be polled like any other render request using the GET render endpoint or using webhooks.