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

# Rename a catalog

> Relabels every tap and pipeline whose `catalog` equals `name` to `newName`, each through a versioned write (one new definition version per member, with a change note naming the rename and the actor). Every hidden placeholder of the catalog (a `__catalog__*` tap whose `catalog` field is `name`, or whose name suffix is `name` when that field is empty) is removed, and `__catalog__<newName>` is created with `catalog=newName`. A member already moved out of `name` by a concurrent change is listed under `failed` ("no longer in catalog"), and placeholders are left untouched when no member moved. A rename never merges: if `newName` already exists (any tap or pipeline carries it, or it has a placeholder; matched case-sensitively) the request is refused with 409 and nothing changes. To combine catalogs, move their items. Not transactional: members that fail are listed under `failed` and the rest still move (207). API keys whose capabilities are scoped `catalog=<name>` are listed under `affectedKeys`; their scopes are not rewritten. Catalog operations (rename, detach, cascade) are serialized server-side, so concurrent requests run one after another and the later one sees the earlier one's result. Requires `pipeline:update`; each member is also checked against the key's owner and catalog scopes. If any member is refused by scope, placeholders are left untouched (`placeholder: skipped`); for a catalog with only a placeholder, the placeholder is scope-checked (403 on denial).




## OpenAPI

````yaml /openapi.yaml put /api/v1/catalog/{name}
openapi: 3.0.3
info:
  title: Datris API
  description: >
    REST API for the Datris AI Data Platform. Ingest, validate, transform,
    store, and retrieve data.


    For AI agent integration, use the [MCP
    Server](https://docs.datris.ai/mcp-server) instead.
  version: 1.28.0
  contact:
    name: Datris
    url: https://datris.ai
  license:
    name: Apache 2.0
servers:
  - url: http://localhost:8080
    description: Local development
security:
  - ApiKeyAuth: []
paths:
  /api/v1/catalog/{name}:
    put:
      tags:
        - Pipelines
      summary: Rename a catalog
      description: >
        Relabels every tap and pipeline whose `catalog` equals `name` to
        `newName`, each through a versioned write (one new definition version
        per member, with a change note naming the rename and the actor). Every
        hidden placeholder of the catalog (a `__catalog__*` tap whose `catalog`
        field is `name`, or whose name suffix is `name` when that field is
        empty) is removed, and `__catalog__<newName>` is created with
        `catalog=newName`. A member already moved out of `name` by a concurrent
        change is listed under `failed` ("no longer in catalog"), and
        placeholders are left untouched when no member moved. A rename never
        merges: if `newName` already exists (any tap or pipeline carries it, or
        it has a placeholder; matched case-sensitively) the request is refused
        with 409 and nothing changes. To combine catalogs, move their items. Not
        transactional: members that fail are listed under `failed` and the rest
        still move (207). API keys whose capabilities are scoped
        `catalog=<name>` are listed under `affectedKeys`; their scopes are not
        rewritten. Catalog operations (rename, detach, cascade) are serialized
        server-side, so concurrent requests run one after another and the later
        one sees the earlier one's result. Requires `pipeline:update`; each
        member is also checked against the key's owner and catalog scopes. If
        any member is refused by scope, placeholders are left untouched
        (`placeholder: skipped`); for a catalog with only a placeholder, the
        placeholder is scope-checked (403 on denial).
      parameters:
        - name: name
          in: path
          required: true
          schema:
            type: string
          description: Current catalog name. `Uncataloged` (any case) is refused.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - newName
              properties:
                newName:
                  type: string
                  pattern: ^[A-Za-z0-9_-]+$
                  description: >-
                    New catalog name (letters, digits, `_` and `-`; mixed case
                    allowed). Catalog names are matched case-sensitively.
      responses:
        '200':
          description: Every member renamed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogRenameResult'
        '207':
          description: Some members could not be renamed; see `failed`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogRenameResult'
        '400':
          description: >-
            Reserved or blank catalog name, missing or invalid `newName`, or
            `newName` equal to `name`
        '403':
          description: >-
            The catalog holds only its placeholder and the key's scope does not
            cover it. Body: `{"error": "capability denied", "errorKind":
            "capability_denied", "message": ...}`
        '404':
          description: No tap, pipeline or placeholder carries this catalog
        '409':
          description: target catalog already exists
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: >-
                      Catalog 'sales' already exists. Use move to merge
                      catalogs.
        '500':
          description: Error
components:
  schemas:
    CatalogRenameResult:
      type: object
      properties:
        renamed:
          type: array
          items:
            type: string
        failed:
          type: array
          items:
            $ref: '#/components/schemas/CatalogFailure'
        affectedKeys:
          type: array
          description: >-
            Labels of non-revoked API keys holding a capability scoped
            `catalog=<old name>`
          items:
            type: string
        placeholder:
          type: string
          enum:
            - created
            - skipped
            - failed
    CatalogFailure:
      type: object
      properties:
        name:
          type: string
          description: Member (or `__catalog__` placeholder) name
        error:
          type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: Optional API key for authentication (enabled via application.yaml)

````