Clipform

Upload media to a node

Initiates a media upload for a node. Returns a signed upload URL - the client uploads directly to that URL (server never proxies file bytes). For video: returns a Mux TUS resumable upload URL. After upload completes, the Mux webhook automatically updates the media status to "ready". For image: returns a Supabase Storage presigned PUT URL. Media is immediately ready after upload. Only works on node types that support media: choice, open, scale, button. If the node already has media, the old media is replaced.

POST
/forms/{formId}/nodes/{nodeId}/media

Authorization

Authorization
Required
Bearer <token>

API key (cf_*) passed as Bearer token

In: header

Request Body

application/jsonRequired
media_type
Required
string

Type of media - video (plays) or still (static image/color, optional audio)

Value in: "video" | "still"
media_sourcestring

How the media was created

Default: "uploaded"Value in: "uploaded" | "recorded"

Path Parameters

formId
Required
string
Format: "uuid"
nodeId
Required
string
Format: "uuid"
curl -X POST "https://api.clipform.io/v1/forms/497f6eca-6276-4993-bfeb-53cbbbba6f08/nodes/497f6eca-6276-4993-bfeb-53cbbbba6f08/media" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "media_type": "video",
    "media_source": "uploaded"
  }'

Upload URL created

{
  "media_id": "59458438-e712-4754-944d-fc838e1a631d",
  "upload_url": "http://example.com",
  "upload_method": "tus",
  "status": "awaiting_upload"
}