Social Media API Media Requirements
Every guide to social media specs is written for designers: pixels and recommended dimensions. An integration needs different numbers. This is the file size, aspect ratio, duration, bitrate and MIME table for 15 platforms and every post type, pulled from the validator that rejects our own uploads.
Every social media API rejects media for its own reasons, and the numbers that matter to an integration are not the numbers in a design guide. Your validator needs maximum file size in bytes, minimum and maximum aspect ratio as a number, duration in seconds, bitrate, and the exact MIME types a platform accepts. This page has all of it for 15 platforms, split by post type, because the same image that passes as an Instagram Story fails as an Instagram Post.

How to read these tables
Four conventions, so you do not have to guess.
Aspect ratio is given as a number, not a ratio. Documentation says "9:16", code compares 0.5625. Both are in the tables. Width divided by height, always. A portrait video is below 1, landscape is above 1.
File size is in MB, meaning 1024 × 1024 bytes. Some platforms document MiB and some document MB and mean MiB. Where it matters, we round down.
"Max files: 0" is not a typo. It means the minimum is zero: the platform accepts a text-only post. Where the minimum is 1, media is mandatory and a text-only call fails validation.
Some rules are the platform's, some are ours. We mark the second kind. The distinction matters when you are debugging, because a limit imposed by an intermediary is a support conversation and a limit imposed by Meta is not.
Image requirements by platform
Verified 02.08.2026.
| Platform / post type | Max images | Max size | Aspect ratio | Notes |
|---|---|---|---|---|
| Facebook Post | 4 | 4 MB | 0.01 to 1.91 | Images and video cannot be mixed in one post |
| Facebook Story | 1 | 4 MB | 0.01 to 1.67 | |
| Instagram Post | 10 | 8 MB | 0.8 to 1.91 | Carousel. Auto-fit or auto-crop relaxes the ratio bounds |
| Instagram Story | 1 | 8 MB | 0.01 to 1.67 | |
| TikTok (photo post) | 10 | 20 MB | any | Photo mode. Cannot be combined with video |
| X | 4 | 5 MB | any | |
| 10 | 5 MB | any, min 200 × 200 px | ||
| YouTube | not supported | - | - | Video only |
| 1 | 5 MB | any | One pin, one media item | |
| 10 | 20 MB | any | Gallery post | |
| Threads | 10 | 8 MB | 0.01 to 1.91, 320 to 1440 px wide | |
| Bluesky | 4 | 2 MB | any | Tightest image limit of any platform here |
| Mastodon | 4 | 16 MB | any | Instance-dependent, this is the common default |
| Discord | 10 | 25 MB | 0.01 to 1.91 | Non-boosted server limit |
| Slack | 4 | 1 GB | 0.01 to 1.91 | |
| Google Business Profile | 1 | 5 MB | any, min 250 × 250 px | |
| Snapchat Story | 1 | 100 MB | any |
The two numbers that catch people: Bluesky at 2 MB and Facebook at 4 MB. A photo straight off a phone clears both by a wide margin, so a pipeline that works in testing with a downloaded stock image fails on the first real customer upload. Resize before you send, not after the rejection.
Video requirements by platform
| Platform / post type | Max size | Duration | Aspect ratio | Max bitrate |
|---|---|---|---|---|
| Facebook Post | - | up to 20 min | 0.01 to 1.91 | 45 Mbps |
| Facebook Reel | - | 3 s to 20 min | 0.01 to 1.67, min 540 × 960 | 45 Mbps |
| Facebook Story | - | 3 s to 60 s | 0.01 to 1.67, min 540 × 960 | 25 Mbps |
| Instagram Post | - | 3 s to 15 min | 0.01 to 10, max 1920 px wide | 45 Mbps |
| Instagram Reel | - | 3 s to 15 min | 0.01 to 10, max 1920 px wide | 45 Mbps |
| Instagram Story | 100 MB | 3 s to 60 s | 0.01 to 1.67 | 25 Mbps |
| TikTok | 1 GB | up to 10 min | 0.01 to 1.78, 360 to 4096 px | - |
| X | 512 MB | 0.5 s to 2:20, or 10 min on Premium | 0.33 to 3 | - |
| 2 GB | 3 s to 30 min | 0.42 to 2.4, 256 × 144 to 4096 × 4096 | - | |
| YouTube (video) | 256 GB | up to 4 hours | 0.33 to 3 | - |
| YouTube (Short) | 256 GB | up to 3 min | 0.33 to 1 | - |
| 2 GB | 4 s to 15 min | 0.5 to 1.91 | - | |
| 1 GB | 4 s to 15 min | 0.5625 to 1.78 | - | |
| Threads | 1 GB | - | 0.01 to 1.91 | 100 Mbps |
| Bluesky | 100 MB | - | any | - |
| Mastodon | 99 MB | - | 0.33 to 1 | - |
| Discord | 25 MB | - | 0.01 to 1.91 | - |
| Slack | 1 GB | - | 0.01 to 1.91 | - |
| Snapchat | 100 MB | 5 s to 3 min | min 540 × 960 | - |
X's duration limit depends on the account's subscription: 2 minutes 20 seconds on free and Basic, 10 minutes on Premium and Premium+. If you are building for other people's accounts, you cannot hardcode either number.

Where the platforms diverge most
Four places where the spread is wide enough to shape your architecture.
File size spans five orders of magnitude. Bluesky caps images at 2 MB. YouTube accepts a 256 GB video. If your upload pipeline has one code path, it is either too fragile for YouTube or too heavy for Bluesky. Ours splits: a normal publish gets a 15-minute budget, a YouTube upload gets 60 minutes with a heartbeat and a resumable session.
Aspect ratio bounds disagree about what a video even is. Reddit accepts 0.5625 to 1.78, roughly 9:16 through 16:9, which is a reasonable definition of "video". Instagram Reels accept 0.01 to 10, which is a definition of "almost anything". Threads and Facebook feed posts cap at 1.91, which quietly excludes true 16:9 landscape at 1.78... no, it permits it, but a 2:1 cinematic crop fails. Check the number, not the vibe.
Minimum duration is a real thing and it bites. Facebook and Instagram both require 3 seconds minimum. Snapchat requires 5. Pinterest and Reddit require 4. A 2-second loop, which is a completely normal piece of social content, is rejected by six of these platforms and accepted by the rest. There is no warning in most documentation.
Bitrate is only enforced by some. Meta enforces it: 45 Mbps for feed and Reels, 25 for Stories. Threads documents 100 Mbps, which is not a typo and is unusually generous. Most other platforms transcode instead of rejecting. If you send a 60 Mbps file to Instagram, it fails. Send it to LinkedIn and it gets re-encoded.
bundle.social
Fifteen validators behind one endpoint. We already wrote them.
We transcode and validate against every target platform before anything is queued.
Rules that are not about file size
Half the rejections we see are not about bytes at all.
TikTok is either photos or video, never both. A photo post takes 1 to 10 images. A video post takes exactly 1 video. There is no mixed post, and the API surfaces this as a parameter error rather than something readable.
LinkedIn accepts PDFs, nobody else does. One document, up to 100 MB, application/pdf only. It is the "carousel document" post type, and it is the only place in this whole table where a non-image, non-video file is valid.
Facebook feed posts will not mix images and video. Four images, or one video. Instagram will mix them in a carousel. The two platforms are owned by the same company and share a Graph API, and they disagree on this.
Pinterest and Google Business Profile take exactly one media item. Not "up to one". Pinterest requires one, GBP allows zero or one. If your abstraction assumes arrays everywhere, these two are where it leaks.
Minimum resolution exists on four platforms. LinkedIn images need 200 × 200. Google Business Profile needs 250 × 250. Facebook Reels and Stories need 540 × 960. TikTok needs 360 × 360. A thumbnail that works everywhere else fails on these.
Instagram feed images have a tighter ratio than Instagram Stories. 0.8 to 1.91 for a feed post, 0.01 to 1.67 for a Story. The same portrait image can pass one and fail the other. This is the single most common cross-platform surprise in the whole set, and it is why our validator takes post type, not just platform.
Validate before you upload

The cheapest rejection is the one that happens on your side. Probing a file locally costs milliseconds. Discovering the same problem after a 2 GB upload costs the upload, the customer's time, and a support ticket.
ffprobe -v error \ -select_streams v:0 \ -show_entries stream=width,height,duration,bit_rate,codec_name \ -show_entries format=size,format_name \ -of json input.mp4
{ "streams": [ { "codec_name": "h264", "width": 1080, "height": 1920, "duration": "2.400000", "bit_rate": "8412000" } ], "format": { "size": "2523600", "format_name": "mov,mp4,m4a,3gp,3g2,mj2" } }
That file is 1080 × 1920, aspect ratio 0.5625, 2.4 seconds, 8.4 Mbps, 2.4 MB. Against the tables above: it passes on TikTok, X, LinkedIn and Reddit. It fails on Facebook and Instagram, both of which require 3 seconds minimum. Nothing about the file looks wrong. It is 0.6 seconds too short for half your fan-out.
Two rules that save the most time:
Validate against the narrowest target in the fan-out, then decide. If a post goes to six platforms and one of them rejects, you have to choose between failing the whole post and publishing partially. Make that choice explicit in your API, because the default will be wrong for somebody.
Never trust the client's metadata. Width, height and duration reported by a browser upload widget are frequently wrong, and a rotated video reports its pre-rotation dimensions. Probe the file server-side after it lands.
When something does get through and the platform rejects it anyway, the response is not always what you expect. Some of those failures are retryable, some are terminal, and some are lies. That is covered in social media API error handling.
The shorter path
Fifteen platforms, roughly forty distinct rule sets once you split by post type, and every one of them changes without notice. Keeping this table accurate is a job, and it is a job that produces no product.
bundle.social's media upload API takes one file and one list of target platforms. Validation happens before anything is sent, the errors name the platform and the rule that failed, and the transcoding for platforms that need it is not your problem. The tables above are what we maintain so you do not have to.
Frequently asked questions
What is the maximum image size for social media APIs?
It ranges from 2 MB on Bluesky to 1 GB on Slack. The practical planning number is 4 MB, because that is Facebook's limit and Facebook is usually in the fan-out. Resize to fit the smallest target rather than sending different files to different platforms.
Why does the same video pass on TikTok and fail on Instagram?
Almost always minimum duration. Facebook and Instagram require 3 seconds; TikTok has no minimum. The second most common cause is bitrate: Meta enforces 45 Mbps and rejects above it, while most other platforms transcode instead. Meta publishes its side in the Pages API posts reference and the Instagram content publishing guide.
How do I convert an aspect ratio like 9:16 into a number?
Divide width by height. 9:16 is 0.5625, 4:5 is 0.8, 1.91:1 is 1.91. Every bound in the tables above is width over height, so anything below 1 is portrait.
Can I post images and video in the same post?
On Instagram, yes, in a carousel. On Facebook feed posts, no: four images or one video. On TikTok, no: a post is either photo mode or video. There is no consistent answer, which is why the tables split by post type.
Do these limits come from the platforms or from bundle.social?
Both, and the article marks which. Sizes, durations and aspect ratios are the platform's. Where we impose something narrower it is because the platform accepted the upload and then failed at publish time, which is worse than a clean rejection.