Media
Media is uploaded once per workspace and referenced by id from posts. Upload happens before the post is created, so problems with the file surface early and one upload can serve several posts.
Endpoints
Section titled “Endpoints”| Method | Path | Body | Returns |
|---|---|---|---|
| POST | /v1/media |
multipart file + workspace (+ alt), or JSON { workspace, url, alt? } |
201 media |
| GET | /v1/media/:id |
media | |
| DELETE | /v1/media/:id |
204 |
Upload a file (multipart)
Section titled “Upload a file (multipart)”curl -X POST https://social.missless.tel/v1/media \ -H "Authorization: Bearer $MISSLESS_API_KEY" \ -F "workspace=ws7k2m9p4q1r8t3" \ -F "alt=Fresh haircut, side view" \ -F "file=@./friday.jpg"Upload by URL (JSON)
Section titled “Upload by URL (JSON)”MissLess fetches the URL server-side, once, and stores the file. The URL must be publicly reachable over https at upload time. Temporary signed URLs from your own storage work well here.
curl -X POST https://social.missless.tel/v1/media \ -H "Authorization: Bearer $MISSLESS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "workspace": "ws7k2m9p4q1r8t3", "url": "https://cdn.example.com/cuts/friday.jpg", "alt": "Fresh haircut, side view" }'The media object
Section titled “The media object”{ "id": "med9x2c4v6b8n1m", "workspace": "ws7k2m9p4q1r8t3", "kind": "image", "mime": "image/jpeg", "size": 482113, "width": 1080, "height": 1350, "alt": "Fresh haircut, side view", "url": "https://social.missless.tel/v1/media/med9x2c4v6b8n1m/file?sig=9b1f2e8d&exp=1756717924", "created": "2026-08-25T09:18:02Z"}kind is image or video and is derived from the file, not from what you say. width and height are in pixels. alt is optional and is kept for your own accessibility use; the networks do not all accept it.
Limits
Section titled “Limits”| Kind | Formats | Max size | Notes |
|---|---|---|---|
| Image | JPEG, PNG, WEBP, GIF | 8 MB | Facebook accepts all four. Instagram accepts JPEG only; there is no conversion |
| Video | MP4, MOV | 100 MB | Instagram publishes video as Reels, and Reels processing takes longer than an image |
Uploads outside these limits fail with validation_error; field is file or url. The upload itself accepts every listed format; the check for Instagram happens when you create the post. A post that targets an Instagram account with a PNG, WEBP or GIF image is rejected with validation_error on field: "media" before anything is sent to Meta. Upload JPEG when Instagram is among the targets. Instagram adds aspect ratio and duration rules on top, enforced by Meta at publish time. See Instagram rules.
Signed URLs
Section titled “Signed URLs”url is a signed public URL, valid for 7 days. Anyone with the URL can fetch the file until it expires. That is what lets Meta pull the file at publish time, and it is also handy for a preview in your own UI.
- Store the media id, not the URL. Fetch
GET /v1/media/:idwhenever you need a fresh URL. - Scheduled posts do not depend on the URL you were given. The publisher signs a fresh one when the post goes out, so scheduling weeks ahead is fine.
Delete
Section titled “Delete”DELETE /v1/media/:id removes the file and its record. A draft or scheduled post that still references it will fail for lack of media when it comes due, so delete after the post is published. Deleting a workspace deletes all of its media.