Action API
POST/uploadMediaAPI v2

Upload media

3 min readMediaView as Markdown

POST /uploadMedia

Upload a media file to a space. Send the file as the raw request body with the appropriate Content-Type header. Pass spaceId and filename as query parameters. Maximum file size: 25 MB.

Base URL: https://www.taskade.com/api/v2

Authentication

Send a personal access token or an OAuth 2.0 access token as a bearer token. Create a personal access token at taskade.com/settings/api.

Http
Authorization: Bearer tskdp_your_token_here

Parameters

Name In Type Required Description
spaceId query string Yes The space ID to upload media into (can be a root workspace or a subspace / app).
filename query string Yes Original filename of the uploaded file (e.g. "photo.png").

Example request

Bash
# Send the file as the raw request body. Swap application/octet-stream
# for the file's real type (image/png, application/zip, …) when you know it.
curl -X POST "https://www.taskade.com/api/v2/uploadMedia?spaceId=<spaceId>&filename=<filename>" \
  -H "Authorization: Bearer $TASKADE_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @/path/to/your-file

Responses

200 — Default response

Field Type Required Description
ok boolean Yes —
item object Yes —
item.mediaId string Yes The SpaceMedia record ID (UUID).
item.fileId string Yes The file ID used in S3.
item.kind string Yes Detected media kind (image, video, audio, document, etc.).
item.downloadUrl string Yes Public URL to download the uploaded file.

A nested field marked Yes is required whenever its parent object is present.

Errors

Errors return an ok: false envelope. Rate limiting returns 429 with x-rate-limit-limit, x-rate-limit-remaining and x-rate-limit-reset headers. x-rate-limit-reset is the number of seconds until the window reopens. Retry-After is not sent, so schedule retries from x-rate-limit-reset; retrying sooner will fail again.

Json
{ "ok": false, "message": "Unauthorized", "code": "UNAUTHORIZED" }

Rate limits for this version: enforced per endpoint; ceilings are not published and can change without notice. A 429 response carries x-rate-limit-limit, x-rate-limit-remaining, and x-rate-limit-reset (seconds until the window reopens). Back off from those headers rather than hardcoding numbers. If you need sustained throughput, prefer batching (operations like /createTask accept arrays) over tightening polling loops. See Rate limits.