Create Upload Url
Mint a short-lived signed PUT URL for direct-to-storage upload.
Two-step flow for files above the gateway’s ~32 MiB inbound cap:
POST /v1/uploads/urlwith{filename, mime_type}→{upload_url, storage_key, ...}.- PUT raw bytes to
upload_urlwithContent-Type: <mime_type>. POST /v1/uploads/registerwith{storage_key}to receive a standardFileUploadResponsewhoseurlis reusable as an attachment instart_design_task.
Files are still capped at settings.MAX_FILE_SIZE_BYTES (enforced at
register time when the actual size is known). Signed URLs expire after
expires_in_seconds (default 600s, max 3600s).
Documentation Index
Fetch the complete documentation index at: https://docs.moda.app/llms.txt
Use this file to discover all available pages before exploring further.
Authorizations
API key from Settings > Developer > REST API
Headers
Calendar-dated API version pin. New integrations should pin 2026-05-01 to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: 2026-04-12); that default advances on each sunset date. Any unsupported value returns 400 unsupported_version.
2026-04-12, 2026-05-01 "2026-05-01"
Body
Request a signed PUT URL for direct-to-storage upload.
The multipart POST /uploads endpoint funnels bytes through the API
gateway, which caps inbound bodies at ~32 MiB (Cloud Run HTTP/1 limit) —
files above that size are rejected with a 413 before the handler runs.
This two-step flow sidesteps the cap by letting the client PUT bytes
directly to storage.
Original filename. Only the basename is used; path components are stripped.
1 - 512MIME type of the file (e.g. application/vnd.openxmlformats-officedocument.presentationml.presentation for PPTX, application/pdf, image/png). Must be on the allow-list.
How long the signed URL is valid (60–3600 seconds, default 600).
60 <= x <= 3600Response
Successful Response
Pre-signed URL. PUT the raw file bytes here with Content-Type: <mime_type> within expires_in_seconds. No auth header on the PUT — the URL itself is the capability.
Opaque key identifying the pending upload. Pass back to POST /v1/uploads/register after the PUT completes to finalize the file.
Resolved MIME type the signed URL is bound to.
How long the upload URL remains valid (seconds).
Human-readable usage hint describing the PUT + register contract.