Renders

Create and track video render jobs. Rendering is asynchronous — the API returns immediately with a render ID; you poll or use a webhook to get the result.


POST /renders

Create a new render job.

Request
curl -X POST https://devmotion.app/api/v1/renders \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "laptop-3d-intro",
    "modifications": [
      { "layer": "Browser", "property": "props.url", "value": "https://yoursite.com" },
      { "layer": "Title",   "property": "text",       "value": "My Product" }
    ],
    "webhook_url": "https://yourserver.com/webhook",
    "metadata": { "order_id": "12345" }
  }'

Request body

FieldTypeRequiredDescription
template_idstring✓*ID of a built-in template
project_idstring✓*ID of one of your projects
modificationsarrayLayer property overrides (see below)
webhook_urlstringURL to POST the result to when done
metadataobjectArbitrary key/value data echoed back in the response and webhook
widthnumberOverride output width in pixels
heightnumberOverride output height in pixels
fpsnumberOverride frames per second

* Provide either template_id or project_id — not both.

Modifications

Target any layer by name and set any property at render time:

PropertyTypeDescription
textstringText content
srcURLImage or video source URL
urlURLBrowser / iframe URL
colorhexText color
fillhexShape fill color
fontSizenumberFont size in pixels
visiblebooleanLayer visibility
opacitynumberOpacity (0–1)
transform.xnumberX position
transform.ynumberY position
props.*anyAny layer-specific prop

Response 202 Accepted

POST /renders — response
{
  "id": "render_abc123",
  "status": "rendering",
  "output_url": null,
  "webhook_url": "https://yourserver.com/webhook",
  "metadata": { "order_id": "12345" },
  "created_at": "2025-01-15T10:30:00Z"
}

The render runs in the background. output_url is null until the render completes. Poll GET /renders/:id or wait for the webhook callback.


GET /renders

List your render jobs with optional filters.

Request
curl https://devmotion.app/api/v1/renders?status=completed&limit=10 \
  -H "Authorization: Bearer dm_live_YOUR_API_KEY"

Query parameters

ParameterTypeDefaultDescription
limitnumber25Results per page (max 100)
offsetnumber0Pagination offset
statusstringFilter by status: rendering, completed, failed
template_idstringFilter by template

Response

GET /renders — response
{
  "data": [
    {
      "id": "render_abc123",
      "project_id": null,
      "template_id": "laptop-3d-intro",
      "status": "completed",
      "output_url": "https://storage.../video.mp4",
      "file_size_bytes": 2456789,
      "duration_ms": 5000,
      "error_message": null,
      "metadata": { "order_id": "12345" },
      "created_at": "2025-01-15T10:30:00Z",
      "started_at": "2025-01-15T10:30:01Z",
      "completed_at": "2025-01-15T10:30:15Z"
    }
  ],
  "pagination": {
    "limit": 10,
    "offset": 0,
    "has_more": false
  }
}

GET /renders/:id

Get status and details for a single render.

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

Response

FieldDescription
statusrendering · completed · failed
output_urlDownload URL when status is completed, else null
file_size_bytesFile size in bytes
duration_msVideo duration in milliseconds
error_messageError description when status is failed, else null
webhook_urlWebhook endpoint supplied at creation
webhook_statuspending · sent · failed
metadataMetadata supplied at creation
GET /renders/:id — completed
{
  "id": "render_abc123",
  "project_id": null,
  "template_id": "laptop-3d-intro",
  "status": "completed",
  "output_url": "https://storage.../video.mp4",
  "file_size_bytes": 2456789,
  "duration_ms": 5000,
  "error_message": null,
  "error_code": null,
  "webhook_url": "https://yourserver.com/webhook",
  "webhook_status": "sent",
  "metadata": { "order_id": "12345" },
  "created_at": "2025-01-15T10:30:00Z",
  "started_at": "2025-01-15T10:30:01Z",
  "completed_at": "2025-01-15T10:30:15Z"
}