publicUrl works across every workspace and every social
account your key can reach. Upload once, reuse anywhere.
Step 1: Get a presigned URL
POST /media/presign with just filename + contentType. No
workspace, no file size required.
uploadUrl is valid for 15 minutes. Issue the PUT promptly,
or re-presign.
Step 2: Upload the file
A directPUT to uploadUrl. The signature is in the URL — no
Authorization header needed on this request.
200 OK from R2 means the bytes are stored. Your publicUrl is
now live.
Step 3: Use in a post
PasspublicUrl into the post’s mediaItems array:
type can be "image", "video", "gif", or "document"
(uppercase also works).
Same media, many platforms
WhenmediaItems is at the post level, it’s used by every
platform listed in platforms[]:
publicUrl, every platform — no per-platform
duplication.
Different media per platform
Sometimes you need a square crop for Instagram and a landscape one for YouTube. Override per-target withmediaIds:
Attach a file you already have on a CDN
If your image already lives on a public HTTPS URL, you can skip the presign + PUT entirely and paste the URL straight intomediaItems:
Supported formats
| Type | Formats | Max size |
|---|---|---|
| Images | JPG, PNG, GIF, WebP, HEIC, HEIF | 5 GB |
| Videos | MP4, MOV, AVI, WebM | 5 GB |
| Documents | PDF (LinkedIn only) | 100 MB |
The size limits above are the storage ceiling. Each platform
enforces its own (much tighter) caps at publish time — see
per-platform limits below. The server
accepts files up to the storage ceiling so you can keep originals
alongside re-encoded variants; the publisher rejects files that
exceed the destination platform’s limit.
Per-platform limits
Each platform enforces its own media rules at publish time:| Platform | Images | Videos | Documents | Notes |
|---|---|---|---|---|
| up to 10 (carousel) | 1 | — | 9:16 for Reels, 4:5–1.91:1 for Feed | |
| up to 10 (carousel) | 1 | — | — | |
| X | up to 4 | 1 | — | Can’t mix images + video in one post |
| up to 20 | 1 | 1 PDF (carousel) | The only platform that accepts PDFs | |
| TikTok | up to 35 (carousel) | 1 | — | — |
| Threads | up to 20 (mixed) | 1 | — | — |
| up to 5 (carousel) | 0 | — | — | |
| YouTube | 0 | 1 | — | Video only |
LinkedIn PDFs
LinkedIn’s “document carousel” surface accepts a single PDF. Upload it the same way as any other file, then attach withtype: "document":
mediaItems for a cross-post that
includes non-LinkedIn targets, Postbreeze rejects the post with a
400 — PDFs only land on LinkedIn. Use per-target mediaItems (or
mediaIds) to send a different asset to the other platforms.