WhatsApp video size limit, in the app and the Business API
The app and the WhatsApp Business Platform have very different limits. What each one allows, the free ways to send a large video in the app, what the Cloud API accepts and how to get a video under its 16 MB limit, and when an automated step before upload is worth paying for.
WhatsApp and Meta pages checked, commands tested and our tool's run made on 28 October 2026 (ffmpeg 8.1.2).
Two kinds of reader search for this. Most use the WhatsApp app: a video will not send, or it arrives soft and blurry. The others send video from code or an automation through the WhatsApp Business Platform (the Cloud API), where the limit is much lower and, according to Meta's documentation, an oversized or unsupported file is not accepted. The answers are different, so this guide takes them in turn. The app half needs no paid tool at all.
Disclosure: Quarrywise, the publisher of this site, built and sells the Apify Actor described near the end. Everything before that section is free and needs nothing from us.
The limits, side by side
Every figure below comes from WhatsApp's Help Center or Meta's developer documentation, read on 28 October 2026. The app figures are from the Android tab of WhatsApp's article on sending media; the same article has tabs for iPhone, web, Windows and Mac. Limits change, so check the linked page if you read this much later.
| Where | Limit | Source |
|---|---|---|
| App, video sent as video (faster connection) | 100 MB by default, 720p | WhatsApp Help Center |
| App, video sent as video (slower connection) | 64 MB by default, 480p | WhatsApp Help Center |
| App, file sent as a document | 2 GB | WhatsApp Help Center |
| App, Status | 90 seconds at most; no HD option | WhatsApp Help Center |
| Business Platform (Cloud API), video you send | 16 MB, MP4 or 3GP only, H.264 video and AAC audio | Meta developer docs |
| Business Platform (Cloud API), media you receive | up to 100 MB | Meta developer docs |
You will still see 16 MB quoted as the app's video limit on many pages. WhatsApp's own help page now gives the higher figures above for the app. The 16 MB number lives on in the Business API.
Sending a large video in the app
WhatsApp's help page warns that media you share is usually compressed, so it can look worse than the original. You have three free options, in this order:
- Turn on HD. After you attach a video, WhatsApp lets you pick Standard quality or HD quality before you send. Choose HD for a sharper result within the video limits above.
- Send it as a document. In a chat, tap the paper clip, then Document, and pick the video file. WhatsApp's help page gives 2 GB as the maximum for documents. The recipient gets it as a file in the chat, like a PDF, rather than a preview that plays inline.
- Trim it. Cut the video shorter in your phone's gallery or a video editor before you attach it. A shorter clip is a smaller file and gets more bits per second at the same limit.
WhatsApp's page also lists the formats a video should be in: 3GP, AVI, FLV, MKV, MOV or MP4, and notes that very high audio sample rates or professional camera files may not be supported.
The menu names above are from the Android instructions. On an iPhone or a computer the steps are similar; the same help article has a tab for each, so check yours if a button is not where we describe it.
When this is enough: almost always, for anyone sending from the app. WhatsApp compresses shared media itself, so compressing a video yourself first mainly helps when the file is over the limit.
WhatsApp Status: length and quality
For Status the limit that matters is length, not size: WhatsApp's help page says Status videos can be at most 90 seconds, and that HD is not available for Status updates. So "compressing a video for Status" really means trimming it. To cut a longer video into a 90-second piece on a computer, this ffmpeg command (tested on a 96-second file) gives a file of exactly 90.0 seconds:
ffmpeg -ss 0 -i input.mp4 -t 90 -c:v libx264 -preset medium -crf 23 -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart status-part1.mp4
Change -ss 0 to -ss 90 for the second part, -ss 180 for
the third, and so on. The command re-encodes the video so the cut lands exactly at 90 seconds;
cutting with -c copy is faster but can only cut at keyframes, so a part can come out a
little longer than 90 seconds. -pix_fmt yuv420p keeps the output 8-bit 4:2:0, the format phones
play most widely.
A note on HDR phone video: neither command in this guide tone-maps HDR, so a 10-bit HDR clip comes out 8-bit, but its colours can look washed out or wrong. If your phone records HDR, turn it off for clips you will share, or convert the colour first.
WhatsApp Business API: size limit, formats and the error you get
Meta's media reference for the Cloud API lists two video types you can upload:
| Video type | Extension | MIME type | Maximum size |
|---|---|---|---|
| MP4 video | .mp4 | video/mp4 | 16 MB |
| 3GPP | .3gp | video/3gpp | 16 MB |
The same page makes four further points (checked 28 October 2026):
- Only the H.264 video codec and the AAC audio codec are supported, with one audio stream or none.
- Videos encoded with the H.264 "High" profile and B-frames are not supported by Android WhatsApp clients. Meta recommends the "Main" profile without B-frames, or the "Baseline" profile.
- Putting the MP4 index (the
moovbox) before the media data helps compatibility; with ffmpeg that is-movflags faststart. - Uploaded media is kept for 30 days unless you delete it earlier, and the media IDs the upload returns expire after 30 days.
You upload with POST /<PHONE_NUMBER_ID>/media, sending the file, its MIME
type as type and messaging_product set to whatsapp, then
send a message that uses the returned media ID.
The error. Meta's error-code list has 131053, "Unable to upload the media used in the message", for media that could not be uploaded, for example because of an unsupported media type. Its advice is to inspect the rejected file and confirm that its MIME type is supported. For a video you send, the list has no separate code for a file that is too large, so treat 131053 as "check the size, the container and the codecs". A mismatch between the file extension and the real file type is the other common cause, according to the media reference.
For media a customer sends you, there is a size-specific error: the media reference documents a webhook with error 131052 and the title "Media file size too big. Max file size we currently support: 100MB" for received media over 100 MB.
We did not upload anything to the Cloud API for this guide. The upload step and these error codes come from Meta's documentation, not from our own tests; that an oversized video gives 131053 is our reading of that list, not something we observed.
Meta does not say on that page whether 16 MB means 16,000,000 bytes or 16 × 1,048,576. Stay under 16,000,000 bytes and the file fits either way.
Fitting a video under 16 MB with ffmpeg
A file's size is its bitrate times its length, so the right bitrate can be worked out before you encode. Our guide to compressing a video to 8, 10, 25, 50 or 100 MB explains the formula in detail. For 16 MB:
- Video kb/s = 16 × 8,000 ÷ seconds, minus the audio kb/s, then about 5% off for the MP4 index and the encoder overshooting.
- For a 96-second clip: 16 × 8,000 ÷ 96 = 1,333 kb/s in all. Minus 128 kb/s of audio is 1,205, minus 5% is about 1,145. We used 1,140 kb/s.
- 1,140 kb/s is enough for 720p (from about 1,000 kb/s at 30 fps) but not for 1080p (from about 2,200), so encode at 720p.
We tested this on a 96.1-second, 1080p, 30 fps file made by looping our 12-second
sample video eight times (49.5 MB). This
two-pass command also follows every condition on Meta's media page: H.264 Main profile, no
B-frames (-bf 0), 8-bit 4:2:0 colour, AAC audio, one audio stream, index first:
ffmpeg -y -i input.mp4 -c:v libx264 -preset medium -profile:v main -bf 0 -pix_fmt yuv420p -b:v 1140k -vf scale=-2:720 -pass 1 -an -f mp4 /dev/null
ffmpeg -y -i input.mp4 -c:v libx264 -preset medium -profile:v main -bf 0 -pix_fmt yuv420p -b:v 1140k -vf scale=-2:720 -pass 2 -c:a aac -b:a 128k -movflags +faststart output.mp4
The result was 15,261,460 bytes, 4.6% under 16,000,000, at 1280×720. ffprobe
reported the Main profile and no B-frames, and the moov box sits before the media data.
Both passes took about 14 seconds on a desktop PC.
- Replace
1140kwith your own number from the formula and720with the height your bitrate can carry. For a portrait phone video, put the number on the width:scale=720:-2. - In Windows PowerShell or Command Prompt, write
NULinstead of/dev/nullin the first pass. - Check the size before you upload. If it is over, lower
-b:vby a few percent and run both passes again.
How long a video can be and still look reasonable at 16 MB, for a 16:9 source at 30 fps with stereo audio. We computed these with our Actor's own planning code (the same bitrate floors and a 3% margin), not by encoding every case:
| Limit | 1080p up to | 720p up to | 480p up to | Watchable at all up to |
|---|---|---|---|---|
| 16 MB | 53 s | 1 min 52 s | 3 min 53 s | 12 min 32 s (at 240p) |
When this is enough: you have a server or a machine where ffmpeg can run before the upload, and you can add a size check and a retry yourself. That is free and does exactly what Meta asks.
Automating it before upload: our Actor in Make, n8n or code
The free route needs somewhere to run ffmpeg and someone to maintain the arithmetic and the
retry. That is harder in Make, Zapier or n8n Cloud, where you cannot install ffmpeg. For that case
we built
Compress Video to Size: Under 10 MB, 25 MB or Any
on the Apify Store. You give it links to video files (or upload them) and a limit; it has a
whatsapp-16 preset for 16 MB. It:
- treats the limit as decimal MB (16,000,000 bytes), aims about 3% under it, encodes in two
passes, checks the finished file and redoes it smaller if it is even one byte over, up to three
encodes, so
output_bytesis never abovetarget_bytes; - returns a
within_limitflag to branch on, and a download link (output_url); - writes re-encoded videos as MP4 with H.264 video and one AAC audio track, with the index
first, and with
whatsapp-16in the H.264 Main profile without B-frames, which Android WhatsApp clients play (details below); - refuses a limit too small for a watchable picture, charges nothing, and gives the smallest limit that would work.
The encoding Android WhatsApp clients need. Since version 0.2.5 (28 October
2026), the whatsapp-16 preset follows the conditions on Meta's media page: H.264 Main
profile without B-frames, 8-bit 4:2:0 colour (yuv420p), AAC audio and the index first.
Two details matter:
- A video under 16 MB is copied without re-encoding only when it already meets those rules: H.264
Main or Baseline profile without B-frames,
yuv420p, and AAC audio or none. Anything else, such as a High-profile phone clip, HEVC, 10-bit or HDR video, or MP3 audio, is re-encoded and charged per second like any compressed video, and the row'snotesays why. - The rules come with the preset, not with the size. A
customlimit of 16 MB uses the Actor's general encoding, H.264 High profile with B-frames, so for the Business API choosewhatsapp-16. With the preset the video is always H.264, even if you choose AV1.
Versions before 0.2.5 encoded this preset with the High profile and B-frames and copied files that already fitted as they were, so outputs from runs before 28 October 2026 may not play on Android. The free ffmpeg command above gives the same Main-profile encoding when you can run ffmpeg yourself.
A real run with the WhatsApp preset
We ran version 0.2.5 on 28 October 2026 with our public 12-second 1080p sample video (6.2 MB), the other options at their defaults:
{
"videoUrls": ["https://quarrywise.com/samples/fit-to-size-test-1080p.mp4"],
"target": "whatsapp-16"
}
The sample already fits under 16 MB, but it is H.264 High profile with B-frames, so the Actor re-encoded it instead of copying it. The run took 36.7 seconds at the default 4 GB of memory, 28 of them encoding. An excerpt of the dataset row:
{
"status": "compressed",
"within_limit": true,
"target": "whatsapp-16",
"target_bytes": 16000000,
"input_bytes": 6184974,
"output_bytes": 6243037,
"reduction_percent": -0.9,
"duration_seconds": 12,
"billed_seconds": 12,
"resolution": "1920x1080",
"codec": "h264",
"video_kbps": 3986,
"audio_kbps": 128,
"passes": 2,
"attempts": 1,
"quality": "good",
"note": "The original already fitted, but it was re-encoded to the encoding WhatsApp needs (H.264 Main profile without B-frames, AAC audio), which Android phones play. The new file is not smaller than the original."
}
ffprobe on the output reported H.264 Main profile, level 4.0, no B-frames
(has_b_frames 0), yuv420p, and AAC LC audio at 48 kHz, mono. The budget
allowed full 1080p, and because a small file is not blown up to fill a large limit, the video got
about the bitrate the original had. So the new file is 0.9% larger than the original, as the note
says, and still far under 16 MB. The run charged $0.034: $0.01 for the video and 12 seconds at
$0.002. The row also carries an output_url for the MP4.
There is no ready-made WhatsApp example on the Store yet; the
Actor's examples page
has others, such as compressing a video to 10 MB.
Upload only when it fits: the n8n steps
In n8n, four nodes after your trigger do it:
- Apify, operation Run an Actor and Get Dataset, Actor set
By URL to
https://console.apify.com/actors/lCJp5enIHmRFUtepP/input(the Store page URL does not work in that field), input{"videoUrls": ["..."], "target": "whatsapp-16", "maxVideos": 1}. This operation polls until the run ends, within the run's timeout and n8n's own execution timeout. - IF:
within_limitis true. On the false branch, keepstatus,error_reasonandmin_target_mband stop: nothing is sent to Meta. - HTTP Request: download
output_urlas a file. It is a signed link, so no Apify token is needed. - HTTP Request:
POST https://graph.facebook.com/<version>/<PHONE_NUMBER_ID>/mediawith the headerAuthorization: Bearer <access token>, as multipart form data withmessaging_product=whatsapp,type=video/mp4and the file, then send your message with the returned ID.
We did not build or run this n8n workflow for this guide: the run above was started through
the Apify API, and the Meta upload in step 4 is taken from Meta's documentation, not tested by us.
That Android clients play the output rests on Meta's documented rules and the ffprobe
check above.
Our n8n guide for a 25 MB limit builds the
same pattern in full, including checks on the download link. In Make or your own code it is the same
sequence: start the Actor through the Apify API, read the row, and upload only when
within_limit is true. Up to 100 videos fit in one run (10 by default). At the default
4 GB (one core), allow about 2 to 4 minutes per minute of 1080p output; the API's synchronous call
waits at most 300 seconds, so for longer videos start the run and collect the result when it
ends.
What it costs, with the math
Pay per event, the same prices on every Apify plan:
- $0.01 per video saved under the limit
- $0.002 per second of output video ($0.12 a minute); the last partial second counts as a whole one
- $0.002 more per second when the input is above 1080p, for example 4K phone footage
- plus Apify's standard Actor start event, a fraction of a cent per run
- free: limits that are too small, videos still over the limit after three encodes, failed downloads and files that are not videos
| Job | Math | Cost |
|---|---|---|
| Our sample with the WhatsApp preset (re-encoded, the run above) | $0.01 + 12 × $0.002 | $0.034 |
| A video under 16 MB that already meets the WhatsApp rules (copied) | $0.01 + 0 seconds | $0.01 |
| A 15-second clip to 16 MB | $0.01 + 15 × $0.002 | $0.04 |
| A 45-second clip to 16 MB | $0.01 + 45 × $0.002 | $0.10 |
| A 30-second 4K phone video to 16 MB | $0.01 + 30 × $0.002 + 30 × $0.002 | $0.13 |
| A 2-minute product video to 16 MB | $0.01 + 120 × $0.002 | $0.25 |
| 500 clips of 30 seconds a month to 16 MB | 500 × ($0.01 + 30 × $0.002) | $35.00 |
| A 20-minute recording into 16 MB (refused) | nothing encoded | $0 |
The price follows the output length, not the limit. Set a maximum charge per run in Apify Console
or the API and the Actor stops cleanly instead of starting a video it cannot pay for; the
maxDurationMinutes input (30 by default) skips unexpectedly long files. Apify's free
plan includes a monthly usage credit; see Apify's pricing page
for the current amount.
To be fair about price: if you can run ffmpeg where your videos arrive, the command above costs nothing and gives the same Main-profile encoding. The Actor earns its price when you cannot run ffmpeg in your automation, or do not want to maintain the size check and retry yourself.
See the video compressor on the Apify Store
What it does not do
- It does not send anything to WhatsApp. It returns an MP4 and a link; the upload is your step.
- No 3GP output: the WhatsApp preset makes MP4, which the Cloud API accepts. The Main-profile
encoding comes only with
whatsapp-16, not with other presets or a custom limit. - It takes video files, not pages: links to YouTube, TikTok, Instagram and other platforms are refused, as are streaming playlists and links behind a login.
- Output is at most 1080p and 60 fps, never enlarged. Inputs up to 2,048 MB, up to 4K, and up to 120 minutes (30 by default).
FAQ
What is the WhatsApp video size limit?
In the app, WhatsApp's help page gives a default of 100 MB at 720p on a faster connection and 64 MB at 480p on a slower one, and 2 GB for a video sent as a document. Through the Business Platform's Cloud API, a video you send can be at most 16 MB (checked 28 October 2026).
Why does my video look blurry after sending?
WhatsApp compresses shared media, as its help page says. Choose HD quality when you attach it, or send the file as a document.
How do I send a long video on WhatsApp?
Send it as a document (up to 2 GB), or share a link from a cloud storage service. Compressing it yourself first helps only if it is above 2 GB or you want it to play inline.
How long can a WhatsApp Status video be?
90 seconds, according to WhatsApp's help page, and HD is not available for Status. Trim or split longer videos.
Which error does the Cloud API give for an oversized video?
For a video you send, Meta lists no separate code for size. Media that cannot be uploaded gives 131053, "Unable to upload the media used in the message". Check the size, the MIME type and the codecs. For media a customer sends you over 100 MB, Meta documents error 131052, "Media file size too big". This comes from Meta's documentation; we did not test it.
Does Meta count 16 MB as 16,000,000 bytes?
Its media page does not say. A file under 16,000,000 bytes fits under either reading.
Does the Actor keep my video?
No. Each video is downloaded to the run's temporary disk, encoded and deleted from that disk. The
compressed file and the row are stored only in the run's own storage in your Apify account, which
Apify deletes after your plan's data retention period. Anyone with the output_url can
download the file until then, so do not post the link publicly.
Quarrywise is independent and isn't affiliated with or endorsed by WhatsApp, Meta, Apify or the other services named here.
Sources
- WhatsApp Help Center: How to send media, contacts, or location (Android tab, checked 28 October 2026)
- Meta for Developers: WhatsApp Cloud API media reference (checked 28 October 2026)
- Meta for Developers: WhatsApp Cloud API error codes (checked 28 October 2026)
- ffmpeg documentation (the
-passoption) - Compress Video to Size on the Apify Store