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

# Transfer a project

> The project passes to the caller's tenant, on the controller's approval. The space databases stay where they are, so the memory continues; the old keys expire after the grace period and the webhook secrets must be turned.



## OpenAPI

````yaml openapi/en/control.json POST /v1/projects/{project_id}/transfer
openapi: 3.1.0
info:
  title: Niadra control API
  version: '1'
  description: >-
    Tenants, projects, sources, keys, people, configuration and usage. It never
    receives customer content.
servers:
  - url: https://control.api.niadra.com
security: []
paths:
  /v1/projects/{project_id}/transfer:
    post:
      tags:
        - accounts
      summary: Transfer a project
      description: >-
        The project passes to the caller's tenant, on the controller's approval
        of the transfer. The space

        databases stay as they are, so the memory continues.


        **Authentication.** Person token issued by the control plane
        (`Authorization: Bearer <JWT>`), with the role the operation needs.
      operationId: transfer_project_v1_projects__project_id__transfer_post
      parameters:
        - in: path
          name: project_id
          required: true
          schema:
            format: uuid
            title: Project Id
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransferRequest'
        required: true
      responses:
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Transfer'
          description: Successful Response
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
          description: The request does not match the contract.
      security:
        - personToken: []
components:
  schemas:
    TransferRequest:
      additionalProperties: false
      properties:
        approval_id:
          format: uuid
          title: Approval Id
          type: string
        grace_hours:
          default: 72
          description: How long the old source keys keep working; 0 cuts them at once.
          maximum: 720
          minimum: 0
          title: Grace Hours
          type: integer
        operator_entity_id:
          anyOf:
            - format: uuid
              type: string
            - type: 'null'
          description: The new operator's legal entity, added as the project's operator.
          title: Operator Entity Id
        to_tenant_id:
          format: uuid
          title: To Tenant Id
          type: string
      required:
        - to_tenant_id
        - approval_id
      title: TransferRequest
      type: object
    Transfer:
      additionalProperties: false
      properties:
        completed_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Completed At
        from_tenant_id:
          format: uuid
          title: From Tenant Id
          type: string
        grace_until:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Grace Until
        keys_retired:
          description: Active source keys that expire at `grace_until`.
          title: Keys Retired
          type: integer
        project_id:
          format: uuid
          title: Project Id
          type: string
        requested_at:
          format: date-time
          title: Requested At
          type: string
        status:
          enum:
            - pending
            - done
            - cancelled
          title: Status
          type: string
        to_tenant_id:
          format: uuid
          title: To Tenant Id
          type: string
        transfer_id:
          format: uuid
          title: Transfer Id
          type: string
        webhook_endpoints:
          additionalProperties:
            items:
              type: string
            type: array
          description: >-
            Space id -> the endpoints whose secrets the new operator must turn
            before `grace_until`; an endpoint still signing with an old secret
            then stops.
          title: Webhook Endpoints
          type: object
      required:
        - transfer_id
        - project_id
        - from_tenant_id
        - to_tenant_id
        - status
        - requested_at
        - keys_retired
      title: Transfer
      type: object
    Problem:
      additionalProperties: false
      description: RFC 9457 problem details; `code` comes from the versioned error catalog.
      properties:
        code:
          title: Code
          type: string
        detail:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Detail
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          title: Request Id
        status:
          title: Status
          type: integer
        title:
          title: Title
          type: string
        type:
          default: about:blank
          title: Type
          type: string
      required:
        - title
        - status
        - code
      title: Problem
      type: object
  securitySchemes:
    personToken:
      type: http
      scheme: bearer
      bearerFormat: JWT

````