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

# Get a render job

> Returns the current state of a render job. Poll this endpoint until `status` is `completed` or `failed`, or use a webhook to be notified instead.

Jobs are scoped to the authenticated user — requesting another user's `jobId` returns `404`.




## OpenAPI

````yaml GET /api/v2/render/{jobId}
openapi: 3.1.0
info:
  title: Kodisc API
  version: 2.0.0
  description: >
    The Kodisc public API turns [Manim](https://www.manim.community) Python code
    into rendered MP4 videos, thumbnails, and captions.


    Renders run asynchronously: you `POST /api/v2/render` to enqueue a job, get
    back a `jobId`, then either poll `GET /api/v2/render/{jobId}` or receive a
    webhook callback when the job reaches a terminal state.


    All endpoints accept and return JSON. Authenticate every request with an API
    key — see [Authentication](/authentication).
  contact:
    name: Kodisc
    url: https://kodisc.com
servers:
  - url: https://kodisc.com
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Render
    description: Enqueue Manim render jobs and poll their status.
  - name: Account
    description: Inspect the authenticated key and your credit balance.
paths:
  /api/v2/render/{jobId}:
    get:
      tags:
        - Render
      summary: Get a render job
      description: >
        Returns the current state of a render job. Poll this endpoint until
        `status` is `completed` or `failed`, or use a webhook to be notified
        instead.


        Jobs are scoped to the authenticated user — requesting another user's
        `jobId` returns `404`.
      operationId: getRender
      parameters:
        - name: jobId
          in: path
          required: true
          schema:
            type: string
          description: The `jobId` returned from `POST /api/v2/render`.
      responses:
        '200':
          description: Job state.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobStatusResponse'
              examples:
                running:
                  summary: Still running
                  value:
                    jobId: clx9f0a1b0000abcd1234efgh
                    endpoint: render
                    status: running
                    creditsCost: 0
                    durationMs: null
                    result: null
                    error: null
                    metadata: null
                    createdAt: '2026-04-28T17:14:02.118Z'
                    completedAt: null
                completed:
                  summary: Completed
                  value:
                    jobId: clx9f0a1b0000abcd1234efgh
                    endpoint: render
                    status: completed
                    creditsCost: 42
                    durationMs: 18420
                    result:
                      video: >-
                        https://cdn.kodisc.com/r/clx9f0a1b0000abcd1234efgh/video.mp4
                      thumbnail: >-
                        https://cdn.kodisc.com/r/clx9f0a1b0000abcd1234efgh/thumb.jpg
                      captions: >-
                        https://cdn.kodisc.com/r/clx9f0a1b0000abcd1234efgh/captions.vtt
                    error: null
                    metadata:
                      projectId: proj_42
                    createdAt: '2026-04-28T17:14:02.118Z'
                    completedAt: '2026-04-28T17:14:20.539Z'
                failed:
                  summary: Failed
                  value:
                    jobId: clx9f0a1b0000abcd1234efgh
                    endpoint: render
                    status: failed
                    creditsCost: 0
                    durationMs: 4120
                    result: null
                    error: 'NameError: name ''Tex'' is not defined'
                    metadata: null
                    createdAt: '2026-04-28T17:14:02.118Z'
                    completedAt: '2026-04-28T17:14:06.241Z'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: No job with that ID belongs to the authenticated user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: Job not found
components:
  schemas:
    JobStatusResponse:
      type: object
      required:
        - jobId
        - endpoint
        - status
        - creditsCost
        - durationMs
        - result
        - error
        - metadata
        - createdAt
        - completedAt
      properties:
        jobId:
          type: string
        endpoint:
          type: string
          enum:
            - render
        status:
          $ref: '#/components/schemas/JobStatus'
        creditsCost:
          type: number
          description: Credits the job has consumed so far. `0` until the job completes.
        durationMs:
          type:
            - integer
            - 'null'
          description: >-
            Render wall-clock time in milliseconds. `null` until the job reaches
            a terminal state.
        result:
          oneOf:
            - $ref: '#/components/schemas/RenderResult'
            - type: 'null'
          description: Result payload, populated only when `status` is `completed`.
        error:
          type:
            - string
            - 'null'
          description: >-
            Human-readable error message, populated only when `status` is
            `failed`.
        metadata:
          description: >-
            Whatever you passed in the request body's `metadata` field, echoed
            back unchanged.
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the job was enqueued.
        completedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            ISO 8601 timestamp when the job reached a terminal state, or `null`
            while still running.
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Short machine-friendly error code or summary.
        message:
          type: string
          description: Optional human-readable explanation.
    JobStatus:
      type: string
      enum:
        - queued
        - running
        - completed
        - failed
      description: Lifecycle state of the job. `completed` and `failed` are terminal.
    RenderResult:
      type: object
      required:
        - video
        - thumbnail
        - captions
      properties:
        video:
          type: string
          format: uri
          description: Public URL to the rendered MP4.
        thumbnail:
          type: string
          format: uri
          description: Public URL to a JPEG thumbnail extracted from the video.
        captions:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            Public URL to a WebVTT captions file, or `null` if captions were not
            produced.
  responses:
    Unauthorized:
      description: The API key is missing, malformed, revoked, or unknown.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Unauthorized
            message: Invalid or missing API key
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: kdsc_live_*
      description: >
        Send your API key in the `Authorization` header as `Bearer
        kdsc_live_<...>`. Generate keys from the [developer
        dashboard](https://kodisc.com/developer/keys). Keys are returned in
        plaintext only once at creation time — store them like a password.

````