Skip to main content
Posts with media perform better on every platform. Postbreeze uses presigned URLs so your file goes directly from your code to storage — the API server never touches the bytes. Uploaded media is account-global — once a file is uploaded, the same 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.
Response:
The uploadUrl is valid for 15 minutes. Issue the PUT promptly, or re-presign.

Step 2: Upload the file

A direct PUT to uploadUrl. The signature is in the URL — no Authorization header needed on this request.
A 200 OK from R2 means the bytes are stored. Your publicUrl is now live.

Step 3: Use in a post

Pass publicUrl into the post’s mediaItems array:
type can be "image", "video", "gif", or "document" (uppercase also works).

Same media, many platforms

When mediaItems is at the post level, it’s used by every platform listed in platforms[]:
One upload, one 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 with mediaIds:

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 into mediaItems:
Postbreeze will fetch the URL server-side (SSRF-guarded) and store the bytes — same outcome as a direct upload.

Supported formats

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: See each platform guide for full per-platform rules.

LinkedIn PDFs

LinkedIn’s “document carousel” surface accepts a single PDF. Upload it the same way as any other file, then attach with type: "document":
If you put a PDF in the post-level 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.