Automotion docs
Automation recipes

n8n

Render videos from an n8n workflow with the HTTP Request node — no custom app needed.

Automotion is a plain REST API, so the stock HTTP Request node is all you need. The pattern: trigger → create render → wait for the webhook (or poll) → use outputUrl downstream.

1. Create the render (HTTP Request node)

Configure the node:

SettingValue
MethodPOST
URLhttps://api.automotion.dev/v1/renders
AuthenticationGeneric → Header Auth
Header nameAuthorization
Header valueBearer {{$env.AUTOMOTION_API_KEY}}
Body content typeJSON

Body (uses n8n expressions to inject upstream data):

HTTP Request body
{
  "movie": {
    "schema": "v1",
    "preset": "9:16",
    "scenes": [
      {
        "id": "update",
        "duration": 4,
        "background": "#0f172a",
        "elements": [
          {
            "id": "update-text",
            "type": "text",
            "text": "{{ $json.headline }}",
            "fontSize": 72
          }
        ]
      }
    ]
  },
  "webhook_url": "{{ $json.resumeUrl }}"
}

Add an Idempotency-Key header derived from your trigger item (e.g. ={{ $json.rowId }}-v1) so workflow retries never double-render.

Prefer templates for anything non-trivial: keep the document in Automotion as a template and call POST /v1/templates/{id}/renders with only the variable values:

template render body
{
  "variables": {
    "headline": "{{ $json.headline }}"
  }
}

Use n8n's Wait → On webhook call node: it exposes a resume URL ($execution.resumeUrl) — pass it as webhook_url when creating the render (as shown above). Automotion calls it once with the final state:

webhook payload (render.completed)
{
  "id": "evt_rnd_123_completed",
  "event": "render.completed",
  "createdAt": "2026-07-18T13:00:00.000Z",
  "render": {
    "id": "rnd_123",
    "status": "done",
    "outputUrl": "https://cdn.automotion.dev/renders/rnd_123.mp4",
    "error": null,
    "draft": false,
    "watermark": false,
    "durationSec": 8,
    "expiresAt": "2026-10-16T13:00:00.000Z",
    "createdAt": "2026-07-18T12:58:41.000Z"
  }
}

Verify the X-Automotion-Signature header if the workflow does anything sensitive — see webhook verification.

2b. …or poll (works on the trial)

Loop: Wait (10s) → HTTP Request GET https://api.automotion.dev/v1/renders/{{ $json.id }}IF node on {{ $json.status }} equals done / failed; loop back otherwise.

3. Use the video

{{ $json.render.outputUrl }} (webhook path) or {{ $json.outputUrl }} (polling path) is a direct MP4 URL — feed it to your YouTube/S3/Slack/Drive node. Note the expiresAt field: outputs are retained 30 days on the trial and 90–365 days on paid plans, so copy the file if you need it longer.

On this page