The short answer: render vertical 9:16 at 1080 × 1920 for TikTok, Instagram Reels and Stories, YouTube Shorts and Facebook Stories. Render 16:9 at 1920 × 1080 for regular YouTube videos and landscape posts on LinkedIn and X. For feed posts, 4:5 at 1080 × 1350 works on LinkedIn, and Meta’s Facebook Feed ad guide asks for 4:5 at 1440 × 1800. Pinterest suggests 2:3 or 9:16, with 1:1 as the fallback.
Vertical is now the default, not the exception. YouTube Shorts average more than 200 billion daily views, according to YouTube CEO Neal Mohan’s 2026 letter, and Reels took 46% of the time US users spent on Instagram in 2025, up from 37% in 2024, per Sensor Tower data reported by CNBC. Those four shapes cover almost every placement.
The details below come from each platform’s own help or developer docs, checked in October 2026. Most are ad or API specs, because those are the pages where platforms publish exact numbers. Every row cites its source.
The second half is for developers who render video with code. It shows what the Shotstack Edit API actually outputs for each resolution and aspectRatio combination, measured with ffprobe on real renders. It also covers one non-obvious result: 4:3 does not give you 1440 × 1080.
resolution plus aspectRatio gives you the presets; size gives you any custom shape up to 3840 px a side.4:3 preset renders 1080 × 810, not 1440 × 1080. Use size when you need the latter.output object.| Platform and placement | Aspect ratio | Size to render | Limits from the platform’s docs |
|---|---|---|---|
| YouTube (regular videos) | 16:9 | 1920 × 1080, or 3840 × 2160 for 4K | ”The standard aspect ratio for YouTube on a computer is 16:9.” Vertical and square uploads play in a player that adapts to them. MP4, H.264, AAC-LC audio. |
| YouTube Shorts | 9:16 (or 1:1) | 1080 × 1920 | A square or vertical upload of up to 3 minutes counts as a Short (uploads from 15 Oct 2024 on). Shorts over 1 minute with an active copyright claim are blocked. |
| TikTok (Content Posting API) | 9:16 | 1080 × 1920 | 360 to 4096 px on each side. 23 to 60 fps. Up to 4 GB. MP4 and H.264 recommended. |
| TikTok ads (In-Feed, non-Spark) | 9:16, 1:1 or 16:9 | 1080 × 1920 | Minimums: 540 × 960 (9:16), 640 × 640 (1:1), 960 × 540 (16:9). At least 516 kbps. Up to 500 MB and 10 minutes. |
| Instagram Reels (Graph API) | 9:16 recommended | 1080 × 1920 | Width up to 1920 px. Any ratio from 0.01:1 to 10:1 is accepted, but 9:16 avoids cropping. 23 to 60 fps. 3 s to 15 min. 300 MB. |
| Instagram Stories (Graph API) | 9:16 recommended | 1080 × 1920 | Same codec rules as Reels. 3 to 60 s. 100 MB. |
| Instagram Reels ads, Instagram and Facebook Stories ads | 9:16 | 1440 × 2560 (Meta’s figure) or 1080 × 1920 | Keep 14% at the top, 35% at the bottom and 6% at each side clear of text and logos. 4 GB. |
| Instagram Feed ads | 9:16 | 1080 × 1920 | Meta’s current guide lists 9:16 with a 1% aspect ratio tolerance. Minimum width 250 px. |
| Facebook Feed ads | 4:5 | 1440 × 1800 (Meta’s figure) or 1080 × 1350 | H.264, fixed frame rate, progressive scan, stereo AAC at 128 kbps or more. Minimum 120 × 120 px. |
| LinkedIn (video ads) | 16:9, 1:1, 4:5 or 9:16 | 1920 × 1080 or 1080 × 1350 | Maximums: 1920 × 1080 (16:9), 1920 × 1920 (1:1), 1080 × 1350 (4:5), 1080 × 1920 (9:16). “Less than 30 FPS.” 3 s to 30 min. 75 KB to 500 MB. |
| X (API uploads) | 16:9 or 1:1 recommended | 1280 × 720, 720 × 1280 or 720 × 720 | Ratio must be between 1:3 and 3:1. 60 fps or less. Square pixels. AAC-LC audio. X’s docs say subscribed users can upload 1080p. |
| Pinterest (video ads) | 1:1, 2:3 or 9:16 | 1080 × 1620 (2:3) or 1080 × 1920 | MP4, MOV or M4V. H.264 or H.265. Up to 2 GB. 4 s to 15 min. |
Where a platform gives a size, the table uses it. Where it gives only a ratio or a range, the “size to render” column uses the 1080-wide version of that ratio. That size is inside every limit listed for that row.
Every platform above accepts square video, but none of the pages we checked names square as its first choice. Meta’s ad guide now lists 9:16 even for the Instagram Feed. Render square only when one file has to go everywhere.
TikTok’s posting API and Instagram’s Graph API both require 23 to 60 fps. LinkedIn’s ad spec says “less than 30 FPS”. A 25 fps render works on all three. A 12 or 15 fps render (fine for a GIF) is below TikTok’s and Instagram’s API minimum, and 60 fps is outside LinkedIn’s ad limit.
Meta suggests 1440 × 2560 for Reels and Stories ads, but the Instagram Graph API caps Reels width at 1920 px, and LinkedIn caps 9:16 at 1080 × 1920. If one vertical file goes to several platforms, 1080 × 1920 is the size every one of them accepts.
On a 1080 × 1920 frame, Meta’s 14% / 35% / 6% guidance means keeping text out of the top 269 px, the bottom 672 px and 65 px on each side. That leaves roughly the middle half of the frame for captions, prices and logos. Text placed in the center of the frame stays clear of those margins.
In a Shotstack edit, the output object sets the frame. You can use a preset resolution with an aspectRatio, or a custom size in pixels. The API reference lists the presets: 16:9 (default), 9:16, 1:1, 4:5 and 4:3. Custom sizes must be divisible by 2 and can be up to 3840 px on each side.
The reference gives pixel sizes for the presets only in 16:9. To see what the other ratios produce, we rendered a 2-second test edit on the Stage (sandbox) API for each combination and read the output with ffprobe:
output settings | Measured output size | Frame rate |
|---|---|---|
"resolution": "1080", "aspectRatio": "16:9" | 1920 × 1080 | 25 fps |
"resolution": "1080", "aspectRatio": "9:16" | 1080 × 1920 | 25 fps |
"resolution": "1080", "aspectRatio": "1:1" | 1080 × 1080 | 25 fps |
"resolution": "1080", "aspectRatio": "4:5" | 1080 × 1350 | 25 fps |
"resolution": "1080", "aspectRatio": "4:3" | 1080 × 810 | 25 fps |
"resolution": "hd", "aspectRatio": "9:16" | 720 × 1280 | 25 fps |
"resolution": "hd", "aspectRatio": "4:5" | 720 × 900 | 25 fps |
"resolution": "sd", "aspectRatio": "9:16" | 576 × 1024 | 25 fps |
"size": {"width": 1080, "height": 1350} | 1080 × 1350 | 25 fps |
"size": {"width": 1080, "height": 1920} | 1080 × 1920 | 25 fps |
The pattern: for every ratio we tested except 16:9, the width is the short side of the preset (1080 for 1080, 720 for hd, 576 for sd), and the height follows from the ratio. That is why 1080 with 4:3 gives 1080 × 810 and not the 1440 × 1080 many people expect. If you need 1440 × 1080, set it with size.
The default frame rate is 25 fps, which is inside every platform limit above. Set fps only if your source footage needs it.
| Target | Shotstack output | Result |
|---|---|---|
| TikTok, Reels, Shorts, Stories | "resolution": "1080", "aspectRatio": "9:16" | 1080 × 1920 |
| LinkedIn or Facebook feed, 4:5 | "resolution": "1080", "aspectRatio": "4:5" | 1080 × 1350 |
| LinkedIn 4:5 at LinkedIn’s recommended size | "resolution": "hd", "aspectRatio": "4:5" | 720 × 900 |
| YouTube, landscape LinkedIn and X | "resolution": "1080", "aspectRatio": "16:9" | 1920 × 1080 |
| X portrait at X’s recommended size | "resolution": "hd", "aspectRatio": "9:16" | 720 × 1280 |
| Pinterest 2:3 (no preset) | "size": {"width": 1080, "height": 1620} | 1080 × 1620 |
| Meta’s 1440 × 2560 | "size": {"width": 1440, "height": 2560} | 1440 × 2560, treat as a 4K job |
| YouTube 4K | "resolution": "4k" | 3840 × 2160, needs a 4K plan |
For X’s recommended 1280 × 720 landscape size, the documented hd preset is 1280 × 720.
The API reference says video above 1920 × 1080 pixels needs a plan that includes 4K. Meta’s 1440 × 2560 is about 3.7 million pixels, against 2.1 million for 1080p, so plan for it as a 4K render, or use 1080 × 1920, which Meta’s own Instagram Feed spec lists. See pricing for which plans include 4K.
Because the shape lives in output and not in the timeline, you can send the same timeline several times with a different output each time. The script below renders one edit (a 16:9 video clip with a centered title) in five shapes. It uses Node 18 or later and the Stage environment, and needs a SHOTSTACK_API_KEY environment variable.
// Render one edit to several platform sizes with the Shotstack Edit API.
// Node 18+. Set SHOTSTACK_API_KEY first. Uses the stage (sandbox) environment.
const API = 'https://api.shotstack.io/edit/stage';
const headers = { 'x-api-key': process.env.SHOTSTACK_API_KEY, 'content-type': 'application/json' };
const timeline = {
background: '#000000',
tracks: [
{ clips: [{
asset: { type: 'rich-text', text: 'Same edit, any shape',
font: { family: 'Open Sans', size: 64, weight: '700', color: '#ffffff' },
align: { horizontal: 'center', vertical: 'middle' } },
start: 0, length: 5, width: 900, height: 300, position: 'center' }] },
{ clips: [{
asset: { type: 'video', src: 'https://shotstack-assets.s3.ap-southeast-2.amazonaws.com/footage/beach-overhead.mp4' },
start: 0, length: 5, fit: 'crop' }] }
]
};
const outputs = {
'vertical-9x16': { format: 'mp4', resolution: '1080', aspectRatio: '9:16' }, // TikTok, Reels, Shorts, Stories
'feed-4x5': { format: 'mp4', resolution: '1080', aspectRatio: '4:5' }, // feed posts
'square-1x1': { format: 'mp4', resolution: '1080', aspectRatio: '1:1' },
'pin-2x3': { format: 'mp4', size: { width: 1080, height: 1620 } }, // no 2:3 preset, so use size
'landscape-16x9':{ format: 'mp4', resolution: '1080', aspectRatio: '16:9' } // YouTube, LinkedIn, X
};
for (const [name, output] of Object.entries(outputs)) {
const res = await fetch(`${API}/render`, { method: 'POST', headers, body: JSON.stringify({ timeline, output }) });
const { response } = await res.json();
let status;
do {
await new Promise(r => setTimeout(r, 5000));
status = (await (await fetch(`${API}/render/${response.id}`, { headers })).json()).response;
} while (!['done', 'failed'].includes(status.status));
console.log(name, status.status, status.url ?? status.error);
}
Save it as render-sizes.mjs and run node render-sizes.mjs. We ran it as shown. All five renders finished, and ffprobe read them as 1080 × 1920, 1080 × 1350, 1080 × 1080, 1080 × 1620 and 1920 × 1080, each 5 seconds at 25 fps. Stage renders carry a Shotstack watermark. Switch the URL to the production environment for clean files.
The fit property on each clip decides what happens when the source’s shape differs from the output. The API reference defines four options:
crop (the default) scales the source to fill the frame and crops whatever spills over.contain fits the whole source inside the frame, which leaves empty space at the sides or top and bottom.cover stretches the source to fill the frame without keeping its ratio.none keeps the source’s own pixel size.crop is usually right for social video, but check the numbers. The test clip above is 1280 × 720. To fill a 9:16 frame, crop keeps a 405 × 720 slice from the middle (about 32% of the width) and scales it up about 2.7 times to reach 1920 px tall.
Anything near the left or right edge of a landscape source disappears, and low-resolution sources go soft. If most of your output is vertical, start from vertical or higher-resolution footage.
Text and image sizes are set in pixels, so a 64 px title takes up a much larger share of a 1080-wide vertical frame than of a 1920-wide landscape one. Check the vertical render first, because that frame is the narrowest.
You now have the sizes each platform asks for, the frame rate window they share, and the exact output setting that produces each one. Because the shape is an output property, not a timeline property, one edit can be rendered to every placement without touching the clips.
Sign up for a free Shotstack API key and run the script above on the sandbox. Five renders later you will have the same video in every shape your channels need.
Render 9:16 at 1080 × 1920. It sits inside the limits published by TikTok’s posting API, Instagram’s Graph API, Meta’s ad guides and YouTube’s Shorts rules. In Shotstack that is "resolution": "1080", "aspectRatio": "9:16".
For every ratio except 16:9, the preset’s number sets the short side. 1080 with 4:3 renders 1080 × 810. To get 1440 × 1080, set "size": {"width": 1440, "height": 1080} instead of a preset.
Yes, with "resolution": "4k" or a custom size. Any output above 1920 × 1080 pixels, including 1440 × 2560, needs a plan that includes 4K, and the maximum is 3840 × 2160 pixels in any orientation.
With the default fit: "crop", Shotstack scales the clip to fill the frame and crops the sides. A 1280 × 720 source keeps about a third of its width in a 9:16 frame. Use contain to keep the whole picture with empty space, or start from vertical footage.
Platform limits in the reference table come from these pages, checked in October 2026.
curl --request POST 'https://api.shotstack.io/v1/render' \
--header 'x-api-key: YOUR_API_KEY' \
--data-raw '{
"timeline": {
"tracks": [
{
"clips": [
{
"asset": {
"type": "video",
"src": "https://shotstack-assets.s3.amazonaws.com/footage/beach-overhead.mp4"
},
"start": 0,
"length": "auto"
}
]
}
]
},
"output": {
"format": "mp4",
"size": {
"width": 1280,
"height": 720
}
}
}'Published October 26, 2026
Jesus Rojas is a Growth Engineer at Shotstack, combining engineering and experimentation to help developers adopt video APIs. He builds onboarding experiences, lifecycle automation and analytics. Outside work, he enjoys making music and plays several instruments. More from Jesus
