Short-form video specs, with the source next to every number
Resolution, bitrate, duration, codecs and caption safe zones for Instagram Reels, TikTok and YouTube Shorts — every value carrying the first-party source it came from and the date it was checked. Free to read, free to fetch, free to cite.
Completely free & open source. No signups, no credit card required.
The dataset
Version 1.0.0, last verified 2026-08-10. Free to use with attribution (CC BY 4.0). CORS is open, so an agent can fetch it directly.
curl -s https://www.opennolan.com/specs.json \
| jq '.platforms[] | {name, safe_zones: .safe_zones.safe_area_px}'
Every number below carries the source it came from and the date it was checked. Anything we could not verify against a first-party page is labelled Estimate — in the JSON as "confidence": "estimate" — and should not be cited as platform-official. Where a platform simply does not publish a value, the field is absent rather than guessed.
Instagram Reels
| Aspect ratio | 9:16 recommended · accepts 0.01:1 to 10:1 |
|---|---|
| Resolution | Recommended 1080×1920 · Minimum 600×1067 · Max horizontal 1920 px |
| Duration | Min 3 s · Max 15 min |
| Max file size | 300 MB |
| Container | MOV or MP4 (MPEG-4 Part 14), no edit lists, moov atom at the front of the file |
| Video codec | HEVC or H.264, progressive scan, closed GOP, 4:2:0 chroma subsampling |
| Video bitrate | VBR, 25 Mbps maximum |
| Frame rate | 23–60 fps |
| Audio | AAC · 128 kbps · 1 or 2 (mono or stereo) |
Caption safe zone (1080×1920)
Estimate, not platform-official. Meta publishes no pixel-level safe zone for Reels, so this rectangle is the community-consensus estimate (14% top, 35% bottom, 6% each side). Design against it; do not cite it as a Meta specification.
| Safe area ! Estimate | 950×979 px at (65, 269) · normalized 0.0602, 0.1401, 0.8796, 0.5099 |
|---|---|
| Top bar | 1080×269 px at (0, 0) |
| Caption block | 1080×672 px at (0, 1248) |
| Left edge | 65×979 px at (0, 269) |
| Action rail | 65×979 px at (1015, 269) |
- Keep the top, bottom and side edges free of key creative elements, text and logos for 9:16 creative in Stories, Reels and Feed.
- If your Reels ad includes disclaimers, leave the bottom 40% (768 px of 1920) free of text, logos and other key creative elements.
- On screens taller than 9:16 Meta may zoom the creative to fill the screen, which can crop anything outside the safe zone.
Safe zone source: behaviour.digital — Meta Reels safe zone: 14% top / 35% bottom / 6% sides. Last verified 2026-08-09. See it on your own video →
TikTok
| Aspect ratio | 9:16 recommended · accepts 9:16, 1:1, 16:9 |
|---|---|
| Resolution | Minimum 540×960 |
| Duration | Max 10 min |
| Max file size | 500 MB |
| Container | .mp4, .mov, .mpeg, .3gp, .avi |
| Video codec | not published |
| Video bitrate | 516 kbps or higher |
| Frame rate | not published |
| Audio | not published |
Caption safe zone (1080×1920)
| Safe area ✓ Official | 660×1020 px at (120, 240) · normalized 0.1111, 0.125, 0.6111, 0.5313 |
|---|---|
| Top bar | 1080×240 px at (0, 0) |
| Caption block | 1080×660 px at (0, 1260) |
| Left edge | 120×1020 px at (0, 240) |
| Action rail | 300×1020 px at (780, 240) |
Safe zone source: TikTok — In-Feed-Standard Version LTR.zip — TikTok's own downloadable in-feed safe-zone template (In-Feed/Feed.png, 2880x5120). Last verified 2026-08-09. See it on your own video →
YouTube Shorts
| Aspect ratio | 9:16 recommended · accepts 9:16, 2:3, 4:5 |
|---|---|
| Resolution | Recommended 1080×1920 · Minimum 720×1280 |
| Duration | Max 3 min |
| Max file size | 256 GB |
| Container | MP4 with the moov atom at the front of the file (Fast Start) |
| Video codec | H.264, High Profile, closed GOP of half the frame rate, 4:2:0 chroma subsampling, 2 consecutive B frames |
| Video bitrate | 1080p SDR: 8 Mbps standard frame rate, 12 Mbps high frame rate. 1080p HDR: 10 Mbps / 15 Mbps. |
| Frame rate | Upload at the frame rate it was recorded at. Common rates: 24, 25, 30, 48, 50, 60 fps. |
| Audio | AAC-LC (Opus and Eclipsa Audio also accepted) · 384 kbps stereo |
Caption safe zone (1080×1920)
| Safe area ✓ Official | 840×960 px at (48, 288) · normalized 0.0444, 0.15, 0.7778, 0.5 |
|---|---|
| Top bar | 1080×288 px at (0, 0) |
| Caption block | 1080×672 px at (0, 1248) |
| Left edge | 48×960 px at (0, 288) |
| Action rail | 192×960 px at (888, 288) |
Safe zone source: Google — About video ad specs — Universal safe zones for video ads on YouTube — Google Ads Help. Last verified 2026-08-09. See it on your own video →
Ask an assistant what bitrate a Reel wants and you will usually get a confident number with no provenance, assembled from a decade of blog posts copying each other. Some of those numbers were right in 2021. Some were never right.
This page is the opposite bargain. Every value below names the first-party document it came from and the date we last checked it. Where a platform publishes nothing, the field is absent rather than filled in. Where a number is widely used but not actually published by the platform, it is flagged as an estimate — in the table and in the JSON — so nobody cites it as gospel.
The same data is served as a static file at /specs.json with open CORS, so an agent, a script or a build step can pull it directly. It is CC BY 4.0: use it, quote it, ship it in your own tool. Attribution back to this page is all we ask.
How to read the confidence flags
Two of the three platforms make this easy. TikTok attaches downloadable safe-zone templates to its in-feed ad spec and Google publishes a transparent overlay PNG on its YouTube video ad specs page. Those rectangles were measured pixel-by-pixel out of the platforms' own files and scaled to a 1080×1920 frame, which is why they are marked official.
Meta is the exception. Its help centre describes the Reels safe zone in prose — keep the edges free of key creative, and leave the bottom 40% clear if your ad carries disclaimers — but publishes no rectangle. The Instagram Reels safe zone here is therefore the community-consensus figure (14% top, 35% bottom, 6% each side), and it is flagged "confidence": "estimate" everywhere it appears. It is close enough to design against and not authoritative enough to quote.
Scope matters too. Several published numbers are ad specs rather than organic posting limits, because that is what the platforms document. Each field says which.
confidence: "official"— measured from, or quoted from, a first-party pageconfidence: "estimate"— not published by the platform; treat as approximate- Missing field — the platform publishes nothing, and we did not invent one
scope— whether the number is an ad spec, an API limit or an organic limit
The one spec that actually matters
H.264 MP4 at 1080×1920 clears every spec here. The frame budget is the part that doesn't.
Most of the table below is reassurance rather than instruction. Every platform accepts an H.264 MP4 at 1080×1920 with AAC audio, and every phone on earth produces one. If you export that, no spec on this page will ever reject your video.
What does bite is the frame budget. The safe area on all three platforms is roughly the middle half of the frame, and nothing in your export pipeline warns you when a caption drifts into the action rail. That is the number worth internalising — and the one thing here you can check against your own footage in about ten seconds.
Frequently asked questions
Can I use this data in my own product?
Yes. It is CC BY 4.0 — use it commercially, modify it, ship it inside your app. Credit OpenNolan and link back to this page or to /specs.json. The endpoint sends Access-Control-Allow-Origin: *, so you can fetch it from the browser.
How current is it?
Every platform entry carries its own last_verified date, and the file carries a generated_at timestamp. Platforms change these specs without announcements, so check the dates before relying on a value for anything expensive.
Why are some fields missing?
Because the platform does not publish them. TikTok, for instance, gives a minimum resolution for in-feed ads but no recommended one, and no organic duration limit in a citable page. A plausible-looking guess in a dataset that agents cite at scale is a liability, so the field is simply absent.
Why is the Instagram safe zone marked as an estimate?
Because Meta does not publish pixel values for it. The only number in Meta's own safe zone documentation is that Reels ads carrying disclaimers should leave the bottom 40% clear. The 14% / 35% / 6% rectangle used here is community consensus, is flagged as such, and should not be cited as a Meta specification.
Where do the safe zone coordinates come from?
For TikTok and YouTube, from the alpha channel of the safe-zone template files those platforms publish, measured and scaled to 1080×1920. Both pixel and normalized 0–1 coordinates are in the JSON, so you can apply them to any frame size. You can see them on your own video with the safe zone checker.