image, file, and card blocks can get their content from two places.
If the file already lives somewhere public, just link to it. There is nothing to upload:
Uploading
One multipart POST. Two endpoints, same behaviour. Pick the one that matches the key you already have.response_url one is best mid-workflow: no API key needed, because the token already carries permission.
The file part. Missing it returns
400 MALFORMED_MULTIPART.Replaces the file’s own name. Cut to 255 characters.
201 Created
Then use it
file_id. Each time someone reads the message, we make a fresh short-lived link. Links in your JSON never go stale.
Uploading in two steps
In Make or n8n, this is two HTTP modules: upload, then mapfile.file_id into the message body.
1
Upload
POST the binary to
{{response_url}}/files as multipart/form-data. Read back file.file_id.2
Post the message
POST Block Kit to
{{response_url}}, mapping the file_id from step 1.What we accept
PNG, JPEG, GIF, WebP, AVIF.
PDF, XLSX, DOCX, PPTX, ZIP, and anything else not blocked below.
Content-Type. Renaming evil.exe to report.pdf does not work.
Rejected
HTML is blocked because rich HTML belongs in Pages, not chat attachments. HEIC is refused instead of stored broken — send JPEG, PNG, or WebP instead.
Errors
Storage is reserved before we save the file. A
402 means nothing was saved and nothing was counted.
