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

# Mint a viewer token

> Mints a short-lived, signed viewer token for one sandbox and returns the
embed URL that opens the live view with it. The token travels in the URL
fragment (`#t=...`), which browsers never send to a server.

`control` scope needs an API key, or a dashboard role of member or above.
The key needs the `sandboxes:use` scope and, if it is limited to a list of
sandboxes, this sandbox must be on it.




## OpenAPI

````yaml /compute/api-reference/anona-openapi.yaml post /v1/sandboxes/{sandboxID}/viewer-tokens
openapi: 3.0.3
info:
  title: Anona Compute API (Anona routes)
  version: 0.1.0
  description: >
    Routes the Anona Compute gateway serves next to the E2B-compatible API:

    live-view viewer tokens, SSH certificates, network policy, the credential

    vault, usage and billing, webhooks and telemetry export, thumbnails, preview
    links,

    public ports, pause when idle, template builds, and API key management.


    Written from the gateway handlers
    (`gateway/internal/stream/token/handlers.go`,

    `gateway/internal/sshca/handler.go`,
    `gateway/internal/handlers/apikeys/apikeys.go`)

    and checked against a running gateway by
    `docs-site/scripts/verify_openapi.py`.
servers:
  - url: https://api.compute.anonalabs.com
security:
  - ApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Live view
  - name: SSH
  - name: Sandbox access
  - name: Templates
  - name: Network
  - name: Credential vault
  - name: Usage and billing
  - name: Webhooks and telemetry
  - name: API keys
  - name: Service
paths:
  /v1/sandboxes/{sandboxID}/viewer-tokens:
    post:
      tags:
        - Live view
      summary: Mint a viewer token
      description: >
        Mints a short-lived, signed viewer token for one sandbox and returns the

        embed URL that opens the live view with it. The token travels in the URL

        fragment (`#t=...`), which browsers never send to a server.


        `control` scope needs an API key, or a dashboard role of member or
        above.

        The key needs the `sandboxes:use` scope and, if it is limited to a list
        of

        sandboxes, this sandbox must be on it.
      operationId: createViewerToken
      parameters:
        - $ref: '#/components/parameters/sandboxID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ViewerTokenRequest'
            example:
              scope: view
              channels:
                - dom
              ttlSeconds: 600
      responses:
        '200':
          description: The token and its embed URL.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ViewerToken'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    sandboxID:
      name: sandboxID
      in: path
      required: true
      schema:
        type: string
  schemas:
    ViewerTokenRequest:
      type: object
      additionalProperties: false
      properties:
        scope:
          type: string
          enum:
            - view
            - control
          default: view
          description: >-
            `view` watches; `control` also sends input (terminal keystrokes,
            desktop mouse and keyboard).
        channels:
          type: array
          items:
            type: string
            enum:
              - dom
              - pty
              - desktop
              - thumb
              - ssh
          default:
            - dom
          description: >-
            What the token opens. The first channel picks the embed view (`pty`
            opens the terminal view).
        ttlSeconds:
          type: integer
          minimum: 30
          maximum: 600
          default: 600
    ViewerToken:
      type: object
      required:
        - token
        - expiresAt
        - embedUrl
      properties:
        token:
          type: string
          description: Compact JWS (EdDSA, `typ` `anona-view+jwt`).
        expiresAt:
          type: string
          format: date-time
        embedUrl:
          type: string
          format: uri
          description: The live-view page for an iframe, with the token in the fragment.
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          description: The HTTP status code.
        message:
          type: string
        error_code:
          type: string
          description: >-
            Machine-readable reason, on some errors (for example
            `invalid_request`).
  responses:
    BadRequest:
      description: The request body is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: No valid API key or session.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The key's scopes or the caller's role do not allow this.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: >-
        Not found, or not yours (the answer is the same, so IDs cannot be
        probed).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: An Anona Compute API key (`e2b_` followed by lowercase hex).
    BearerAuth:
      type: http
      scheme: bearer
      description: 'The same API key, sent as `Authorization: Bearer e2b_...`.'

````

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