Images and videos

Upload a file, then attach it to a post.

Adding media is two steps: upload the file, then use its id in a post.

Upload the file

Send the file as multipart/form-data, in a field called file:

curl -X POST "$BULKIT_URL/media" \
  -H "x-api-key: $BULKIT_API_KEY" \
  -F "file=@./launch-banner.png"
Response
{
  "id": "clx3k2p9q0001abcd1234efgh",
  "fileName": "launch-banner.png",
  "mimeType": "image/png",
  "size": 184320,
  "altText": null,
  "url": "https://…",
  "createdAt": "2026-08-04T09:30:00.000Z"
}

Save the id. You can use it right away.

Attach it to a post

Put the id in mediaIds on a block:

{
  "intent": "now",
  "channels": [
    {
      "channelId": "CHANNEL_ID",
      "blocks": [
        {
          "content": "Our new logo!",
          "mediaIds": ["MEDIA_ID"],
          "mediaAltText": { "MEDIA_ID": "A green heart logo on a white background" }
        }
      ]
    }
  ]
}

mediaAltText is optional. It describes the image for people who cannot see it. It is keyed by the media id.

Allowed files

TypeFormatsMax size
ImagesJPEG, PNG, WebP, GIF10 MB
VideosMP4, MOV100 MB
DocumentsPDF100 MB
SubtitlesVTT, SRT5 MB

Each platform accepts only some of these. Check limits.acceptedMimeTypes, limits.maxMedia and limits.requiresMedia on GET /platforms. If requiresMedia is true, a post on that platform must have at least one file.

Good to know

  • Use the id, not the url. The url is temporary and changes on every response. Do not save it.
  • Files count towards your storage. Deleting a file with DELETE /media/{id} frees the space right away.
  • Deleting a file does not remove it from posts that are already live. But a scheduled post that uses it will fail.
  • GET /media lists every file in your library.

On this page