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

> ## Agent Instructions
> To build and serve your own model, start at /deploy/development/quickstart and /deploy/development/overview. Deploying is the default path: reactor init scaffolds a workspace, reactor auth login authenticates, and reactor model deploy registers the model, publishes the release with the weights/ folder, and activates it on Reactor's GPUs, in one command from that workspace. Docker must be running, because the publish step builds the image locally. Bump model.version in reactor.yaml before redeploying a change, because a release that already has an image is reactivated as it is. Deployment access is granted per account, so contact team@reactor.inc if a deploy is refused. Every key in reactor.yaml is documented at /deploy/platform/reactor-yaml. Model code imports reactor_runtime; Python client code imports reactor_sdk. The runtime overview explains the model interface. Running the model on your own machine with reactor run is optional and needs a GPU you attach with --gpus; /deploy/development/local-testing covers that loop and pairs a complete brightness model with a Python client test in a separate brightness-test workspace.
> Reactor hosts multiple models, each with its own connect slug (modelName) and command/event schema. The video model catalog — slug, typed SDK package, and links to its schema — is at /model-api-reference/overview. Robotics policy documentation starts at /robotics/overview; The launch policies are Cosmos Nano DROID (/robotics/cosmos/nano-policy-droid/), DreamZero DROID (/robotics/dreamzero/droid/), and FLUX Action DROID (/robotics/flux-action/droid/), organized by model family and embodiment. Some models expose one slug per experience (e.g. HappyOyster); always take the slug from the model's own pages, never guess it.
> Fastest path to a working app: `npx create-reactor-app my-app --model=<slug>` scaffolds a complete app with secure auth wired up. Typed TypeScript SDKs are published as @reactor-models/<model>; Python uses the base reactor-sdk package.
> Auth: exchange an API key (rk_...) for a JWT via POST https://api.reactor.inc/tokens from your server. Never put the API key in client-side code.
> Append .md to any docs URL for clean Markdown. Search these docs via the MCP server at https://docs.reactor.inc/mcp.

# Deploy a release

> Deploys a registered release of a model you own, for example to roll back or to activate a
release registered with `deploy: false`. The CLI equivalent is `reactor model deploy`.

`instances` is the full desired instance plan, one entry per region. A region you omit
from a non-empty plan is scaled to zero, and `instances: []` scales every region to zero.
Omitting `instances` leaves capacity unchanged. For a GPU model, the plan is checked
against your account's accelerator allocation in each region. Valid region names come
from `GET /clusters/regions`; the plan may hold at most 1000 instances.

`strategy` is `ROLLING` (default; instances are replaced one at a time) or `REPLACE_ALL`
(the whole old generation stops at once; faster, but a release that never becomes ready
leaves the model with no capacity). Values are matched exactly. Neither strategy ends a
running session early. `immediate: true`, legal only with `REPLACE_ALL`, also closes the
model's live sessions once the deploy is sent.

A release with no weights of its own reuses the weights of the most recent deployed
release that has a complete bundle (`weights_carried_from`), or deploys without weights
(`weights_missing: true`).

Callable by an `account_admin` or `developer` of the owning account when model serving is
enabled for the account.




## OpenAPI

````yaml /openapi.yaml put /models/{id}/releases
openapi: 3.1.0
info:
  title: Reactor Platform API
  version: '1'
  description: >
    The Reactor Platform API mints session tokens, starts and operates sessions,
    negotiates media

    transport, and manages your account, models, and deployments. Every path is
    relative to

    `https://api.reactor.inc`. See the
    [Introduction](/platform-api/introduction) and

    [Authentication](/platform-api/authentication) pages for credentials,
    versioning, and errors.
  contact:
    name: Reactor support
    url: https://docs.reactor.inc/resources/support
servers:
  - url: https://api.reactor.inc
    description: Production
security:
  - apiKey: []
tags:
  - name: Status
    description: >-
      Public, unauthenticated endpoints for service health, pricing, and the
      values the API accepts.
  - name: Tokens
    description: >
      Exchange a long-lived API key for a short-lived, session-scoped token that
      a client can use

      to create and operate sessions without holding the key.
  - name: Users
    description: >
      Read your own user record, your account's roster, and account memberships,
      and manage

      member roles as an account admin.
  - name: API Keys
    description: >-
      Revoke API keys. Use the [Dashboard](https://reactor.inc/dashboard) to
      list or create keys. The CLI can also create a key with `reactor auth
      login`.
  - name: Sessions
    description: >
      Create, inspect, and end sessions. A session holds one running model for
      one client

      application; media and messages flow over a transport you attach to it
      afterwards.
  - name: Transport
    description: >
      Attach a client to a session. WebRTC signaling carries ICE servers, SDP,
      and ICE candidates;

      a LiveKit room connection lets the session join a room you host.
  - name: Files
    description: >
      Upload files a model reads, either for one running session or ahead of
      time for sessions you

      have not started yet.
  - name: Recordings
    description: >
      Fetch the recorded video of a session as an HLS playlist, during the
      session or after it ends.
  - name: Accounts
    description: >
      Read and manage the account your credential acts in: its name and slug,
      its credit

      balance, its effective quotas, and its accelerator capacity.
  - name: Invitations
    description: >
      Invite people to your account by email, and manage pending invitations.
      The recipient

      accepts from the emailed link while signed in to the dashboard.
  - name: Usage
    description: >
      List the sessions your account has run, filter them by status, date,
      model, or API key,

      and read exact session totals for a date window.
  - name: Models
    description: >
      Register, read, update, and delete the models your account serves, and
      list the models you can

      use. The `reactor model` CLI commands are built on these endpoints.
  - name: Releases
    description: >
      Register a model's versioned releases, push their container image, and
      deploy a release with a

      per-region instance plan.
  - name: Model Weights
    description: >
      Upload and inspect the weights bundle of a release: single-request
      uploads, multipart uploads

      for large files, and the server-side finalize that marks a bundle
      complete.
  - name: Model Schemas
    description: >
      Attach an OpenAPI schema to a release that describes the model's commands,
      messages, and

      tracks. Schemas of public models are readable without credentials.
  - name: Model Access
    description: |
      Share a private model with other accounts, one environment at a time.
  - name: Projects
    description: >
      A project is the deploy identity of a model you serve on Reactor. Each
      model is one

      project, with its own UUID. Creating a project also creates its
      `production` environment.
  - name: Environments
    description: >
      An environment is a named deploy target of a project, such as `production`
      or `staging`.

      Each write to an environment creates its next revision, and the newest
      revision is what the

      environment runs. Environment access grants let another account start
      sessions on one

      environment.
  - name: Revisions
    description: >
      A revision is an immutable, numbered snapshot of one environment: its
      model image, weights,

      resources, instances, and variables. An environment's revisions, newest
      first, are its change

      log.
  - name: Images
    description: >
      Model images are the container images pushed to your model's repository,
      named by digest.

      Experimental: this API can change without notice.
  - name: Weight Sets
    description: >
      A weight set is a version-2 weights bundle, named by its set digest. Push
      the files, then put

      the manifest. Available when weight sets are enabled for your account.
      Experimental: this API

      can change without notice.
  - name: Tags
    description: >
      A tag is a movable name on one model image or one weight set of a project.
      A release of the

      model is a read-only tag. Experimental: this API can change without
      notice.
paths:
  /models/{id}/releases:
    parameters:
      - $ref: '#/components/parameters/ModelId'
    put:
      tags:
        - Releases
      summary: Deploy a release
      description: >
        Deploys a registered release of a model you own, for example to roll
        back or to activate a

        release registered with `deploy: false`. The CLI equivalent is `reactor
        model deploy`.


        `instances` is the full desired instance plan, one entry per region. A
        region you omit

        from a non-empty plan is scaled to zero, and `instances: []` scales
        every region to zero.

        Omitting `instances` leaves capacity unchanged. For a GPU model, the
        plan is checked

        against your account's accelerator allocation in each region. Valid
        region names come

        from `GET /clusters/regions`; the plan may hold at most 1000 instances.


        `strategy` is `ROLLING` (default; instances are replaced one at a time)
        or `REPLACE_ALL`

        (the whole old generation stops at once; faster, but a release that
        never becomes ready

        leaves the model with no capacity). Values are matched exactly. Neither
        strategy ends a

        running session early. `immediate: true`, legal only with `REPLACE_ALL`,
        also closes the

        model's live sessions once the deploy is sent.


        A release with no weights of its own reuses the weights of the most
        recent deployed

        release that has a complete bundle (`weights_carried_from`), or deploys
        without weights

        (`weights_missing: true`).


        Callable by an `account_admin` or `developer` of the owning account when
        model serving is

        enabled for the account.
      operationId: deployRelease
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ModelDeployRequest'
            examples:
              plan:
                summary: Deploy with a two-region plan
                value:
                  release: v1.2.3-gabcdef0
                  instances:
                    - region: us-west
                      count: 2
                    - region: us-east
                      count: 1
              rollback:
                summary: Roll back without touching capacity
                value:
                  release: v1.2.2-g1234567
      responses:
        '200':
          description: The deploy was accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelDeployResponse'
              example:
                release: v1.2.3-gabcdef0
                weights_carried_from: v1.2.2-g1234567
                immediate: false
                revision:
                  number: 3
        '400':
          description: >
            `release` is missing or not semver-style, `strategy` is unknown,
            `immediate` is set

            without a `release` or without `REPLACE_ALL`, the plan is invalid

            (`invalid_deployment_plan`: unknown or duplicate region, negative
            count, more than 1000

            instances), or an environment variable is invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            You do not own the model (returned whether or not it exists), or
            model serving is not enabled for your account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: The release tag is not registered for this model.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          $ref: '#/components/responses/ModelDeployConflict'
        '429':
          description: The deploy exceeds one of your account's resource quotas.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >
            A dependency is temporarily unavailable. `error` is
            `accelerator_inventory_unavailable`

            when a planned region's capacity could not be read. Retry the same
            request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  parameters:
    ModelId:
      name: id
      in: path
      required: true
      description: >-
        The model's ID (not its project ID). Find it with `GET
        /models?name=your-org/your-model`.
      schema:
        type: string
        format: uuid
  schemas:
    ModelDeployRequest:
      type: object
      properties:
        release:
          type: string
          description: The release to deploy. Required on `PUT`; optional on `PATCH`.
          example: v1.2.3-gabcdef0
        instances:
          type: array
          description: >-
            The instance plan per region. On `PUT` it replaces the plan; on
            `PATCH` it merges. Omit to leave capacity unchanged.
          items:
            type: object
            required:
              - region
              - count
            properties:
              region:
                type: string
                description: A region from `GET /clusters/regions`.
                example: us-west
              count:
                type: integer
                minimum: 0
        strategy:
          type: string
          enum:
            - ROLLING
            - REPLACE_ALL
          default: ROLLING
          description: How the old release stops serving. Matched exactly.
        immediate:
          type: boolean
          default: false
          description: >-
            Close the model's live sessions once the deploy is sent. Requires a
            `release` and `REPLACE_ALL`.
    ModelDeployResponse:
      type: object
      required:
        - release
        - immediate
      properties:
        release:
          type: string
          description: The release now deployed.
        weights_carried_from:
          type: string
          description: The release whose weights were reused because this release has none.
        weights_missing:
          type: boolean
          description: >-
            `true` when the release deployed with no weights available. Omitted
            when `false`.
        immediate:
          type: boolean
          description: Whether this deploy closes live sessions.
        revision:
          type: object
          description: >-
            The `production` revision this deploy created. Omitted when nothing
            changed.
          properties:
            number:
              type: integer
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: >-
            A stable error code (for example `not_found`) on newer routes, or a
            sentence on older ones. When `message` is present, branch on
            `error`.
        message:
          type: string
          description: >-
            A human-readable explanation. Do not parse it; its wording may
            change.
        resource:
          type: string
          description: The type of the resource a `not_found` refers to.
        reason:
          type: string
          description: >-
            A more specific cause for `failed_precondition`, `aborted`, and some
            `invalid_request` errors.
  responses:
    Unauthorized:
      description: The credential is missing, invalid, or expired.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ModelDeployConflict:
      description: >
        The deploy cannot be applied; nothing changed. `error` is one of:


        - `accelerator_not_supported_in_region`: a planned region cannot run the
        model's
          accelerator type. The message names the regions that can.
        - `accelerator_quota_exceeded`: the plan exceeds your account's
        allocation of the
          accelerator type in a region.
        - `failed_precondition` with `reason` `deployment_plan_unplaceable`: a
        region has too few
          free accelerators right now. Retry later or lower the count.
        - `failed_precondition` with `reason` `accelerators_required`: the GPU
        model has no
          `gpu_type`. Set it with `PUT /models/{id}`.
        - `weights_bundle_unverifiable`: the release has no weights of its own
        and the bundle it
          would reuse is too large to verify. Upload this release's weights.
        - `aborted` with `reason` `concurrent_update`: another write changed the
        deployment.
          Retry.

        A sentence in `error` with no `message` means the release has no
        recorded image, or (on

        `PATCH` without a release) the model has no deployed release to scale.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: accelerator_quota_exceeded
            message: >-
              deployment plan would commit 12 'NVIDIA_H100' accelerators in
              region 'us-east', but only 10 are allocated to this account. Lower
              the requested count or request a larger allocation
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        A Reactor API key (`rk_...`), sent as `Authorization: Bearer rk_...`.
        Keep it on a server.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.