Deno Subhosting API

The Deno Subhosting API enables platforms and SaaS products to run untrusted, user-submitted JavaScript and TypeScript code securely on Deno Deploy infrastructure. It shares the same base URL (https://api.deno.com/v1) and Bearer token authentication as the Deploy REST API but is scoped to subhosting use cases such as provisioning isolated projects per tenant, creating deployments, and managing custom domains and KV databases on behalf of end users.

OpenAPI Specification

deno-subhosting-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Deno Subhosting API
  description: >-
    The Deno Subhosting API enables platforms and SaaS products to run
    untrusted, user-submitted JavaScript and TypeScript code securely on
    Deno Deploy infrastructure. It shares the same base URL and Bearer token
    authentication as the Deno Deploy REST API but is scoped to subhosting
    use cases such as provisioning isolated projects per tenant, creating
    deployments, and managing custom domains and KV databases on behalf of
    end users. Common use cases include cloud IDEs, no-code platforms, and
    multi-tenant application hosting. The v1 API is scheduled for sunset on
    July 20, 2026.
  version: '1.0'
  contact:
    name: Deno Subhosting Support
    url: https://deno.com/subhosting
  termsOfService: https://deno.com/deploy/terms
externalDocs:
  description: Deno Subhosting Documentation
  url: https://docs.deno.com/subhosting/manual/
servers:
  - url: https://api.deno.com/v1
    description: Deno Subhosting Production API
tags:
  - name: Deployments
    description: Create and manage deployments within tenant projects
  - name: Domains
    description: Manage custom domains mapped to tenant deployments
  - name: KV Databases
    description: Provision and manage Deno KV databases for tenant deployments
  - name: Organizations
    description: Retrieve organization details and analytics for subhosting implementations
  - name: Projects
    description: Provision and manage isolated tenant projects
security:
  - bearerAuth: []
paths:
  /organizations/{organizationId}:
    get:
      operationId: getOrganization
      summary: Get organization
      description: >-
        Retrieves organization details for the subhosting implementation.
        The organization is the top-level container for all tenant projects,
        deployments, and analytics data.
      tags:
        - Organizations
      parameters:
        - $ref: '#/components/parameters/organizationId'
      responses:
        '200':
          description: Organization retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Organization'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organizationId}/analytics:
    get:
      operationId: getOrganizationAnalytics
      summary: Get organization analytics
      description: >-
        Returns aggregated time-series analytics for the entire subhosting
        organization in 15-minute intervals. Covers request counts and
        bandwidth across all tenant projects over the specified time range
        (maximum 24 hours).
      tags:
        - Organizations
      parameters:
        - $ref: '#/components/parameters/organizationId'
        - name: since
          in: query
          required: true
          description: Start of the time range in RFC 3339 format
          schema:
            type: string
            format: date-time
        - name: until
          in: query
          required: true
          description: End of the time range in RFC 3339 format
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Analytics data retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Analytics'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organizationId}/projects:
    get:
      operationId: listProjects
      summary: List projects
      description: >-
        Returns a paginated list of all tenant projects within the subhosting
        organization. In subhosting, each project typically represents an
        isolated tenant environment.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/organizationId'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/q'
        - $ref: '#/components/parameters/sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          description: Projects listed successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: createProject
      summary: Create project
      description: >-
        Provisions a new isolated project for a tenant. Projects in
        subhosting are free to create and each can host multiple deployments.
        Typically one project is provisioned per end user or tenant account.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/organizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProjectRequest'
      responses:
        '200':
          description: Project created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /projects/{projectId}:
    get:
      operationId: getProject
      summary: Get project
      description: >-
        Retrieves details for a specific tenant project by UUID.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/projectId'
      responses:
        '200':
          description: Project retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateProject
      summary: Update project
      description: >-
        Updates mutable fields of an existing tenant project.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/projectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateProjectRequest'
      responses:
        '200':
          description: Project updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Project'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteProject
      summary: Delete project
      description: >-
        Permanently deletes a tenant project and all its deployments.
        This should be called when an end user account is deprovisioned.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/projectId'
      responses:
        '200':
          description: Project deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /projects/{projectId}/analytics:
    get:
      operationId: getProjectAnalytics
      summary: Get project analytics
      description: >-
        Returns time-series analytics for a specific tenant project in 15-minute
        intervals, covering request counts and bandwidth for that tenant's
        deployments.
      tags:
        - Projects
      parameters:
        - $ref: '#/components/parameters/projectId'
        - name: since
          in: query
          required: true
          description: Start of the time range in RFC 3339 format
          schema:
            type: string
            format: date-time
        - name: until
          in: query
          required: true
          description: End of the time range in RFC 3339 format
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Analytics retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Analytics'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /projects/{projectId}/deployments:
    get:
      operationId: listDeployments
      summary: List deployments
      description: >-
        Returns a paginated list of all deployments for a tenant project.
        Deployments are immutable units of code, assets, and configuration
        that run on Deno Deploy isolates.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/projectId'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/q'
        - $ref: '#/components/parameters/sort'
        - $ref: '#/components/parameters/order'
      responses:
        '200':
          description: Deployments listed successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Deployment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: createDeployment
      summary: Create deployment
      description: >-
        Creates a new deployment within a tenant project. Deployments consist
        of assets (code and static files), environment variables, compiler
        options, and optional KV database associations. Assets support UTF-8
        text, base64-encoded binary, git SHA-1 references, and symlinks.
        Note that Deno Cron and Queues are not available for subhosting
        deployments.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/projectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDeploymentRequest'
      responses:
        '200':
          description: Deployment created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deployment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /deployments/{deploymentId}:
    get:
      operationId: getDeployment
      summary: Get deployment
      description: >-
        Retrieves the details of a specific tenant deployment, including
        its status, domains, environment variables, and configuration.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/deploymentId'
      responses:
        '200':
          description: Deployment retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Deployment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteDeployment
      summary: Delete deployment
      description: >-
        Permanently deletes a tenant deployment.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/deploymentId'
      responses:
        '200':
          description: Deployment deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /deployments/{deploymentId}/build_logs:
    get:
      operationId: getBuildLogs
      summary: Get build logs
      description: >-
        Retrieves build logs for a tenant deployment. Returns output from
        the deployment build process as a JSON array or NDJSON stream.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/deploymentId'
      responses:
        '200':
          description: Build logs retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BuildLogEntry'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /deployments/{deploymentId}/app_logs:
    get:
      operationId: getAppLogs
      summary: Get application logs
      description: >-
        Retrieves or streams runtime logs for a tenant deployment. Supports
        filtering by log level, region, and time range. When no until parameter
        is specified, the endpoint streams logs in real time.
      tags:
        - Deployments
      parameters:
        - $ref: '#/components/parameters/deploymentId'
        - name: level
          in: query
          description: Filter logs by severity level
          schema:
            type: string
            enum: [debug, info, warning, error]
        - name: region
          in: query
          description: Filter logs by the region that emitted them
          schema:
            type: string
        - name: since
          in: query
          description: Return logs after this RFC 3339 timestamp
          schema:
            type: string
            format: date-time
        - name: until
          in: query
          description: Return logs before this RFC 3339 timestamp; omit to stream
          schema:
            type: string
            format: date-time
        - name: limit
          in: query
          description: Maximum number of log entries to return
          schema:
            type: integer
            minimum: 1
            maximum: 300
        - name: cursor
          in: query
          description: Pagination cursor from a previous response
          schema:
            type: string
      responses:
        '200':
          description: Application logs retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AppLogEntry'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /organizations/{organizationId}/domains:
    get:
      operationId: listDomains
      summary: List domains
      description: >-
        Returns a paginated list of all custom domains registered in the
        subhosting organization. Domains can be dynamically mapped to tenant
        deployments.
      tags:
        - Domains
      parameters:
        - $ref: '#/components/parameters/organizationId'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
      responses:
        '200':
          description: Domains listed successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Domain'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: createDomain
      summary: Create domain
      description: >-
        Registers a new custom domain for use with tenant deployments.
        The domain must be verified via DNS and have TLS certificates
        configured before it can route traffic.
      tags:
        - Domains
      parameters:
        - $ref: '#/components/parameters/organizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDomainRequest'
      responses:
        '200':
          description: Domain created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Domain'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /organizations/{organizationId}/databases:
    get:
      operationId: listKvDatabases
      summary: List KV databases
      description: >-
        Returns a paginated list of Deno KV databases in the subhosting
        organization. KV databases can be attached to tenant deployments
        for persistent storage.
      tags:
        - KV Databases
      parameters:
        - $ref: '#/components/parameters/organizationId'
        - $ref: '#/components/parameters/page'
        - $ref: '#/components/parameters/limit'
      responses:
        '200':
          description: KV databases listed successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/KvDatabase'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    post:
      operationId: createKvDatabase
      summary: Create KV database
      description: >-
        Creates a new Deno KV database that can be associated with tenant
        deployments for persistent, globally distributed key-value storage.
      tags:
        - KV Databases
      parameters:
        - $ref: '#/components/parameters/organizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateKvDatabaseRequest'
      responses:
        '200':
          description: KV database created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KvDatabase'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token authentication. Tokens are generated from the Deno Deploy
        dashboard and provide organization-level access for subhosting operations.
  parameters:
    organizationId:
      name: organizationId
      in: path
      required: true
      description: UUID of the subhosting organization
      schema:
        type: string
        format: uuid
    projectId:
      name: projectId
      in: path
      required: true
      description: UUID of the tenant project
      schema:
        type: string
        format: uuid
    deploymentId:
      name: deploymentId
      in: path
      required: true
      description: Identifier of the deployment
      schema:
        type: string
    page:
      name: page
      in: query
      description: Page number for paginated results (1-based)
      schema:
        type: integer
        minimum: 1
        default: 1
    limit:
      name: limit
      in: query
      description: Maximum number of items to return per page
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
    q:
      name: q
      in: query
      description: Search query to filter results
      schema:
        type: string
    sort:
      name: sort
      in: query
      description: Field to sort results by
      schema:
        type: string
    order:
      name: order
      in: query
      description: Sort direction
      schema:
        type: string
        enum: [asc, desc]
  responses:
    BadRequest:
      description: Bad request - invalid parameters or request body
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized - missing or invalid Bearer token
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Not found - the requested resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      description: Standard error response
      required: [error]
      properties:
        error:
          type: string
          description: Human-readable error message
    Organization:
      type: object
      description: >-
        The subhosting organization, which is the top-level container for
        all tenant projects, deployments, and associated resources.
      required: [id, name]
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the organization
        name:
          type: string
          description: Human-readable name of the organization
    Analytics:
      type: object
      description: >-
        Time-series analytics data in 15-minute intervals covering request
        counts and bandwidth usage.
      properties:
        fields:
          type: array
          description: Field names present in each data row
          items:
            type: object
            properties:
              name:
                type: string
                description: Field name
              type:
                type: string
                description: Data type
        values:
          type: array
          description: Array of data rows, each a 15-minute interval
          items:
            type: array
            items: {}
    Project:
      type: object
      description: >-
        An isolated tenant project on Deno Subhosting. Each project
        represents a separate tenant environment with its own deployments,
        domains, and KV databases.
      required: [id, name]
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the project
        name:
          type: string
          description: Human-readable name of the project
        organizationId:
          type: string
          format: uuid
          description: UUID of the owning organization
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the project was created
        updatedAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the project was last modified
    CreateProjectRequest:
      type: object
      description: Request body for creating a new tenant project
      required: [name]
      properties:
        name:
          type: string
          description: Human-readable name for the project
          minLength: 3
          maxLength: 26
    UpdateProjectRequest:
      type: object
      description: Request body for updating a tenant project
      properties:
        name:
          type: string
          description: New name for the project
          minLength: 3
          maxLength: 26
    Deployment:
      type: object
      description: >-
        An immutable deployment within a tenant project. Deployments contain
        code assets, environment variables, and configuration that run on
        Deno Deploy isolates. Deno Cron and Queues are not available for
        subhosting deployments.
      required: [id, projectId, status]
      properties:
        id:
          type: string
          description: Unique identifier for the deployment
        projectId:
          type: string
          format: uuid
          description: UUID of the project this deployment belongs to
        status:
          type: string
          description: Current deployment status
          enum: [pending, failed, success]
        domains:
          type: array
          description: Custom domains currently attached to this deployment
          items:
            type: string
        envVars:
          type: object
          description: Environment variables (values redacted)
          additionalProperties:
            type: string
        databases:
          type: object
          description: KV database associations keyed by binding name
          additionalProperties:
            type: string
            format: uuid
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the deployment was created
        updatedAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the deployment was last modified
    CreateDeploymentRequest:
      type: object
      description: Request body for creating a new tenant deployment
      required: [assets, entryPointUrl]
      properties:
        entryPointUrl:
          type: string
          description: Relative path to the entry point module within the assets
        assets:
          type: object
          description: Map of file paths to asset objects
          additionalProperties:
            $ref: '#/components/schemas/DeploymentAsset'
        envVars:
          type: object
          description: Environment variables for this deployment
          additionalProperties:
            type: string
        databases:
          type: object
          description: KV database associations by binding name
          additionalProperties:
            type: string
            format: uuid
    DeploymentAsset:
      type: object
      description: A file asset included in a deployment
      required: [kind]
      properties:
        kind:
          type: string
          enum: [file, symlink]
          description: Asset type
        content:
          type: string
          description: File content as UTF-8 or base64-encoded string
        encoding:
          type: string
          enum: [utf-8, base64]
          description: Content encoding
        gitSha1:
          type: string
          description: SHA-1 hash of a previously uploaded git blob
          pattern: '^[0-9a-f]{40}$'
        target:
          type: string
          description: Symlink target path
    BuildLogEntry:
      type: object
      description: A single build log entry
      properties:
        level:
          type: string
          enum: [debug, info, warning, error]
          description: Log level
        message:
          type: string
          description: Log message
        ts:
          type: string
          format: date-time
          description: Timestamp of the log entry
    AppLogEntry:
      type: object
      description: A single runtime application log entry
      properties:
        level:
          type: string
          enum: [debug, info, warning, error]
          description: Log severity level
        message:
          type: string
          description: Log message content
        region:
          type: string
          description: Region where the log was emitted
        ts:
          type: string
          format: date-time
          description: Timestamp of the log entry
    Domain:
      type: object
      description: A custom domain registered for use with tenant deployments
      required: [id, domain]
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the domain
        domain:
          type: string
          description: The fully qualified domain name
        isValidated:
          type: boolean
          description: Whether domain ownership has been verified
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the domain was registered
    CreateDomainRequest:
      type: object
      description: Request body for registering a new custom domain
      required: [domain]
      properties:
        domain:
          type: string
          description: The fully qualified domain name to register
    KvDatabase:
      type: object
      description: >-
        A Deno KV database that can be attached to tenant deployments for
        persistent, globally distributed key-value storage.
      required: [databaseId]
      properties:
        databaseId:
          type: string
          format: uuid
          description: Unique identifier for the KV database
        description:
          type: string
          description: Human-readable description
        kvConnect:
          type: string
          format: uri
          description: KV Connect URL for opening the database from Deno code
        createdAt:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the database was created
    CreateKvDatabaseRequest:
      type: object
      description: Request body for creating a new KV database
      properties:
        description:
          type: string
          description: Optional description for the database