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

# Install an authorized team

> Installs a team that CliqHub has already authorized for this daemon's realm (Install a
team on daemons, or adding a team to the realm). Unlike Install a team from a manifest,
it needs no CliqHub sign-in on the daemon and does not check agents first. Any
`agent_settings` are stored before the install. With `team_id`, the daemon keeps
CliqHub's id and an installed copy is replaced; without it, an installed team is only
replaced with `force: true`.

No credential is needed from this machine. From another host, send `Authorization: Bearer` with a dispatch token CliqHub signed for this daemon or a `cliq_tok_…` personal token of a user in the daemon's realm; this only works once the daemon is connected to CliqHub. See [Authentication](/daemon-api/overview#authentication).



## OpenAPI

````yaml /openapi/daemon-by-tag/daemon-commands.yaml post /v1/install
openapi: 3.1.0
info:
  title: cliqd API
  version: 1.9.48
  description: >-
    HTTP API of `cliqd`, the local Cliq daemon. Generated from the daemon source
    by `scripts/generate_daemon_openapi.mjs` — do not edit by hand. See the
    [overview](/daemon-api/overview).
servers:
  - url: http://127.0.0.1:4900
    description: Local daemon (default port; `CLIQ_DAEMON_PORT` changes it)
security: []
tags:
  - name: Daemon Hub commands
    description: >-
      How CliqHub hands work to this daemon: start or offer a run, cancel or
      resume one, install

      or uninstall a team, register a workspace and assign teams to it. CliqHub
      sends them when

      someone acts in CliqHub, over the daemon's CliqHub connection with a
      dispatch token. You

      rarely call them yourself; use the Teams, Workspaces and Runs endpoints
      instead.


      Every command carries `tx_id`, CliqHub's command id. A repeated `tx_id`
      returns the first

      reply instead of running the command again, and the daemon acknowledges
      each command back

      to CliqHub (`ok`, or `error` with the reason), including a body that fails
      validation.
paths:
  /v1/install:
    post:
      tags:
        - Daemon Hub commands
      summary: Install an authorized team
      description: >-
        Installs a team that CliqHub has already authorized for this daemon's
        realm (Install a

        team on daemons, or adding a team to the realm). Unlike Install a team
        from a manifest,

        it needs no CliqHub sign-in on the daemon and does not check agents
        first. Any

        `agent_settings` are stored before the install. With `team_id`, the
        daemon keeps

        CliqHub's id and an installed copy is replaced; without it, an installed
        team is only

        replaced with `force: true`.


        No credential is needed from this machine. From another host, send
        `Authorization: Bearer` with a dispatch token CliqHub signed for this
        daemon or a `cliq_tok_…` personal token of a user in the daemon's realm;
        this only works once the daemon is connected to CliqHub. See
        [Authentication](/daemon-api/overview#authentication).
      operationId: daemon_post_install
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                scope:
                  type: string
                  description: Team scope
                slug:
                  type: string
                  description: Team slug
                manifest:
                  type: string
                  description: Team manifest (YAML)
                version:
                  description: Team version
                  type: string
                description:
                  description: Team description
                  type: string
                dependencies:
                  description: Dependency manifest
                  type: string
                team_id:
                  description: Hub-minted team id the daemon must keep
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                agent_settings:
                  description: Agent settings to store (`agents.<agent>.<key>`)
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      type: string
                force:
                  description: Reinstall over an existing version
                  type: boolean
                tx_id:
                  description: Hub command id (dedup + ack)
                  type: string
              required:
                - scope
                - slug
                - manifest
              additionalProperties: {}
            examples:
              default:
                value:
                  scope: acme
                  slug: code-review
                  manifest: |
                    name: code-review
                    version: 1.5.0
                    phases:
                      - name: review
                        agent: claude-code
                  version: 1.5.0
                  team_id: 3f6c2a8e-6b1d-4c1e-9a57-0d2f4b8e91c4
                  tx_id: tx-5d2c9a
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                  - ok
                  - data
                properties:
                  ok:
                    type: boolean
                    const: true
                  data:
                    $ref: '#/components/schemas/InstalledTeam'
              example:
                ok: true
                data:
                  team:
                    scope: acme
                    slug: code-review
                    team_id: 3f6c2a8e-6b1d-4c1e-9a57-0d2f4b8e91c4
                    version: 1.5.0
                    description: null
                    manifest: |
                      name: code-review
                      version: 1.5.0
                      phases:
                        - name: review
                          agent: claude-code
                    dockerfile: null
                    dependencies: null
                    created_at: 1759830000000
                    updated_at: 1759833600000
        '400':
          description: >-
            `PAYLOAD_INVALID` — The body (query string for `GET`) fails the
            request schema. `details` lists each issue.


            `BAD_REQUEST` — The body is not valid JSON or is larger than the
            route allows (10 MB; artifact uploads more).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                PAYLOAD_INVALID:
                  summary: PAYLOAD_INVALID
                  value:
                    ok: false
                    error:
                      code: PAYLOAD_INVALID
                      message: >-
                        scope: Invalid input: expected string, received
                        undefined; slug: Invalid input: expected string,
                        received undefined; manifest: Invalid input: expected
                        string, received undefined
                      details:
                        - path: scope
                          message: 'Invalid input: expected string, received undefined'
                        - path: slug
                          message: 'Invalid input: expected string, received undefined'
                        - path: manifest
                          message: 'Invalid input: expected string, received undefined'
                BAD_REQUEST:
                  summary: BAD_REQUEST
                  value:
                    ok: false
                    error:
                      code: BAD_REQUEST
                      message: >-
                        Request body could not be read: Unexpected token } in
                        JSON at position 12
        '401':
          description: >-
            `UNAUTHORIZED` — A caller on another host sent no `Authorization:
            Bearer` token, or one that does not verify (expired, wrong
            audience).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                UNAUTHORIZED:
                  summary: UNAUTHORIZED
                  value:
                    ok: false
                    error:
                      code: UNAUTHORIZED
                      message: Missing or invalid Authorization Bearer token
        '403':
          description: >-
            `WEB_REQUEST_REFUSED` — The request carries an `Origin` header (it
            came from a web page).


            `HOST_NOT_LOCAL` — A loopback caller addressed a `Host` other than
            localhost (DNS rebinding guard).


            `LOCAL_ONLY` — The daemon isn't connected to CliqHub (no dispatch
            key) and the caller is on another host.


            `FORBIDDEN` — A `cliq_tok_…` token's user is not in this daemon's
            realm ACL, or the ACL is not loaded yet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                WEB_REQUEST_REFUSED:
                  summary: WEB_REQUEST_REFUSED
                  value:
                    ok: false
                    error:
                      code: WEB_REQUEST_REFUSED
                      message: cliqd doesn't accept requests from web pages
                HOST_NOT_LOCAL:
                  summary: HOST_NOT_LOCAL
                  value:
                    ok: false
                    error:
                      code: HOST_NOT_LOCAL
                      message: cliqd only answers requests addressed to localhost
                LOCAL_ONLY:
                  summary: LOCAL_ONLY
                  value:
                    ok: false
                    error:
                      code: LOCAL_ONLY
                      message: >-
                        This cliqd isn't connected to CliqHub yet, so from
                        another machine it only accepts a local token (minted by
                        tokens/create on the machine running cliqd)
                FORBIDDEN:
                  summary: FORBIDDEN
                  value:
                    ok: false
                    error:
                      code: FORBIDDEN
                      message: Access denied — identity not in realm ACL
        '409':
          description: >-
            `TEAM_ALREADY_EXISTS` — The team is installed, no `team_id` was sent
            and `force` is not `true`; or `team_id` already belongs to a
            different team here.


            `TEAM_NOT_IN_REALM` — CliqHub reports the team is not on this
            daemon's realm team list. It is not left installed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                TEAM_ALREADY_EXISTS:
                  summary: TEAM_ALREADY_EXISTS
                  value:
                    ok: false
                    error:
                      code: TEAM_ALREADY_EXISTS
                      message: Team 'acme/code-review' already exists
                TEAM_NOT_IN_REALM:
                  summary: TEAM_NOT_IN_REALM
                  value:
                    ok: false
                    error:
                      code: TEAM_NOT_IN_REALM
                      message: >-
                        @acme/code-review isn't on this cliqd's realm team list
                        — it was not installed
        '422':
          description: '`TEAM_MANIFEST_INVALID` — The manifest does not parse or validate.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                TEAM_MANIFEST_INVALID:
                  summary: TEAM_MANIFEST_INVALID
                  value:
                    ok: false
                    error:
                      code: TEAM_MANIFEST_INVALID
                      message: |-
                        Manifest validation failed:
                          • phases.0.agent: Required
        '500':
          description: >-
            `INTERNAL_ERROR` — An unexpected daemon fault. The message names the
            request id; the cause is in the cliqd log.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                INTERNAL_ERROR:
                  summary: INTERNAL_ERROR
                  value:
                    ok: false
                    error:
                      code: INTERNAL_ERROR
                      message: >-
                        cliqd hit an unexpected error (request 7f3a…). Details
                        are in the cliqd log.
      security:
        - {}
        - DaemonBearer: []
components:
  schemas:
    InstalledTeam:
      type: object
      required:
        - team
      properties:
        team:
          $ref: '#/components/schemas/Team'
    ErrorReply:
      type: object
      description: >-
        Every failure. Switch on `error.code` — it is stable; `message` is for
        people and may change.
      required:
        - ok
        - error
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable error code. See [Errors](/daemon-api/errors).
              example: TEAM_NOT_FOUND
            message:
              type: string
              description: What went wrong and, where possible, what to do.
              example: Team 'acme/code-review' not found
            details:
              description: >-
                Structured detail when there is some: the list of schema issues
                for `PAYLOAD_INVALID`, the agent problems for
                `TEAM_AGENT_CONFIG_REQUIRED`, …
    Team:
      type: object
      description: A team in this daemon's catalog.
      required:
        - scope
        - slug
        - team_id
        - version
        - description
        - manifest
        - dockerfile
        - dependencies
        - created_at
        - updated_at
      properties:
        scope:
          type: string
          description: Scope (org namespace) the team is published under, without the `@`.
          example: acme
        slug:
          type: string
          description: Team slug, unique within its scope.
          example: code-review
        team_id:
          type: string
          format: uuid
          description: >
            Team id. Matches CliqHub's id once the team is registered with
            CliqHub;

            a team installed offline keeps a local id until the next reconcile,
            which

            may replace it.
          example: 3f6c2a8e-6b1d-4c1e-9a57-0d2f4b8e91c4
        version:
          type:
            - string
            - 'null'
          description: >-
            Semver of the installed manifest, or `null` when the manifest has
            none.
          example: 1.4.0
        description:
          type:
            - string
            - 'null'
          description: One-line description (from the request, else the manifest).
          example: Reviews a pull request and posts findings.
        manifest:
          type: string
          description: The full team manifest (`team.yml`) as YAML text.
          example: |
            name: code-review
            version: 1.4.0
            phases:
              - name: review
                agent: claude-code
        dockerfile:
          type:
            - string
            - 'null'
          description: Dockerfile shipped with the team, if any.
          example: null
        dependencies:
          type:
            - string
            - 'null'
          description: >-
            Dependency manifest (`dependencies.yml`) shipped with the team, if
            any.
          example: null
        created_at:
          type: integer
          format: int64
          description: >-
            When the team was first installed on this daemon (epoch
            milliseconds).
          example: 1759830000000
        updated_at:
          type: integer
          format: int64
          description: >-
            When the team was last installed, updated or re-bound (epoch
            milliseconds).
          example: 1759833600000
  securitySchemes:
    DaemonBearer:
      type: http
      scheme: bearer
      description: >-
        Not needed from the same machine. From another host: a dispatch JWT
        CliqHub signed for this daemon, or a `cliq_tok_…` personal token whose
        user is in the daemon's realm.

````

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