Studio Protocol referencev4.0.502
Protocol v1 uses stable endpoints and versioned JSON envelopes. It supports official Remotion Element payloads.
Versions
protocolVersion versions discovery, targeting, requests, responses, and errors. The Element version independently versions the payload schema.
Discovery
Discovery requestGET /api/studio-protocol
A compatible Studio responds with:
Discovery response{ "protocol": "remotion-studio-protocol", "protocolVersion": 1, "studioVersion": "4.0.502", "capabilities": { "install": [ { "payloadType": "remotion-element", "payloadVersions": [1] } ] }, "projectName": "My video", "installTarget": { "id": "opaque-target-token", "expiresAt": 1780000000000, "compositionId": "Main", "lastFocusedAt": 1779999999000 } }
installTarget is null when Studio is compatible but no writable, recently focused composition is available.
Installation request
Installation requestPOST /api/studio-protocol/install Content-Type: application/json
Installation request body{ "protocol": "remotion-studio-protocol", "protocolVersion": 1, "targetId": "opaque-target-token", "payload": { "type": "remotion-element", "version": 1, "durationInFrames": 90, "element": { "displayName": "Lower Third", "slug": "lower-third", "sourceCode": "export const LowerThird = () => null;", "dependencies": [], "dimensions": {"width": 900, "height": 260} } } }
Create this object with createElementPayload() instead of serializing it manually.
Success response
Installation response{ "protocol": "remotion-studio-protocol", "protocolVersion": 1, "status": "awaiting-confirmation" }
The response confirms delivery, not installation completion.
Error response
Error response{ "protocol": "remotion-studio-protocol", "protocolVersion": 1, "status": "error", "error": { "code": "target-expired", "message": "The selected Studio target is no longer available." } }
Invalid requests return 400, disallowed origins return 403, unsupported methods return 405, and unavailable targets return 409.
Target tokens
A target token is opaque, short-lived, single-use, and bound to one connected Studio client and composition snapshot. The server does not select another target during installation.
CORS
The server returns an explicit allowed origin, never *. Preflight responses include support for Content-Type and Private Network Access.