Skip to content

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.

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
Terminal window
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"

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.

Terminal window
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" }'
{
"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.

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.

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/:id whenever 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 /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.