When you want to automate this

One video per listing, automatically.

1
See it
OutputMP4
Size1080 × 1080 (1:1)
Length20s
Frame rate25 fps
Tracks / clips35 / 65
Assets used1 audio, 13 image, 13 luma, 38 text
Soundtrackno
Merge fields35
2
Make it yours

Send a merge array with your values for these fields:

FieldDefault value
{{ LOGO }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/940f1058-e756-4f3e-afc5-0afa467cfbb7/source.png
{{ BRAND_NAME }}Brand
{{ TITLE }}FIND YOUR DREAM HOUSE
{{ TEXT_FONT_COLOR }}#ffffff
{{ LINES_COLOR }}#ffffff
{{ SHAPE_COLOR }}#f5a700
{{ GREY_BACKGROUND_COLOR_3 }}#545454
{{ SHAPE_BACKGROUND_COLOR_2 }}#864b13
{{ S1_IMAGE_1 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/0aa1776d-9e0b-43b6-add2-b5b7452695d5/source.jpg
{{ S1_IMAGE_SRC_2 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/4345869b-08a6-411b-a728-d44458e4b63c/source.jpg
{{ S1_IMAGE_SRC_3 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/f112dc76-a8c7-4878-b493-427217e38005/source.jpg
{{ S2_TITLE }}MODERN DESIGN CONCEPT
{{ S2_BEDROOM }}- 4 Bedrooms
{{ S2_LIVING }}- 4 Living Rooms
{{ S2_KITCHEN }}- Open Kitchen
{{ S2_SWIM }}- Swimming Pool
{{ S3_TITLE }}PERFECT HOUSE FOR LIVING
{{ S3_GUESTROOM }}- Guest Room
{{ S3_LIVINGROOM }}- Living Room
{{ S3_CARPORT }}- Carport
{{ S3_GARDEN }}- Garden
{{ CTA }}CONTACT US
{{ PHONE }}+123 456 7890
{{ EMAIL }}hello@reallygreatsite.com
{{ WEBSITE }}www.reallygreatsite.com
{{ ADDRESS }}123 Anywhere St., Any City
{{ S2_IMAGE_LONG }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/0786efdc-12c1-412b-928c-38b65f5f59a1/source.jpg
{{ S2_IMAGE_SRC_2 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/15f50f6e-5a6c-456f-a2cb-be79e08376e4/source.jpg
{{ S2_IMAGE_SRC_3 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/f56ac404-6137-4a56-8e31-4ee79cdad298/source.jpg
{{ S3_IMAGE_SRC }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/1e48a806-b6e0-4d7c-a5d6-383ee6660c84/source.jpg
{{ S3_IMAGE_SRC_2 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/11629764-6249-46df-80b4-255e4da24b1f/source.jpg
{{ S3_IMAGE_SRC_3 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/5e3be023-6e90-4a5a-9cf3-5cc5924b80b6/shotstack-proxy.webp
{{ S3_IMAGE_SRC_4 }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/6a32a0b6-fa25-43fd-a10c-382dde17aafa/source.jpg
{{ S4_IMAGE_SRC }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/a7fd2a4f-5c0b-4dbd-b659-6d00f87c9150/source.jpg
{{ AUDIO_SRC }}https://templates.shotstack.io/Modern-Real-Estate-Promoton-Animated/37c86e6f-9b16-4772-9a08-d4de7e3058a3/source.mp3
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

Feed it your listings and every property gets its own video the moment it hits the market — no editor in the loop.

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 35 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 35 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 use this square template for Instagram and LinkedIn feeds?

Yes. It renders 1080×1080 (1:1). Set output.aspectRatio to 9:16 or 16:9 in the JSON to produce vertical or landscape versions from the same timeline.

Can I use my own photos?

Yes. The template uses 13 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.