SudoMock
Mockups
DocsPricing
Request a demo
Get Started

Start rendering mockups in minutes

From PSD to product mockup in one API call.

Get Free API Key→Browse Templates
Public status pagePublished API pricingProduct mockup API500 one-time API credits

Site Navigation

SudoMock

Turn reusable PSD templates, artwork, and editable text into production-ready product images through REST API, no-code workflows, native storefront apps, or AI.

SudoMock is a registered DBA
1209 Mountain Rd Pl NE, Ste N
Albuquerque, NM 87110, USA

Product

  • Pricing
  • Dashboard
  • PSD Mockups
  • Changelog
  • Start Free

Developers

  • API Overview
  • MCP Server
  • Quick Start
  • Render API
  • Upload PSD
  • Authentication
  • Error Handling
  • PSD Preparation
  • Integrations

Mockups & Tools

  • All Mockups
  • Apparel Mockups
  • Drinkware Mockups
  • Wall Art Mockups
  • Home & Living
  • By Platform
  • Search Mockups
  • Background Remover
  • Free Tools

Resources

  • All Use Cases
  • T-Shirt Mockup Generator for Print on Demand
  • Tote Bag Mockup Generator for Sustainable Brands
  • Automate Mug at Scale with SudoMock
  • Blog
  • Roadmap
  • All Alternatives
  • vs Placeit
  • vs DynamicMockups
  • vs Adobe Photoshop API
  • vs Static Mockup Generators

Company

  • About
  • Contact
  • Brand Assets
  • System Status (opens in new tab)
  • Feature Requests (opens in new tab)
Blog

Latest Articles

View all →
  • 01Etsy Video Size and Length: The Listing Video Rules and the 21 October API Change
  • 02Can You Use Mockups on Etsy? The Rule by Listing Type
  • 03Google Merchant Center Image Requirements: 500 x 500 From 2027 and Renders That Meet It
  • 04Shopify Product Image Size: 2048 px, the Real Limits and Files

© 2026 SudoMock. All rights reserved.

PrivacyTermsRefundsCookies[email protected]
  1. Blog
  2. /
  3. Guide

Etsy Video Size and Length: The Listing Video Rules and the 21 October API Change

Etsy allows up to 2 listing videos of 3 to 15 seconds (5 to 15 on its listing page), up to 100 MB, at least 500px and ideally 1080px, and removes their sound. It asks for a 2:1 or 1:2 aspect ratio. From 21 October 2026, an Open API upload adds a video next to the first instead of replacing it.

Published Oct 18, 2026·7 min read·Beck

A SudoMock render of a white mug with a citrus print beside Etsy's listing video rules: up to 2 videos, 3 to 15 seconds, 100 MB, 1080px ideal, 2:1 or 1:2, no sound, and the Open API change of 21 October 2026

Key takeaways

  • Use a mockup clip where Etsy allows a mockup photo: your design printed by a production partner.
  • From 21 October, swapping a video by API means deleting the old one before the upload.
  • One ffprobe command reads a clip's length, file size and pixel size before the upload.

On this page

  • Etsy's listing video rules
  • Length and sound to aim for
  • Where a mockup clip fits on Etsy
  • Render a clip from the mockup you already list
  • Check the clip before it goes to Etsy
  • Upload by API: the change of 21 October 2026
  • Next step
  • Frequently asked questions
  • Sources

Etsy's listing video rules

Etsy states its listing video rules on How to Add Listing Videos, last edited on 1 July 2026, and its listing help page gives a second length. Each line below is Etsy's own sentence with the page it comes from.

RuleEtsy's wordsPage
Videos per listing"You can add up to 2 videos per listing."How to Add Listing Videos, edited 1 July 2026
File size and type"The maximum size is 100 MB", in MP4, MOV, FLV, AAC, AVI, 3GP or MPEGSame page
Length"Your video may be 3-15 seconds long"Same page
Length, second page"2 videos that are 5-15 seconds in length"How to Create a Listing, edited 29 June 2026
Sound"will not contain any audio once uploaded to your listing"How to Add Listing Videos
Resolution"the minimum video resolution is 500px, the ideal video resolution is at least 1080px"Same page
Shape"The video aspect ratio should be 2:1 or 1:2."Same page

Two details catch out the guides that rank for this question. Several still say one video per listing, while the current page says 2. And Etsy's own pages disagree on the shortest clip: 3 seconds on the video page, 5 on the listing page. The video page does not say whether shapes other than 2:1 and 1:2 are refused.

Length and sound to aim for

Aim for a clip of 5 to 15 seconds with no sound. That length meets both of Etsy's pages, which differ only on the minimum, and Etsy strips the audio from every listing video, so a soundtrack never reaches a buyer.

A short clip of the product in its scene, with light or a slow camera move, fills that time and keeps the print readable.

Where a mockup clip fits on Etsy

Use a mockup clip where Etsy allows a mockup photo: a design of yours that a production partner prints onto a base item. Etsy's image rules say nothing about video, so the photo rule is the one to follow.

Etsy's Listing Image Requirements, last updated on 9 July 2024, allow that case: "you may use a stock photo mockup to illustrate the end product buyers will receive." For items a seller makes, Etsy's Creativity Standards, last updated on 10 June 2025, say listings "must use original photo or video content of the final product". Can You Use Mockups on Etsy? sets out the photo rule for every listing type.

Render a clip from the mockup you already list

One request per listing makes the clip from the same template and artwork as the listing photos, so the video shows the product the photos show. SudoMock queues the clip and answers at once with a job to follow.

curl -X POST https://api.sudomock.com/api/v1/renders/video \
-H "x-api-key: $SUDOMOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mockup_uuid": "YOUR_MOCKUP_UUID",
"smart_objects": [
{ "uuid": "YOUR_SMART_OBJECT_UUID",
"asset": { "url": "https://example.com/designs/citrus.png", "fit": "fit" } }
],
"export_options": { "image_format": "jpg", "image_size": 1024 },
"video": { "duration_seconds": 6, "audio": false, "motion": "ambient" }
}'
const response = await fetch('https://api.sudomock.com/api/v1/renders/video', {
method: 'POST',
headers: {
'x-api-key': process.env.SUDOMOCK_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"mockup_uuid": "YOUR_MOCKUP_UUID",
"smart_objects": [
{
"uuid": "YOUR_SMART_OBJECT_UUID",
"asset": {
"url": "https://example.com/designs/citrus.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1024
},
"video": {
"duration_seconds": 6,
"audio": false,
"motion": "ambient"
}
}),
});
const data = await response.json();
console.log(data);
import os
import requests
response = requests.post(
"https://api.sudomock.com/api/v1/renders/video",
headers={
"x-api-key": os.environ["SUDOMOCK_API_KEY"],
"Content-Type": "application/json",
},
json={
"mockup_uuid": "YOUR_MOCKUP_UUID",
"smart_objects": [
{
"uuid": "YOUR_SMART_OBJECT_UUID",
"asset": {
"url": "https://example.com/designs/citrus.png",
"fit": "fit",
},
},
],
"export_options": {
"image_format": "jpg",
"image_size": 1024,
},
"video": {
"duration_seconds": 6,
"audio": False,
"motion": "ambient",
},
},
)
print(response.json())
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
payload := []byte(`{
"mockup_uuid": "YOUR_MOCKUP_UUID",
"smart_objects": [
{
"uuid": "YOUR_SMART_OBJECT_UUID",
"asset": {
"url": "https://example.com/designs/citrus.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1024
},
"video": {
"duration_seconds": 6,
"audio": false,
"motion": "ambient"
}
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/renders/video", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", os.Getenv("SUDOMOCK_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
<?php
$payload = <<<'JSON'
{
"mockup_uuid": "YOUR_MOCKUP_UUID",
"smart_objects": [
{
"uuid": "YOUR_SMART_OBJECT_UUID",
"asset": {
"url": "https://example.com/designs/citrus.png",
"fit": "fit"
}
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1024
},
"video": {
"duration_seconds": 6,
"audio": false,
"motion": "ambient"
}
}
JSON;
$ch = curl_init('https://api.sudomock.com/api/v1/renders/video');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . getenv('SUDOMOCK_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

mockup_uuid, smart_objects and export_options are the blocks an image render of the same template takes, so the artwork sits where it sits in your listing photos. In video, duration_seconds: 6 asks for a clip inside both of Etsy's ranges. Set it in every request, n8n and Make steps included: a request without it gets the 4 second default, and a length outside the model's set comes back as a 400 with allowed_durations to pick from. audio: false is the default and matches what Etsy plays, and motion: ambient keeps the print readable while the scene moves.

The reply is 202 Accepted with a job_id, the status_url to poll, the model that makes the clip, and the duration_seconds, audio and estimated_credits the job was priced at. Poll the job until its status is succeeded, then download the clip from result_url:

curl -X GET https://api.sudomock.com/api/v1/jobs/YOUR_JOB_ID \
-H "x-api-key: $SUDOMOCK_API_KEY"
const response = await fetch('https://api.sudomock.com/api/v1/jobs/YOUR_JOB_ID', {
method: 'GET',
headers: {
'x-api-key': process.env.SUDOMOCK_API_KEY,
},
});
const data = await response.json();
console.log(data);
import os
import requests
response = requests.get(
"https://api.sudomock.com/api/v1/jobs/YOUR_JOB_ID",
headers={
"x-api-key": os.environ["SUDOMOCK_API_KEY"],
},
)
print(response.json())
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.sudomock.com/api/v1/jobs/YOUR_JOB_ID", nil)
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", os.Getenv("SUDOMOCK_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
<?php
$ch = curl_init('https://api.sudomock.com/api/v1/jobs/YOUR_JOB_ID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . getenv('SUDOMOCK_API_KEY'),
],
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

For a catalogue, send one request per listing and let a webhook endpoint on your account collect the clips. SudoMock sends video.succeeded and video.failed events, and the job stays the record to read, as Webhooks describes.

Check the clip before it goes to Etsy

Read the clip's length, file size and pixel dimensions before the upload, because Etsy sets a limit on each. One ffprobe command prints all four.

Shell
ffprobe -v error -select_streams v:0 -show_entries stream=width,height:format=duration,size -of default=noprint_wrappers=1 clip.mp4

Compare duration with 5 to 15 seconds, size (in bytes) with Etsy's 100 MB, and width and height with the 500px minimum.

Upload by API: the change of 21 October 2026

Until 21 October 2026, Etsy's uploadListingVideo call replaces a listing's active video unless the request opts in to the new behavior. From that day every upload adds the video next to the one already there, up to 2 per listing, and an upload to a listing with 2 active videos returns 409 Conflict.

Etsy announced it on 3 September 2026 in Open API discussion 1714: "Currently, calling uploadListingVideo replaces any existing video on a listing", and after the migration "the endpoint will instead add a video alongside existing ones (up to 2 per listing), and the replace behavior will be permanently disabled." The grace period began on 21 September with the query parameter is_multi_video=true, and after 21 October "is_multi_video will be ignored and the new behavior will apply to all requests unconditionally."

The request below opts in now, so the script behaves the same before and after the date. It needs an OAuth token with the listings_w scope, and Etsy's x-api-key header carries the keystring and the shared secret joined by a colon, as the Open API specification defines it.

Shell
CLIP=clip.mp4
curl -X POST "https://openapi.etsy.com/v3/application/shops/$SHOP_ID/listings/$LISTING_ID/videos?is_multi_video=true" \
-H "x-api-key: $ETSY_KEYSTRING:$ETSY_SHARED_SECRET" \
-H "Authorization: Bearer $ETSY_ACCESS_TOKEN" \
-H "Content-Type: multipart/form-data" \
-F "video=@$CLIP;type=video/mp4" \
-F "name=clip.mp4"

Diagram of a listing's media before and after an uploadListingVideo call: the legacy call deactivates video A, the new behavior adds video B at the end of the media, and a third video returns 409 ConflictHow uploadListingVideo treats a listing's videos before and after 21 October 2026, drawn from Etsy's announcement of 3 September 2026.

A script that used to swap a listing's video now leaves two, and its next swap fails with 409. Read the listing's videos with getListingVideos, remove the old one with deleteListingVideo, then upload. Etsy's specification says a copy of a deleted video stays on its servers, so its video_id can be linked to the listing again without uploading the file. Linking a video_id that is already active on the listing returns 409 as well.

Order matters too. In Etsy's words, "The first video uploaded becomes the primary video for the listing. A second video uploaded is placed at the end of the listing's media", so upload the clip buyers should see first before the other one.

Next step

Render one clip from the template behind your best-selling listing, check it with the ffprobe command, and upload it with is_multi_video=true, which works the same before and after 21 October. Render a video mockup documents every field of the request, and Retrieve a single job the reply that carries the clip. Without code, the SudoMock nodes for n8n and Make include a video render step. With no template yet, the mockup templates for Etsy sellers are ready to render. For the photos next to the clip, Etsy Listing Photo Size gives each photo's size, and How to Automate Etsy Product Mockups runs the renders for a whole catalogue.

Frequently asked questions

How long can an Etsy listing video be?

Etsy's video help page allows 3 to 15 seconds, and its listing help page says 5 to 15 seconds. A clip of 5 to 15 seconds meets both. Etsy last edited the two pages on 1 July 2026 and 29 June 2026.

What size should an Etsy listing video be?

Etsy accepts video files up to 100 MB in MP4, MOV, FLV, AAC, AVI, 3GP or MPEG. Its help page sets a minimum resolution of 500px, calls at least 1080px ideal and asks for an aspect ratio of 2:1 or 1:2.

Do Etsy listing videos play with sound?

No. Etsy's help page says a listing video will not contain any audio once it is uploaded. Make the clip without sound, because a soundtrack is removed at upload.

How many videos can an Etsy listing have?

Up to 2 per listing, according to Etsy's help pages. Through the Open API, a new upload replaces the active video until 21 October 2026 unless the request sets is_multi_video to true, and from that date it is added next to the first one.

Sources

  1. How to Add Listing Videos (opens in new tab), Etsy Help Center
  2. How to Create a Listing (opens in new tab), Etsy Help Center
  3. ACTION REQUIRED: Multiple Videos per Listing, Migration for uploadListingVideo (opens in new tab), Etsy Open API on GitHub
  4. Etsy Open API v3 specification (opens in new tab), Etsy
  5. Listing Image Requirements (opens in new tab), Etsy
  6. Creativity Standards (opens in new tab), Etsy
  7. Render a video mockup (opens in new tab)
  8. Retrieve a single job (opens in new tab)
  9. Webhooks (opens in new tab)
B

Beck

CTO

View all posts

On this page

  • Etsy's listing video rules
  • Length and sound to aim for
  • Where a mockup clip fits on Etsy
  • Render a clip from the mockup you already list
  • Check the clip before it goes to Etsy
  • Upload by API: the change of 21 October 2026
  • Next step
  • Frequently asked questions
  • Sources

Related articles

Framed botanical print rendered at 2679 by 2000 pixels beside the export options that made it and Etsy's photo rules it meets: both sides 2000 pixels or more, landscape first photo, JPG under 1 MB
Guide

Etsy Listing Photo Size: Etsy's Rules and Files That Meet Them

Etsy's listing photo rules quoted with their dates, the render width for each template shape, and real files measured against the 1 MB line.

Oct 8, 2026 · 7 min read

Three SudoMock renders of a white mug with the name Maya in script, serif and sans fonts, beside Etsy's photo rule for print on demand, personalized, partner-made and handmade listings
Guide

Can You Use Mockups on Etsy? The Rule by Listing Type

Etsy's own sentences on mockups by listing type, dated, and a render setup for the option photos of a personalized listing.

Oct 11, 2026 · 8 min read

The moonlit campsite design next to three SudoMock renders of it on a hoodie, a framed poster and a canvas tote, beside the Etsy title, 13 tags and alt text Claude wrote for the hoodie
Tutorial

Etsy Listing Generator: Build Your Own With Claude and SudoMock

One design in, a full Etsy listing out: photos rendered on your own templates, then the title, tags and alt text Claude writes from them.

Oct 5, 2026 · 10 min read

Explore by use case

See SudoMock in action for your specific product category

Etsy Mockup Generator API for Handmade Marketplace SellersT-Shirt Mockup Generator API for Print on DemandHoodie Mockup Generator APIAutomate Mug Mockups at Scale with SudoMock APIPoster Mockup Generator API for Wall Art SellersPhone Case Mockup Generator API for Print on Demand

Your own PSD, rendered via API

Render your own PSD through the API. Start with 500 one-time credits, no card.

Start Free View Docs

Render your own PSD via API with 500 one-time credits.

Start Free · 500 credits, no card