Reddit carousel ad specs: 2 to 6 images, 4:5 at 1200x1500
Reddit carousel ads take 2 to 6 JPG, PNG or GIF cards, 4:5 at 1200x1500 is the cross-device size. Limits for headline, caption, URLs, plus a Sume batch.

A Reddit carousel ad takes 2 to 6 image cards, each a JPG, PNG or GIF, with one headline and a destination URL for every card. The cross-device size Reddit lists first is 4:5 portrait at 1200 x 1500 px, and Reddit strongly recommends one aspect ratio across all cards.
Everything below comes from Reddit's Carousel Ad Specifications page, read on 2026-10-03. The single-image and video specs live in separate posts: Reddit ad image size and Reddit video ad specs. This one is only about the carousel.
What are the text and file limits for a Reddit carousel?
The page splits limits into text, image and thumbnail. Per-card fields (destination URL, caption, display URL) repeat once per image, so a six-card carousel needs six destination URLs.
| Field | Limit | Notes |
|---|---|---|
| Cards (images) | 2 to 6 | Required files: 2 to 6 |
| Card file type | JPG, PNG or GIF | Video is not on the list |
| Card file size | 20 MB; GIF 3 MB | Recommended GIF length 3 to 10 seconds |
| Headline | 300 characters | Recommended 100 or fewer, safer 80 or fewer; 1 per ad, required |
| Destination URL | 268 characters | 1 per image, required |
| Caption | 50 characters | 1 per image, optional |
| Display URL | 100 characters | Must match the destination URL's domain |
| Call to action | Choose from options |
Which carousel image sizes does Reddit list?
Reddit lists recommended resolutions by where the ad shows, and says any aspect ratio can be used but may cause formatting discrepancies such as letterboxing. Square 1:1 at 1200 x 1200 px and portrait 3:4 at 900 x 1200 px are listed as acceptable ratios for the cross-device case.
- Use the highest resolution that meets the ratio, and keep every card on the same ratio.
- The compact-view thumbnail is generated from the first image. You can replace it with an upload: JPG, PNG or GIF, up to 3 MB, recommended 4:3 at 400 x 300 px, with 1:1 at 300 x 300 px acceptable.
- Combine feed and conversation placements: the page says carousel images show in both.
| Ratio | Resolution | Cross-device | Mobile | Desktop |
|---|---|---|---|---|
| Portrait 4:5 | 1200 x 1500 px | Yes | Yes | Yes |
| Landscape 4:3 | 1440 x 1080 px | Yes | Yes | Yes |
| Landscape 16:9 | 1920 x 1080 px | Yes | Yes | Yes |
| Square 1:1 | 1200 x 1200 px | Acceptable | Yes | Not listed |
| Portrait 3:4 | 900 x 1200 px | Acceptable | Yes | Not listed |
How do I make a matching set of carousel cards with Sume?
The 4:5 portrait ratio is the one size that is listed for cross-device, mobile and desktop at once, so build the set at 4:5 and crop only if a placement needs it. Sume's Image API takes aspect_ratio values that include 4:5, but a model only accepts what its catalog descriptors list, and a request with an unlisted parameter is rejected with 400 unsupported_parameter. So read the catalog first, then pick a model that advertises 4:5.
The docs also note that for some models exact pixel sizes at 4:5 are a documented post-step, not what the model returns, so check the delivered pixels against Reddit's 1200 x 1500 before you upload. Generate one card per request with a shared style sentence in the prompt, so all cards read as one set. Reddit's page does not mention AI disclosure for carousel cards, so this post makes no claim about it.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
models = requests.get("https://api.sume.com/v1/images/models", headers=H).json()["data"]
ok = [m["id"] for m in models
if "4:5" in m["supported_parameters"].get("aspect_ratio", {}).get("values", [])]
assert ok, "no catalog model lists 4:5"
style = "Flat studio product photo, soft daylight, warm grey backdrop. "
cards = ["A canvas tote bag, front view", "The same tote bag, open to show the lining"]
for i, subject in enumerate(cards):
r = requests.post("https://api.sume.com/v1/images",
headers={**H, "Content-Type": "application/json"},
json={"model": ok[0], "prompt": style + subject, "aspect_ratio": "4:5"})
print(i, r.status_code, r.json().get("data"))What to check before you upload
A status of 200 returns the image in data[].url; a 202 means the job outran the 30-second blocking budget and you read the result from the job endpoints instead. Check the status code, not the body shape.
Then walk the list: 2 to 6 cards, one ratio, each file under 20 MB (3 MB for a GIF), a destination URL of 268 characters or fewer per card, a caption of 50 characters or fewer, and a headline you would be happy to see cut at 80 characters. If you also run catalog-driven ads, Reddit's Dynamic Product Ads page describes a carousel type whose cards come from the catalog rather than from files you upload.
Sources
Related posts
More in Use cases
- Redfin guided video tour: what to make, and the Matterport rule
Redfin lets agents post a guided video tour in select markets and only shows my.matterport.com walkthroughs inline. What Sume can make for the carousel video.
- Reels Carousel Ads With Multiple Destinations: Build the Tiles
Meta's 2023 Reels update added multi-destination Reels carousel ads and swipe-left. Make the product tiles and the lead clip with Sume Images and trim.
- Reimagine a Short from one frame: build your own 8-second clip
YouTube's Reimagine turns one frame of a Short into an 8-second Veo clip. To do the same with your own footage, pull a frame and use Gemini Omni on Sume.
- Replace an actor in a video with AI: what Recast keeps and swaps
To replace an actor in a video with AI on Sume, send the clip and one photo per person to h3-max-recast. Motion, camera, cuts and sound stay; people change.
Written by Sume