Media Upload
Boring does not require you to upload files to a dedicated endpoint. Instead, you reference media by URL in the mediaUrls field of the Publishing API. Boring fetches the media, runs any required processing (compression, format checks, async status polling), and hands it off to the target platform.
How to reference media
Pass one or more publicly reachable URLs in post.content.mediaUrls. The field accepts either a single string or an array:
{
"post": {
"accountId": "uuid-string",
"content": {
"text": "Hello world",
"mediaUrls": ["https://cdn.example.com/photo.jpg"],
"platform": "facebook"
},
"target": { "targetType": "facebook" }
}
}
Supported URL sources
| Source | Notes |
|---|---|
| Public HTTPS URL | Any directly downloadable image/video URL (CDN, object storage, etc.) |
| Google Drive share link | "Anyone with the link" files are auto-converted and downloaded server-side |
Google Drive: paste the normal share URL (e.g.
https://drive.google.com/file/d/FILE_ID/view). Boring resolves it via the Drive API, with an HTTP-download fallback and magic-byte file-type detection.
Media count → post type
The number of media URLs determines the post type per platform:
| Media Count | Threads | ||
|---|---|---|---|
| 0 | Text-only | ❌ (media required) | Text-only |
| 1 image | Single photo | Single photo | Single photo |
| 2–10 images | Album | Carousel | Carousel (up to 20) |
| 1 video | Video | Reels | Video |
For full per-platform request examples, see Publishing API.
Per-platform limits
| Platform | Images | Video | Notes |
|---|---|---|---|
| up to 10 (album) | 1 | Text/photo/album/video | |
| up to 10 (carousel) | 1 (Reels) | Media required; coverUrl sets Reels cover |
|
| Threads | up to 20 (carousel) | 1 | Array text = multi-post thread |
| YouTube | — | 1 | Video + optional thumbnail; title/description parsed from text |
| X (Twitter) | up to 4 | 1 | 280-char limit; Ultra plan only |
| TikTok | up to 35 (photo carousel) | 1 (up to 4 GB / 10 min) | Video or photo carousel |
Processing & async status
- Instagram, Threads, X, and TikTok process media asynchronously. Boring polls the platform's status endpoint automatically and only returns once the media is ready (or fails). No action needed on your side.
- Instagram Reels: videos larger than ~95 MB are re-encoded with ffmpeg before upload to stay within Instagram's limits.
- YouTube: uploads use a resumable session; large files are streamed server-side.
Optional fields
| Field | Type | Applies to | Description |
|---|---|---|---|
coverUrl |
String | Instagram Reels | Custom cover image for a video post |
thumbnail |
String | YouTube | Custom video thumbnail |
Tips
- Use direct, stable URLs — Boring downloads the media at publish time, so the URL must still be reachable then.
- Prefer standard formats: JPEG/PNG for images, MP4 (H.264/AAC) for video.
- For scheduled posts, the media URL must remain valid until the scheduled publish time.