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

# Finalize a release

> Makes a fully uploaded release live. A computer without a VM serves it from its own release hostname r<n>--<slug> and its URL. A computer its VM serves takes every release there: a release of files is written into /home/runtime/app (executables with mode 0755), which the VM's built-in site server serves at once, functions included. A release whose cool.json declares run gives the computer its VM if it has none, writes the files to it, starts the server and checks it, then hands it the URL. The receipt then reports vm true and has no release_url. Repeating finalize returns the same receipt.



## OpenAPI

````yaml https://www.cool.computer/openapi.json post /api/computers/{id}/releases/{number}/finalize
openapi: 3.1.0
info:
  title: Cool Computers API
  version: 1.0.0
  description: >-
    Create and operate reachable Linux computers. Each computer keeps a stable
    name.cool.computer address, persistent files, and agent-ready command
    execution. REST requests use UTC-aligned one-minute limits: 600 requests per
    account identified by a recognized valid account bearer credential, a
    separate 600-request budget per computer-scoped credential, or 60 requests
    per source IP otherwise. Read-only GETs answered from API state spend a
    separate read budget reported as account-read or computer-read, so status
    polling cannot exhaust the budget that protects work and mutations. To bound
    authentication-provider traffic, at most 60 first-seen bearer values are
    checked per source IP in a minute; recognized valid credentials use their
    account or computer policy. Successful bearer authentication is reused for
    at most five seconds; transient provider failures are not cached. Non-exempt
    API responses include the structured RateLimit and RateLimit-Policy fields;
    request admission 429 responses use code api_request_rate_exceeded and also
    include Retry-After. Health, OpenAPI, webhooks, callbacks, SSE, and
    WebSocket endpoints are exempt from the REST request budget. Authenticated
    SSE connection attempts remain subject to the authentication safeguards and
    can receive the same typed 429 response.
servers:
  - url: https://api.cool.computer
    description: Canonical API origin
security: []
tags:
  - name: Authentication
    description: Obtain and manage bearer credentials.
  - name: Billing
    description: Inspect and manage the account's no-card trial or Pro plan.
  - name: Computers
    description: Create, inspect, and delete resident computers.
  - name: Execution
    description: Run commands on a computer.
  - name: Files
    description: Read and change a computer's persistent files.
  - name: Publishing
    description: >-
      Publish files to a computer's URL as immutable releases, with no VM. To
      show something, publish the files; to run something, use the computer
      (exec, terminal, services), which gets Linux on first use.
  - name: Services
    description: >-
      Manage processes and select the HTTP port exposed at a computer's stable
      address.
  - name: Email
    description: Read and send mail through a computer's inbox.
  - name: Network
    description: Control a computer's public visibility and outbound network policy.
  - name: Sharing
    description: Invite people to use a computer without granting owner controls.
  - name: Public
    description: Unauthenticated discovery endpoints.
externalDocs:
  description: Cool Computers agent registration guide
  url: https://www.cool.computer/auth.md
paths:
  /api/computers/{id}/releases/{number}/finalize:
    post:
      tags:
        - Publishing
      summary: Finalize a release
      description: >-
        Makes a fully uploaded release live. A computer without a VM serves it
        from its own release hostname r<n>--<slug> and its URL. A computer its
        VM serves takes every release there: a release of files is written into
        /home/runtime/app (executables with mode 0755), which the VM's built-in
        site server serves at once, functions included. A release whose
        cool.json declares run gives the computer its VM if it has none, writes
        the files to it, starts the server and checks it, then hands it the URL.
        The receipt then reports vm true and has no release_url. Repeating
        finalize returns the same receipt.
      operationId: finalizeComputerRelease
      parameters:
        - $ref: '#/components/parameters/ComputerID'
        - $ref: '#/components/parameters/ReleaseNumber'
      responses:
        '200':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: The receipt of the live release.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReleaseReceipt'
        '400':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Bad Request. `invalid_release`: cool.json or a limit rejected the
            release, which is marked failed.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '401':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: Unauthorized.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '402':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Payment Required. A release that declares run needs a VM, and the
            trial expired or Pro is inactive; inspect the problem code and
            resolution.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '403':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: Forbidden.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '404':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: Not Found. `release_not_found` when the release does not exist.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '409':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Conflict. `blobs_missing`: upload the hashes in `context.missing`,
            then finalize again. `release_failed`: create a new release.
            `publish_in_progress`: another publish of the computer is running.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '422':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Unprocessable Content. `slug_too_long_for_releases`: the computer's
            slug leaves no room for this release's hostname r<n>--<slug>.
            `secret_file_in_public_release`: a release without run is served
            publicly and cannot include .env or .env.* files; the release is
            marked failed. `functions_and_run`: cool.json declares both
            functions and run; the release is marked failed.
            `secret_set_not_found` or `secret_set_too_large`: cool.json secrets
            names a set the account does not have, or one larger than functions
            on the edge take (64 keys of at most 5,000 bytes); the release is
            marked failed.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '429':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
          description: >-
            Too Many Requests. If the problem code is api_request_rate_exceeded,
            wait for Retry-After seconds; other problem codes describe a
            separate limit. computer_quota_exceeded means the account's artifact
            or VM quota is full.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '500':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: Internal Server Error.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '502':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Bad Gateway. `artifact_deploy_failed`: finalize again.
            `linux_create_failed`: giving the computer its VM failed and it
            stays a published site; `server_start_failed`: writing the files to
            the computer's VM, or starting or checking the server, failed;
            `context.step` names the failing step.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '503':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            Service Unavailable. `artifacts_unavailable` means publishing is not
            configured on this server; `host_capacity_full` or
            `host_capacity_unavailable` means a release that declares run cannot
            get a VM now.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        default:
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: >-
            A machine-readable API error with a stable code and recovery
            instruction.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
      security:
        - bearerAuth: []
components:
  parameters:
    ComputerID:
      name: id
      in: path
      required: true
      description: Stable public computer identifier.
      schema:
        type: string
        minLength: 1
        example: cmp_123
    ReleaseNumber:
      name: number
      in: path
      required: true
      description: Release number, starting at 1 for each computer.
      schema:
        type: integer
        minimum: 1
  headers:
    RateLimit:
      description: >-
        The applied policy name, requests remaining after this request, and
        whole seconds until the current UTC-aligned window resets.
      schema:
        type: string
        pattern: >-
          ^"(account|account-read|computer|computer-read|source)";r=[0-9]+;t=([1-9]|[1-5][0-9]|60)$
        examples:
          - '"account";r=599;t=42'
          - '"computer-read";r=598;t=42'
    RateLimit-Policy:
      description: >-
        The selected policy name, quota, and window in seconds. Valid account
        credentials use account or account-read with q=600, computer credentials
        use computer or computer-read with q=600, and unauthenticated or
        unrecognized requests use source with q=60 for their source IP.
      schema:
        type: string
        pattern: >-
          ^("(account|account-read|computer|computer-read)";q=600|"source";q=60);w=60$
        examples:
          - '"account";q=600;w=60'
          - '"computer-read";q=600;w=60'
    Retry-After:
      description: >-
        Whole seconds to wait after an api_request_rate_exceeded response before
        retrying. Other 429 problem codes describe separate resource or provider
        limits and do not inherit this retry value.
      schema:
        type: integer
        minimum: 1
        maximum: 60
        examples:
          - 42
  schemas:
    ReleaseReceipt:
      type: object
      additionalProperties: false
      required:
        - release
        - url
        - vm
        - next
      properties:
        release:
          $ref: '#/components/schemas/Release'
        url:
          type: string
          format: uri
          description: The computer's URL, which serves the live release.
        release_url:
          type: string
          format: uri
          description: >-
            This release's own hostname r<n>--<slug>. Absent once the computer's
            VM serves its URL.
        vm:
          type: boolean
          description: >-
            Whether the computer's VM serves its URL, because a server on it
            answered.
        next:
          $ref: '#/components/schemas/ReleaseNext'
    Problem:
      type: object
      additionalProperties: false
      required:
        - type
        - title
        - status
        - code
        - detail
        - resolution
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
          minimum: 400
          maximum: 599
        code:
          type: string
          pattern: ^[a-z0-9_]+$
        detail:
          type: string
        resolution:
          type: string
        context:
          type: object
          additionalProperties: true
    Release:
      type: object
      additionalProperties: false
      required:
        - number
        - state
        - live
        - files
        - bytes
        - created_at
      properties:
        number:
          type: integer
          minimum: 1
        state:
          type: string
          enum:
            - uploading
            - ready
            - failed
        live:
          type: boolean
        files:
          type: integer
          minimum: 0
        bytes:
          type: integer
          format: int64
          minimum: 0
        created_at:
          type: string
          format: date-time
        ready_at:
          type: string
          format: date-time
    ReleaseNext:
      type: object
      additionalProperties: false
      required:
        - action
      description: 'What to do next: upload the missing hashes, finalize, or nothing (done).'
      properties:
        action:
          type: string
          enum:
            - upload
            - finalize
            - done
        upload:
          $ref: '#/components/schemas/ReleaseLink'
        finalize:
          $ref: '#/components/schemas/ReleaseLink'
    ReleaseLink:
      type: object
      additionalProperties: false
      required:
        - method
        - href
      properties:
        method:
          type: string
          enum:
            - PUT
            - POST
        href:
          type: string
          description: API path; {sha256} stands for each missing hash.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: WorkOS user or agent access token, or Cool Computers API key
      description: >-
        A Cool Computers API key, user access token, or claimed agent access
        token in the Authorization header. Follow
        https://www.cool.computer/auth.md for agent registration and
        https://www.cool.computer/authentication.md for direct user credentials.

````