Skip to main content
POST
/
jobs
Create new job
curl --request POST \
  --url https://api.nexrender.com/api/v2/jobs \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "template": {
    "id": "<string>",
    "src": "<string>",
    "composition": "<string>"
  },
  "preview": false,
  "fonts": [],
  "assets": [],
  "settings": {
    "type": "video",
    "frames": 1,
    "quality": "draft",
    "codec": "<string>"
  },
  "upload": {
    "prefix": "<string>",
    "outputUrl": "<string>",
    "provider": "s3",
    "params": {
      "endpoint": "https://s3.amazonaws.com",
      "region": "<string>",
      "bucket": "<string>",
      "acl": "<string>",
      "accessKeyId": "<string>",
      "accessKeySecret": "<string>"
    }
  },
  "webhook": {
    "url": "<string>",
    "method": "POST",
    "headers": {},
    "data": {},
    "custom": false
  }
}'
{
  "id": "<string>",
  "templateId": "<string>",
  "status": "<string>",
  "progress": 123,
  "stats": {
    "createdAt": "2023-11-07T05:31:56Z",
    "updatedAt": "2023-11-07T05:31:56Z",
    "startedAt": "2023-11-07T05:31:56Z",
    "finishedAt": "2023-11-07T05:31:56Z",
    "errorAt": "2023-11-07T05:31:56Z",
    "totalAssets": 123,
    "renderDuration": 123,
    "error": "<string>"
  },
  "outputUrl": "<string>"
}

Submit the Job

Submit the job with a simple POST request:
curl -X POST https://api.nexrender.com/api/v2/jobs \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template": {
      "id": "01JTGM9GCR71JV7EJYDF45QAFD",
      "composition": "main"
    },
    "assets": [
      {
        "type": "text",
        "layerName": "title",
        "value": "Hello World!"
      }
    ]
  }'

Job Request Expected Response

{
  "id": "01JTRDF7HCR8QAHYW8GPCP4S9Y",
  "status": "queued",
  "progress": 0,
  "stats": {
    "createdAt": "2025-05-14T12:00:00.000Z"
  },
  "outputUrl": "https://nx1-outputs-eu.nexrender.com/01K4B3YH2GP215NAWCZX42S2GH/outputs/01K4B3YH6H97ASTA8DS3MX8P8B.mp4"
}

Job Request Internals

FieldTypeRequiredDescription
template.idstring🟢ID of the template created earlier
template.compositionstring🟢Composition to render (optional for .mogrt)
assetsarray🟢List of asset overrides
previewbooleanSet true for fast low-res preview
fontsarrayList of font file names to include in render environment
webhook.urlstringCallback endpoint for job status
webhook.methodstringTypically POST
webhook.headersobjectExtra HTTP headers to send with webhook
webhook.dataobjectCustom JSON payload attached to webhook
webhook.custombooleanIf true, webhook will send only custom data (no system metadata)
settings.typestringOutput type: video, image or aep
settings.framesint/arrSingle frame (int) or frame range ([start, end]) for still/image render
settings.qualitystringRender quality: draft or full
settings.codecstringOutput codec (e.g. h264_vbr_15mbps, prores_422, png)
upload.prefixstringFolder path prefix for uploaded outputs (e.g. my-project/outputs/)
upload.outputUrlstringCustom base URL for accessing uploaded files
upload.providerstringStorage provider (s3 only at present)
upload.params.endpointstringS3-compatible endpoint (default: https://s3.amazonaws.com)
upload.params.regionstring🟢*Cloud storage region
upload.params.bucketstring🟢*Target bucket name for file uploads
upload.params.aclstringAccess control (public-read, private)
upload.params.accessKeyIdstring🟢*Access key ID for storage provider
upload.params.accessKeySecretstring🟢*Secret key for storage provider
🟢 = Required parameter ⚪ = Optional parameter * Required only if you provide a custom upload block. Each asset object must have:
  • type: one of (data, text, image, audio, video, essential, function)
  • layerName: exact layer name from the template
  • property: like "Source Text" or "Source Name"
  • value or src: depending on asset type
You can inspect available layerName using GET /templates/:id

Render Settings

Render settings and Preview mode are mutually exclusive.
The settings object allows you to specify the render output:
  • type: “video”, “image” or “aep”
  • frames: single frame number or [start, end] array (required for image)
  • quality: “draft” or “full”
  • codec: string identifier (e.g., “h264_vbr_15mbps”, “prores_422”, “png”, “jpeg”).
Supported quality list:
  • draft
  • full
Supported codecs:
  • video_h264_vbr_1mbps
  • video_h264_vbr_5mbps
  • video_h264_vbr_15mbps
  • video_h264_vbr_40mbps
  • video_h264_cbr_1mbps
  • video_h264_cbr_5mbps
  • video_h264_cbr_15mbps
  • video_h264_cbr_40mbps
  • video_prores_422
  • video_prores_4444
  • image_jpeg
  • image_png

Examples

{
  "template": { 
    "id": "01JTGM9GCR71JV7EJYDF45QAFD", 
    "composition": "main" 
  },
  "settings": {
    "type": "video",
    "quality": "draft",
    "codec": "h264_vbr_15mbps"
  }
}

Preview Mode vs Final Render

Render settings and Preview mode are mutually exclusive.
Nexrender Cloud supports the ability to render videos in preview mode. A fast, low-resolution render is helpful when debugging new templates or job payload changes. Use preview mode when:
  • Verifying that layerName overrides are correct
  • Testing a new template or composition
  • Integrating webhooks or downstream automation
  • You want to run a batch sanity check before scaling
{
  "template": { 
    "id": "01JTGM9GCR71JV7EJYDF45QAFD", 
    "composition": "main" 
  },
  "preview": true
}
Previews render faster and are cheaper on infrastructure resources. If your template is broken (bad expression, missing font, wrong composition), it’s better to catch it here.
You can build an internal CI pipeline that runs preview renders against all newly uploaded templates.

Uploading Rendering Results

By default, outputs are stored in Nexrender Cloud storage. With the upload object, you can push rendered outputs directly to your S3-compatible storage.
Render Upload
{
  "template": { 
    "id": "01JTGM9GCR71JV7EJYDF45QAFD", 
    "composition": "main" 
  },
  "upload": {
    "provider": "s3",
    "prefix": "marketing/campaign-42/",
    "outputUrl": "https://cdn.example.com/media",
    "params": {
      "endpoint": "https://s3.amazonaws.com",
      "region": "us-east-1",
      "bucket": "nexrender-outputs",
      "acl": "public-read",
      "accessKeyId": "${secrets.AWS_KEY_ID}",
      "accessKeySecret": "${secrets.AWS_KEY_SECRET}"
    }
  }
}
Don’t embed raw keys in client-side requests. Use the Secrets API to manage credentials securely.

Webhooks

You can extend your rendering job with a webhook:
Webhook Configuration
{
  "template": {
    "id": "01JTGM9GCR71JV7EJYDF45QAFD",
    "composition": "main"
  },
  "webhook": {
    "url": "https://yourdomain.com/webhooks/render-complete",
    "data": {
      "customField": "someValue"
    }
  }
}

Targeting Layers in Alternate Compositions

By default, assets are injected into the composition defined in the template.composition field. However, you can override this on a per-asset basis using the composition key inside the asset definition. This is useful when you want to render a specific comp (like main), but modify a layer in a supporting comp (like main2).

Example

{
  "template": {
    "id": "01JTGM9GCR71JV7EJYDF45QAFD",
    "composition": "main"
  },
  "assets": [
    {
      "type": "data",
      "layerName": "title",
      "composition": "main2",
      "property": "Source Text",
      "value": "Hello World!"
    }
  ]
}

Validate the Assets Before Submitting

Before rendering, always validate:
  • composition name exists (from template introspection)
  • layerName matches exactly
  • URLs for assets return a 200 OK
  • Font dependencies have been preloaded

Full API Reference

Authorizations

Authorization
string
header
required

Bearer token authentication using API tokens for team-based access control.

You can generate your own API token at: https://app.nexrender.com/team/settings

Body

application/json

Configuration object for creating a new render job with template, assets, and options

template
object
required

Template configuration defining the After Effects project and composition to render

preview
boolean
default:false

Generate a low-quality preview render instead of full quality output

fonts
string[]

List of font file names to include in the render environment

assets
object[]

Collection of media assets (images, videos, audio, scripts, text, ...) to use in the render

settings
object

Render configuration settings for output format, quality, and frame selection

upload
object

Custom upload configuration for output files to external storage providers

webhook
object

Webhook configuration for job status notifications and callbacks

Response

Job successfully created and queued for processing

Render job with current status, progress, and detailed statistics

id
string

Unique job identifier used for tracking and API operations

templateId
string | null

Reference to the template used for this job (null if template was not used)

status
string

Current job status (queued, render:dorender, finished, error, etc.)

progress
number

Render progress as a percentage (0.0 to 100.0)

stats
object

Detailed timing and metadata statistics for the job

outputUrl
string | null

URL to the rendered content

I