Projects

Inspect your DevMotion projects and their video exports. You can also render a project directly via POST /renders by passing its project_id.

Access control: you can read your own projects. Public projects can be read by anyone with the project ID.


GET /projects

Get all projects for the authenticated user.

Request
curl https://devmotion.app/api/v1/projects \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY"

Response

GET /projects — response
{
  "data": [
    {
      "id": "random_id",
      "name": "Random Project",
      "createdAt": "2026-02-14T13:25:27.369Z"
    },
    {
      "id": "another_random_id",
      "name": "Another Random Project",
      "createdAt": "2026-02-17T21:53:03.245Z"
    },
    ...
  ]
}

GET /projects/:id

Get a project’s metadata and layer structure.

Request
curl https://devmotion.app/api/v1/projects/my_project_id \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY"

Response

GET /projects/:id — response
{
  "id": "my_project_id",
  "name": "TikTok Intro",
  "is_public": true,
  "thumbnail_url": "https://storage.../thumb.jpg",
  "width": 1080,
  "height": 1920,
  "duration": 5,
  "fps": 30,
  "background": { "type": "solid", "color": "#0a0a0a" },
  "layers": [
    {
      "id": "layer_abc",
      "name": "Title",
      "type": "text",
      "visible": true,
      "locked": false,
      "props": { "content": "Hello World", "fontSize": 64 },
      "transform": { "position": { "x": 0, "y": -200 } },
      "style": { "opacity": 1 },
      "enter_time": 0,
      "exit_time": 5,
      "keyframes_count": 2
    }
  ]
}

POST /projects/:id/actions/:actionId

Run a media action on a layer within a project. Available actions: generate-captions, dub-audio, extract-audio.

Request — generate captions
curl -X POST https://devmotion.app/api/v1/projects/my_project_id/actions/generate-captions \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "layerId": "video_layer_id", "language": "en" }'
Request — dub audio
curl -X POST https://devmotion.app/api/v1/projects/my_project_id/actions/dub-audio \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "layerId": "audio_layer_id", "targetLang": "es" }'
Request — extract audio
curl -X POST https://devmotion.app/api/v1/projects/my_project_id/actions/extract-audio \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "layerId": "video_layer_id" }'

Action Parameters

ActionRequired FieldsOptional Fields
generate-captionslayerIdlanguage, prompt
dub-audiolayerId, targetLangsourceLang
extract-audiolayerId

Response

POST /projects/:id/actions/:actionId — response
{
  "action": "generate-captions",
  "layers_added": [
    { "id": "layer_xyz", "name": "Captions", "type": "captions" }
  ],
  "layers_updated": ["video_layer_id"]
}

Returns 402 if the user’s plan requires an upgrade for the action.


GET /projects/:id/exports

List video exports generated for a project.

Request
curl https://devmotion.app/api/v1/projects/my_project_id/exports \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY"

Response

GET /projects/:id/exports — response
{
  "data": [
    {
      "id": "export_xyz",
      "project_id": "my_project_id",
      "render_id": "render_abc123",
      "url": "https://storage.../video.mp4",
      "storage_key": "media/user_id/video.mp4",
      "file_size_bytes": 2456789,
      "duration_ms": 5000,
      "width": 1080,
      "height": 1920,
      "fps": 30,
      "version": 1,
      "created_at": "2025-01-15T10:30:15Z"
    }
  ]
}