When you want to automate this

A video for every review that comes in.

1
See it
OutputMP4
Size1920 × 1080 (16:9)
Length30s
Frame rate25 fps
Tracks / clips19 / 19
Assets used1 audio, 8 image, 10 text
Soundtrackno
Merge fields17
2
Make it yours

Send a merge array with your values for these fields:

FieldDefault value
{{ HOTEL_IMAGE_MAIN }}https://templates.shotstack.io/hotel-review-slideshow/b99368b8-1e49-423a-bd2a-a807560d8da6/source.jpg
{{ HOTEL_IMAGE_1 }}https://templates.shotstack.io/hotel-review-slideshow/8f05d8ae-b13c-4038-be46-b06c3e59f6ac/source.jpg
{{ HOTEL_IMAGE_2 }}https://templates.shotstack.io/hotel-review-slideshow/c5b4b3a0-650f-4d57-bbee-8fbb7c98628e/source.jpg
{{ HOTEL_IMAGE_3 }}https://templates.shotstack.io/hotel-review-slideshow/7610f4f9-30fe-4779-94eb-077e89c62d66/source.jpg
{{ HOTEL_IMAGE_4 }}https://templates.shotstack.io/hotel-review-slideshow/4356ceb1-7ad2-4588-a061-5b667f35c18f/source.jpg
{{ HOTEL_IMAGE_5 }}https://templates.shotstack.io/hotel-review-slideshow/b12530ac-b32f-4f19-b0e1-c8e721b77228/source.webp
{{ HOTEL_IMAGE_6 }}https://templates.shotstack.io/hotel-review-slideshow/58abe79a-f11b-400a-bdb3-ddf56bf68cee/source.jpg
{{ HOTEL_IMAGE_7 }}https://templates.shotstack.io/hotel-review-slideshow/898cdb79-a38c-4e9a-b0c5-d5a921995a42/source.jpg
{{ HOTEL_NAME }}Grand Pacific Hotel
{{ TESTIMONIAL_1 }}The room was clean and the breakfast is good
{{ TESTIMONIAL_1_AUTHOR }}Kim, Thailand
{{ TESTIMONIAL_2 }}Staff were very accommodating
{{ TESTIMONIAL_2_AUTHOR }}Charles, Australia
{{ TESTIMONIAL_4 }}Highly recommended. I would definitely stay here again!
{{ TESTIMONIAL_4_AUTHOR }}Gabe, United Kingdom
{{ TESTIMONIAL_5 }}Great experience. Strongly recommended
{{ TESTIMONIAL_5_AUTHOR }}Peter, United States
Edit and save to your account
3
Run it once

Save the JSON above as template.json, then render in the free sandbox:

# Save the JSON above as template.json, then:
curl -X POST https://api.shotstack.io/edit/stage/render \
  -H "x-api-key: $SHOTSTACK_API_KEY" \
  -H "Content-Type: application/json" \
  -d @template.json

# Poll until status is "done", then download response.url
curl https://api.shotstack.io/edit/stage/render/RENDER_ID -H "x-api-key: $SHOTSTACK_API_KEY"
import { readFileSync } from 'node:fs';

const headers = { 'x-api-key': process.env.SHOTSTACK_API_KEY, 'Content-Type': 'application/json' };
const edit = JSON.parse(readFileSync('template.json', 'utf8'));

const { response } = await fetch('https://api.shotstack.io/edit/stage/render', {
  method: 'POST', headers, body: JSON.stringify(edit)
}).then((r) => r.json());

let render;
do {
  await new Promise((r) => setTimeout(r, 3000));
  render = (await fetch(`https://api.shotstack.io/edit/stage/render/${response.id}`, { headers }).then((r) => r.json())).response;
} while (!['done', 'failed'].includes(render.status));

console.log(render.status, render.url);
import json, os, time, requests

headers = {"x-api-key": os.environ["SHOTSTACK_API_KEY"]}
with open("template.json") as f:
    edit = json.load(f)

render_id = requests.post("https://api.shotstack.io/edit/stage/render", json=edit, headers=headers).json()["response"]["id"]

while True:
    render = requests.get(f"https://api.shotstack.io/edit/stage/render/{render_id}", headers=headers).json()["response"]
    if render["status"] in ("done", "failed"):
        break
    time.sleep(3)

print(render["status"], render.get("url"))
npm install -g @shotstack/cli
export SHOTSTACK_API_KEY=your_sandbox_key

shotstack validate template.json          # offline schema check, free
shotstack render template.json --env stage --watch

Sandbox renders are free and watermarked. Production: the v1 endpoint and key. SDKs

4
Automate it

Pipe in new reviews or testimonials and each one becomes a share-ready video.

Paste into Claude, ChatGPT or Cursor — your AI assistant builds the workflow around your data.

Node.js, one render per CSV row, wired to this template's 17 merge fields. Setup steps in the header.

Guides: Bulk-create from a CSV · Webhooks · Templates endpoint · Render your first video

AI assistants: Markdown () · · · CLI skill: SKILL.md () · MCP server

Common questions

How do I change the text and media without editing the JSON?

Use the 17 merge fields listed above. Send a merge array with your own values for each field and the API swaps them in at render time, so one template can produce thousands of unique videos.

Can I render this in full HD or 4K for YouTube?

Yes. This template renders 1920×1080 by default. Set output.resolution to "1080" or output.size to a larger 16:9 size in the JSON; the layout scales with it.

Can I use my own photos?

Yes. The template uses 8 images; replace each image asset's src with a public URL of your own file (JPG, PNG or WebP). Keep the timing and effects, or adjust them per clip.

How do I change the text and fonts?

Edit the text on each text asset in the JSON. Fonts come from the timeline fonts list or the asset's font family; add your own font file URL to timeline.fonts to use a brand typeface.