API GuidesAugust 4, 202610 min readingMarcel Czuryszkiewicz

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.

A strip of 35mm Kodak E100 film showing three consecutive frames of the same flowers, each one framed slightly differently
One source file, fifteen different crops. That is the actual job.

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 typeMax imagesMax sizeAspect ratioNotes
Facebook Post44 MB0.01 to 1.91Images and video cannot be mixed in one post
Facebook Story14 MB0.01 to 1.67
Instagram Post108 MB0.8 to 1.91Carousel. Auto-fit or auto-crop relaxes the ratio bounds
Instagram Story18 MB0.01 to 1.67
TikTok (photo post)1020 MBanyPhoto mode. Cannot be combined with video
X45 MBany
LinkedIn105 MBany, min 200 × 200 px
YouTubenot supported--Video only
Pinterest15 MBanyOne pin, one media item
Reddit1020 MBanyGallery post
Threads108 MB0.01 to 1.91, 320 to 1440 px wide
Bluesky42 MBanyTightest image limit of any platform here
Mastodon416 MBanyInstance-dependent, this is the common default
Discord1025 MB0.01 to 1.91Non-boosted server limit
Slack41 GB0.01 to 1.91
Google Business Profile15 MBany, min 250 × 250 px
Snapchat Story1100 MBany

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 typeMax sizeDurationAspect ratioMax bitrate
Facebook Post-up to 20 min0.01 to 1.9145 Mbps
Facebook Reel-3 s to 20 min0.01 to 1.67, min 540 × 96045 Mbps
Facebook Story-3 s to 60 s0.01 to 1.67, min 540 × 96025 Mbps
Instagram Post-3 s to 15 min0.01 to 10, max 1920 px wide45 Mbps
Instagram Reel-3 s to 15 min0.01 to 10, max 1920 px wide45 Mbps
Instagram Story100 MB3 s to 60 s0.01 to 1.6725 Mbps
TikTok1 GBup to 10 min0.01 to 1.78, 360 to 4096 px-
X512 MB0.5 s to 2:20, or 10 min on Premium0.33 to 3-
LinkedIn2 GB3 s to 30 min0.42 to 2.4, 256 × 144 to 4096 × 4096-
YouTube (video)256 GBup to 4 hours0.33 to 3-
YouTube (Short)256 GBup to 3 min0.33 to 1-
Pinterest2 GB4 s to 15 min0.5 to 1.91-
Reddit1 GB4 s to 15 min0.5625 to 1.78-
Threads1 GB-0.01 to 1.91100 Mbps
Bluesky100 MB-any-
Mastodon99 MB-0.33 to 1-
Discord25 MB-0.01 to 1.91-
Slack1 GB-0.01 to 1.91-
Snapchat100 MB5 s to 3 minmin 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.

A workshop wall with a hand plane on a shelf and chisels in a rack, next to a hand-drawn furniture plan and order sheets pinned up beside them
Every platform keeps its own spec sheet, and none of them match.

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

Two empty baggage belts at an airport check-in desk, with panels of baggage and dangerous-goods rules posted above them in German and English
Check at the desk, not at the gate.

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.

Marcel Czuryszkiewicz
Written by

Marcel Czuryszkiewicz

Co-Founder

Marcel is one of the builders behind bundle.social, creating a social media API with a strong focus on developer experience, reliability, and real support. Before bundle.social, he worked at Samsung R&D, Reply AI, and Docplanner, building internal tools that helped companies grow. He brought that same practical, product-focused mindset to bundle.social, so you can trust that your project is in good hands.