> ## 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.

# Create join/stitch job

> Create a job that stitches multiple videos together. Assets can be static video URLs or nested job definitions that render first. When assets include nested jobs, child jobs are created and rendered before the parent stitch operation. The parent job enters 'pending' state until all children complete.



## OpenAPI

````yaml /openapi.json post /jobs/join
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/join:
    post:
      tags:
        - Render Management
      summary: Create join/stitch job
      description: >-
        Create a job that stitches multiple videos together. Assets can be
        static video URLs or nested job definitions that render first. When
        assets include nested jobs, child jobs are created and rendered before
        the parent stitch operation. The parent job enters 'pending' state until
        all children complete.
      operationId: createJoinJob
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JoinJobCreation'
      responses:
        '201':
          description: Join job successfully created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobCreationResponse'
        '400':
          description: >-
            Invalid request - missing required fields or invalid asset
            configuration
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '401':
          description: Unauthorized - invalid or missing API token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >-
            Template not found - a nested job references a template ID that does
            not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    JoinJobCreation:
      type: object
      description: >-
        Configuration for creating a join/stitch job that combines multiple
        videos into one
      properties:
        settings:
          $ref: '#/components/schemas/JoinSettings'
        assets:
          type: array
          description: Ordered list of video or job assets to stitch together
          items:
            oneOf:
              - $ref: '#/components/schemas/JoinVideoAsset'
              - $ref: '#/components/schemas/JoinJobAsset'
            discriminator:
              propertyName: type
              mapping:
                video:
                  $ref: '#/components/schemas/JoinVideoAsset'
                job:
                  $ref: '#/components/schemas/JoinJobAsset'
          minItems: 1
        upload:
          type: object
          description: Custom upload configuration (same as regular job creation)
          properties:
            prefix:
              type: string
            outputUrl:
              type: string
            provider:
              type: string
              enum:
                - s3
              default: s3
            params:
              type: object
              properties:
                endpoint:
                  type: string
                region:
                  type: string
                bucket:
                  type: string
                acl:
                  type: string
                accessKeyId:
                  type: string
                accessKeySecret:
                  type: string
              required:
                - region
                - bucket
                - accessKeyId
                - accessKeySecret
        webhook:
          $ref: '#/components/schemas/JobWebhook'
      required:
        - assets
    JobCreationResponse:
      type: object
      description: Response after creating a job, includes children info for parent jobs
      properties:
        id:
          type: string
          description: Unique job identifier
        status:
          type: string
          enum:
            - queued
            - pending
          description: >-
            'queued' for regular jobs, 'pending' for parent jobs waiting on
            children
        outputUrl:
          type: string
          description: URL where the rendered output will be available
        children:
          type: array
          description: >-
            Child job details (only present for parent jobs with nested job
            assets)
          items:
            type: object
            properties:
              id:
                type: string
                description: Child job identifier
              status:
                type: string
                description: Child job status (typically 'queued')
              outputUrl:
                type: string
                description: URL where the child job's rendered output will be available
              missingFonts:
                type: array
                items:
                  type: string
                description: >-
                  List of fonts referenced in child's template but not found in
                  team's font library (only present if fonts are missing)
            required:
              - id
              - outputUrl
        missingFonts:
          type: array
          items:
            type: string
          description: >-
            List of fonts referenced in template but not found in team's font
            library
      required:
        - id
        - status
        - outputUrl
    ValidationErrorResponse:
      type: object
      description: Validation error response with detailed field information
      properties:
        error:
          type: string
          description: Main error message
        details:
          type: array
          description: Array of specific validation errors for individual fields
          items:
            type: object
            properties:
              field:
                type: string
                description: Field name that failed validation
              message:
                type: string
                description: Specific validation error for this field
    ErrorResponse:
      type: object
      description: Standard error response format
      properties:
        error:
          type: string
          description: Human-readable error message explaining what went wrong
      required:
        - error
    JoinSettings:
      type: object
      description: Settings for the stitch/join operation
      properties:
        preset:
          type: string
          enum:
            - mp4
          description: Output format preset
    JoinVideoAsset:
      type: object
      description: A static video asset for the join/stitch operation
      properties:
        type:
          type: string
          enum:
            - video
          description: Must be 'video' for static video assets
        src:
          type: string
          description: URL to the video file to include in the stitch
      required:
        - type
        - src
    JoinJobAsset:
      type: object
      description: >-
        A job asset that will be rendered first and its output included in the
        stitch
      properties:
        type:
          type: string
          enum:
            - job
          description: Must be 'job' for render job assets
        template:
          type: object
          description: Template configuration for the child job
          properties:
            id:
              type: string
              pattern: ^[A-Z0-9]{26}$
              description: Template ID for the child job
            composition:
              type: string
              description: Composition name to render
            name:
              type: string
              description: Template name (optional)
          required:
            - id
            - composition
        assets:
          type: array
          items:
            $ref: '#/components/schemas/JobAsset'
          description: Assets to inject into the child job
        preview:
          type: boolean
          default: false
          description: Generate preview quality
        settings:
          type: object
          description: Render settings for the child job
          properties:
            frames:
              oneOf:
                - type: integer
                - type: array
                  items:
                    type: integer
            quality:
              type: string
              enum:
                - draft
                - full
            codec:
              type: string
            engine:
              type: string
              enum:
                - ae2025
                - ae2026
              default: ae2026
              description: After Effects render engine version for the child job
      required:
        - type
        - template
    JobWebhook:
      type: object
      description: Webhook configuration for job status notifications and callbacks
      properties:
        url:
          type: string
          description: Target webhook URL that will receive job status updates
        method:
          type: string
          enum:
            - GET
            - POST
            - PUT
            - DELETE
          description: HTTP method to use when calling the webhook endpoint
          default: POST
        headers:
          type: object
          description: Additional HTTP headers to include in webhook requests
          additionalProperties: true
        data:
          type: object
          description: Custom data payload to include with webhook notifications
          additionalProperties: true
        custom:
          type: boolean
          default: false
          description: >-
            Flag indicating if webhook should only include custom data provided
            by the user
      required:
        - url
    JobAsset:
      type: object
      description: >-
        Asset to be used in job rendering, containing source information and
        target layer details. For function assets, provide the function
        identifier in `name` and arguments in `params`.
      properties:
        src:
          type: string
          description: >-
            Source URL, script data or file path for the asset (supports
            HTTP/HTTPS URLs or local paths)
        type:
          type: string
          description: Asset type (e.g., image, video, audio, text, data, script, job)
        layerName:
          type: string
          description: >-
            Target layer name in the After Effects composition where this asset
            will be applied
        name:
          type: string
          description: >-
            Human-readable name for the asset. For function assets (`type:
            function`), this should be the NX function name (for example,
            `nx:layer-autoscale`).
        conform:
          type: boolean
          description: >-
            When true for video, image, or audio assets, the worker normalizes
            the downloaded media to a render-engine-safe target format before
            assembly. If omitted, the API auto-enables conform for known risky
            inputs such as WebM, WebP, GIF, and OGG/OGA sources. GIF inputs are
            converted to a ProRes 4444 MOV file and treated as video.
        params:
          type: object
          description: >-
            Optional parameters for function assets. For supported NX layer
            functions (`nx:layer-autoscale`, `nx:layer-duration-set`,
            `nx:layer-start-set`, `nx:layer-state-set`, `nx:solid-color-set`,
            `nx:text-params-set`), `params.layerName` accepts a single string or
            an array of strings. When an array is provided, the API expands the
            function asset into multiple per-layer assets while preserving the
            original `assets` order.
          properties:
            layerName:
              description: Target layer name(s) for function assets
              oneOf:
                - type: string
                  description: Single target layer name
                - type: array
                  items:
                    type: string
                  minItems: 1
                  description: >-
                    Multiple target layer names (supported by selected NX layer
                    functions only)
          additionalProperties: true
      required:
        - type
      additionalProperties: true
  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

````