A photo post sends one photo or a carousel of up to 35 to every network you name. Reelspan checks each photo when you send the request, then adapts the set to each network: it converts formats a network won't take, and uses only as many photos as the network allows, with a warning.
What Reelspan accepts
| Formats | JPEG, PNG, WebP, GIF and HEIC (AVIF is also recognised). SVG, BMP and TIFF are refused. The type is read from the file's content, not its name. |
| Size | Up to 20 MB per photo, on every plan. |
| Count | Up to 35 photos per request in photos[] / photo_media_ids[]; any more are ignored with a warning. |
| From a URL | Public https:// URLs in photos[], in order after any uploaded files. At most 100 media URLs per request. |
| Alt text | alt_text[] (one per photo, in order), one alt_text for all, or {network}_alt_text for one network. Sent to X, Instagram, Facebook, Threads, LinkedIn, Pinterest and Bluesky. |
| Per network | {network}_photos[] (URLs) or {network}_photo_media_ids[] give one network its own photos, for example pinterest_photos[] cropped to 2:3. |
A photo over 20 MB is refused with 413 FILE_TOO_LARGE, a file that isn't an image with 400 UNSUPPORTED_MEDIA or WRONG_MEDIA_KIND.
Per network
| Network | Photos per post | What Reelspan does |
|---|---|---|
| TikTok | 35 | A photo post. JPEG and WebP up to 20 MB go as they are; other photos are converted to JPEG (at most 1920 px). photo_cover_index picks the cover. |
| 10 in a carousel | Instagram takes JPEG only: PNG, WebP and HEIC are converted (up to 8 MB). Carousels can mix in videos. media_type=STORIES posts each photo as a Story. Instagram wants shapes from 4:5 to 1.91:1. |
|
| 30 in a Page post; 10 as Stories | facebook_media_type=STORIES shares each photo as its own Page Story. |
|
| Threads | 20 in a carousel | Carousels can mix in videos. |
| X | 4 | GIFs are sent as GIFs. |
| 20 | Personal or company page. | |
| 5 in a carousel | Needs pinterest_board_id. Every photo in a carousel must have the same shape; up to 20 MB each. |
|
| Bluesky | 4 | Each image must be under 1 MB; bigger ones are re-encoded. |
| Mastodon | 4 | |
| Telegram | 10 in an album | |
| Discord | 10 | Up to 10 MB per file. |
| Slack | 10 | |
| Nostr | 10 | Uploaded to your media server and linked in the note. |
| Whop | 10 | |
| Listmonk | 10 | Uploaded to Listmonk's media library and shown in the email; up to 20 MB each. |
| WordPress | All | Embedded in the blog post. |
| Lemmy | 1 | The first photo. |
| 1 | An image post with the first photo, in reddit_subreddit. |
|
| Google Business | 1 | One photo per update. |
| YouTube, Dev.to, Hashnode | No photo posts |
When a post has more photos than a network takes, the first ones are used and that network's result carries a warning such as "Instagram carousels hold 10 images; the first 10 of 12 were used." Sending photos to a network without photo posts refuses the request with 400 UNSUPPORTED_POST_TYPE.
Shapes
The networks crop or letterbox photos differently. The shapes Reelspan lists for each network, preferred first (they cover video too):
| Network | Shapes |
|---|---|
| 9:16, 4:5, 1:1 (photo carousels: 4:5 to 1.91:1) | |
| 9:16, 16:9 | |
| X | 16:9, 1:1 |
| Threads | 4:5, 9:16 |
| 1:1, 16:9 | |
| 2:3, 9:16 | |
| Bluesky | 16:9 |
| Google Business | 4:3, 1:1 |
| TikTok | 9:16 |
To give one network a different crop, send it its own photos with {network}_photos[] or {network}_photo_media_ids[].
See Post photos for the request, and Video requirements for videos.