> ## Documentation Index
> Fetch the complete documentation index at: https://www.nexrender.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Tracking Render Jobs

> Poll job status, list jobs with filters, and receive webhook callbacks when rendering completes

## Job Status Lifecycle

| Status               | Description                                                    |
| -------------------- | -------------------------------------------------------------- |
| `queued`             | Waiting to be picked up by a render worker                     |
| `pending`            | Parent job waiting for child jobs to finish (nested jobs only) |
| `render:dorender`    | Actively rendering                                             |
| `finished`           | Render complete - `outputUrl` is available                     |
| `error`              | Render failed - see the `error` field for details              |
| `manually_cancelled` | Job was cancelled via the API                                  |

## Poll a Single Job

Fetch the current state of a job at any time with `GET /jobs/:id`.

<CodeGroup>
  ```bash Request theme={null}
  curl -X GET https://api.nexrender.com/api/v2/jobs/01JTRDF7HCR8QAHYW8GPCP4S9Y \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```json Response theme={null}
  {
    "id": "01JTRDF7HCR8QAHYW8GPCP4S9Y",
    "status": "finished",
    "progress": 100,
    "outputUrl": "https://nx1-outputs-eu.nexrender.com/.../job.mp4",
    "stats": {
      "createdAt": "2025-05-14T12:00:00.000Z",
      "finishedAt": "2025-05-14T12:00:22.304Z",
      "renderDuration": 22.304
    }
  }
  ```
</CodeGroup>

## List Jobs

Use `GET /jobs` to fetch multiple jobs at once, with optional filters for status, date range, and sort order.

```bash theme={null}
curl -X GET "https://api.nexrender.com/api/v2/jobs?states=queued,render:dorender&limit=50&sort=oldest_first" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

### Query Parameters

| Parameter        | Type    | Description                                                                       |
| ---------------- | ------- | --------------------------------------------------------------------------------- |
| `states`         | string  | Comma-separated list of statuses to include (e.g. `queued,finished`)              |
| `exclude_states` | string  | Comma-separated list of statuses to exclude                                       |
| `from`           | integer | Pagination offset (0-indexed)                                                     |
| `limit`          | integer | Max jobs to return (1-1000)                                                       |
| `from_date`      | string  | Filter jobs created after this ISO 8601 date                                      |
| `to_date`        | string  | Filter jobs created before this ISO 8601 date                                     |
| `sort`           | string  | `oldest_first` (default), `newest_first`, `random`, or `priority`                 |
| `tags`           | string  | Comma-separated tags to filter by                                                 |
| `minimal`        | boolean | Return stripped-down job objects (excludes stats and assets) for faster responses |

## Webhooks (Recommended)

Rather than polling, configure a webhook on the job to receive a notification the moment rendering completes or fails.

```json theme={null}
{
  "template": { "id": "YOUR_TEMPLATE_ID", "composition": "main" },
  "webhook": {
    "url": "https://yourdomain.com/webhooks/render-complete"
  }
}
```

Nexrender will `POST` the full job payload to your endpoint when the job reaches a terminal state.

<CodeGroup>
  ```json Webhook Payload (finished) theme={null}
  {
    "id": "01JTRDF7HCR8QAHYW8GPCP4S9Y",
    "status": "finished",
    "outputUrl": "https://nx1-outputs-eu.nexrender.com/.../job.mp4",
    "stats": {
      "finishedAt": "2025-08-14T08:01:10.304Z",
      "renderDuration": 22.304
    }
  }
  ```

  ```json Webhook Payload (error) theme={null}
  {
    "id": "01JTRDF7HCR8QAHYW8GPCP4S9Y",
    "status": "error",
    "stats": {
      "errorAt": "2025-08-14T09:12:45.799Z",
      "error": "Layer 'title' not found in composition 'main'"
    }
  }
  ```
</CodeGroup>

<Note>
  Your webhook endpoint must return a `2xx` response. Make it idempotent - Nexrender retries failed deliveries up to 3 times with exponential backoff.
</Note>

### Webhook Retry Logic

If your server is unavailable or returns a non-2xx response, Nexrender retries delivery up to 3 times with exponential backoff. To maximise reliability:

* Respond with `200 OK` immediately and process the payload asynchronously
* Keep response time under 2 seconds to avoid timeout-triggered retries
* Log all incoming webhook payloads for auditability

## API Reference


## OpenAPI

````yaml GET /jobs/{id}
openapi: 3.0.4
info:
  title: Nexrender API
  version: '2.0'
  description: >
    REST API for the Nexrender cloud rendering platform, enabling programmatic
    control over After Effects template processing, job management, and asset
    handling.


    Features include:


    - Template upload and management (AEP, MOGRT, ZIP files)

    - Job creation and status monitoring with real-time progress

    - Job nesting for multi-composition renders (parent/child jobs)

    - Job stitching to combine multiple videos into one

    - Batch job creation for submitting up to 1000 jobs at once

    - Font library management for typography consistency

    - Secret management for secure API key storage

    - Webhook notifications for job lifecycle events

    - Asset injection for dynamic content replacement


    Authentication is required for all endpoints using Bearer token
    authorization.
servers:
  - url: https://api.nexrender.com/api/v2
    description: Production API server
security:
  - apiToken: []
paths:
  /jobs/{id}:
    get:
      tags:
        - Render Management
      summary: Get job details
      description: >-
        Retrieve complete information about a specific job including status,
        progress, assets, and statistics
      operationId: getJob
      parameters:
        - in: path
          name: id
          required: true
          description: Unique job identifier
          schema:
            type: string
      responses:
        '200':
          description: Successfully retrieved job details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Job'
        '401':
          description: Unauthorized - invalid or missing API token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Job not found - the specified job ID does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    Job:
      type: object
      description: Render job with current status, progress, and detailed statistics
      properties:
        id:
          type: string
          description: Unique job identifier used for tracking and API operations
        templateId:
          type: string
          description: >-
            Reference to the template used for this job (null if template was
            not used)
          nullable: true
        status:
          type: string
          description: >-
            Current job status (queued, render:dorender, finished, error, etc.).
            Manually cancelled jobs are normalized to `manually_cancelled` in v2
            responses even though they are stored internally as `error`.
        progress:
          type: number
          format: float
          description: Render progress as a percentage (0.0 to 100.0)
        stats:
          type: object
          description: Detailed timing and metadata statistics for the job
          properties:
            createdAt:
              type: string
              format: date-time
              description: ISO timestamp when the job was initially created
            updatedAt:
              type: string
              format: date-time
              description: ISO timestamp of the most recent job status update
            startedAt:
              type: string
              format: date-time
              nullable: true
              description: ISO timestamp when job processing began (null if not started)
            finishedAt:
              type: string
              format: date-time
              nullable: true
              description: >-
                ISO timestamp when job completed successfully (null if not
                finished)
            errorAt:
              type: string
              format: date-time
              nullable: true
              description: ISO timestamp when job encountered an error (null if no error)
            totalAssets:
              type: integer
              description: Total number of assets included in this job
            renderDuration:
              type: number
              format: float
              nullable: true
              description: Total render time in seconds (null if not completed)
            error:
              type: string
              nullable: true
              description: Error message if job failed (null if successful)
        outputUrl:
          type: string
          nullable: true
          description: URL to the rendered content
    ErrorResponse:
      type: object
      description: Standard error response format
      properties:
        error:
          type: string
          description: Human-readable error message explaining what went wrong
      required:
        - error
  securitySchemes:
    apiToken:
      type: http
      scheme: bearer
      description: >
        Bearer token authentication using API tokens for team-based access
        control.


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

````