Skip to content

Create a project from prepared media

Request

Materialize existing media, script, captions, and a template without AI creative generation. All scene and media-layer fields shown as required must be supplied, including explicit nulls. Captions use millisecond timestamps; keep original word timings when available. This request does not start export. Use the returned projectId to export, with toEnhance:false when supplied media and captions are already final. Template music settings are inherited; Auto-match music must be resolved before creation. Unknown fields are rejected.

Security
ShuffllApiKey
Path
organizationIdstringrequired

Unique identifier for the organization

Example:693fb82afd8d1c43077ba0fb
workspaceIdstringrequired

Unique identifier for the workspace

Example:693fb82afd8d1c43077ba0fe
Bodyapplication/jsonrequired
idempotencyKeystring, [ 1 .. 200 ] charactersrequired

Scoped to the workspace. Reusing the key returns the existing project; it does not update the payload.

templateIdstringrequired
namestring, [ 1 .. 500 ] charactersrequired
languagestringrequired

Language code, for example en. Unlike prompt creation, this endpoint accepts a string.

scenesArray of objects, non-empty(PreparedScene)required
timelineobject(ProjectTimeline)
One of:

Adjacent scene transitions. IDs must refer to scene IDs in the request; durations must fit scene timing. Video bridge URLs must be trusted media URLs. Omit to use the existing/default timeline; an explicit empty transitions array means no transitions.

integrationobject(PreparedIntegration)
curl -i -X POST \
  https://api-docs.shuffll.com/_mock/apis/auth/organization/693fb82afd8d1c43077ba0fb/workspace/693fb82afd8d1c43077ba0fe/projects/prepared \
  -H 'Content-Type: application/json' \
  -H 'x-api-key: YOUR_API_KEY_HERE' \
  -d '{
    "idempotencyKey": "string",
    "templateId": "string",
    "name": "string",
    "language": "string",
    "scenes": [
      {
        "templateSceneId": "string",
        "projectSceneId": "string",
        "name": "string",
        "script": "string",
        "staticText": [
          "string"
        ],
        "toUseSubtitles": true,
        "isHidden": true,
        "dynamicValues": [
          {
            "id": "string",
            "type": "string",
            "position": 0,
            "value": "string",
            "placeholder": "string",
            "valueType": "number",
            "hierarchy": "text",
            "range": [
              0,
              0
            ],
            "generateByAi": true,
            "aiPrompt": "string"
          }
        ],
        "stagePositions": [
          {
            "id": "string",
            "position": 0,
            "x": 0,
            "y": 0,
            "width": 0,
            "height": 0
          }
        ],
        "mediaLayers": [
          {
            "id": "string",
            "url": "http://example.com",
            "audioOnlyUrl": "string",
            "type": "camera",
            "stagePositionId": "string",
            "width": 0,
            "height": 0,
            "durationMs": 1,
            "trimStartMs": 0,
            "trimEndMs": 0,
            "isMaster": true,
            "isMuted": true,
            "toFlip": true,
            "toUseSubtitles": true,
            "toGenerateSubtitles": true,
            "playbackStrategy": "last_frame_freeze"
          }
        ],
        "transcript": {
          "language": "en",
          "sentences": [
            {
              "text": "string",
              "startMs": 0,
              "endMs": 0,
              "words": [
                {}
              ]
            }
          ]
        }
      }
    ],
    "timeline": {
      "version": 1,
      "transitions": [
        {
          "id": "string",
          "leftSceneId": "string",
          "rightSceneId": "string",
          "durationMs": 1,
          "type": "crossfade"
        }
      ]
    },
    "integration": {
      "webhookConfig": [
        {
          "url": "http://example.com",
          "apiHeaders": {
            "name": "string",
            "token": "string"
          },
          "toAddTranscript": true
        }
      ],
      "additionalParams": {
        "property1": "string",
        "property2": "string"
      }
    }
  }'

Responses

Existing project reused for this idempotency key

Bodyapplication/json
projectIdstringrequired
statusstringrequired
Value:"ready"
reusedbooleanrequired
Response
{ "projectId": "string", "status": "ready", "reused": true }