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

# Transfer a client

> Hand the workspace, its computers, and its key to your client’s own Orgo account.

Emails your client a link from your name. Once they accept it, signed in to their own Orgo account (or a new one), the workspace, its computers, and its key are theirs, on their plan and AI credits. Whatever you built on the key keeps working. You stay on as an admin until they remove you, and any billing through you ends.

The link works for 14 days. Sending again replaces it. If their plan can’t run the computers yet, they pick one before accepting.

Use your account-wide API key. A client’s own key gets `403` here. See [Invoicing](/guides/invoicing).

## Path parameters

<ParamField path="id" type="string" required>
  The client’s `id`.
</ParamField>

## Body

<ParamField body="email" type="string" required>
  Your client’s email. They accept signed in with it.
</ParamField>

## Response

The client, with `transfer` set. After they accept, its `status` is `transferred`.

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://www.orgo.ai/api/v1/accounts/$CLIENT_ID/transfer \
    -H "Authorization: Bearer $ORGO_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"email": "it@acme.com"}'
  ```

  ```python Python theme={null}
  import os
  import requests

  client_id = os.environ["CLIENT_ID"]

  res = requests.post(
      f"https://www.orgo.ai/api/v1/accounts/{client_id}/transfer",
      headers={"Authorization": f"Bearer {os.environ['ORGO_API_KEY']}"},
      json={"email": "it@acme.com"},
  )
  print(res.json())
  ```

  ```javascript JavaScript theme={null}
  const clientId = process.env.CLIENT_ID;

  const res = await fetch(`https://www.orgo.ai/api/v1/accounts/${clientId}/transfer`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${process.env.ORGO_API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({"email": "it@acme.com"}),
  });
  console.log(await res.json());
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "id": "8f14e45f-ceea-467a-9575-6f1c2b3d4e5f",
  "external_id": "acme-dental",
  "name": "Acme Dental",
  "status": "active",
  "workspace_id": "550e8400-e29b-41d4-a716-446655440000",
  "created_at": "2026-10-01T09:00:00Z",
  "closed_at": null,
  "limits": {
    "max_computers": 3,
    "monthly_ai_cap_usd": 40
  },
  "usage": {
    "computers": 2,
    "ai_spend_usd_this_month": 12.4
  },
  "billing": {
    "status": "active",
    "price_usd": 250,
    "email": "billing@acme.com"
  },
  "transfer": {
    "email": "it@acme.com",
    "sent_at": "2026-10-20T15:00:00Z"
  }
}
```

## Errors

| Status | Body | Meaning |
| - | - | - |
| `401` | `{ "error": "Invalid API key" }` | No key, or not one of yours. |
| `403` | `{ "error": "Use your account-wide API key to manage accounts. Workspace keys can’t." }` | A client’s own key, or any key scoped to one workspace. |
| `403` | `{ "error": "Invoicing is on every paid plan. Upgrade to use it." }` | You’re on the Free plan. `code` is `UPGRADE_REQUIRED`. |
| `400` | `{ "error": "Enter your client’s email." }` | Missing or not an email. |
| `400` | `{ "error": "Send it to your client’s email, not yours." }` | It went to your own email. |
| `404` | `{ "error": "Account not found." }` | No client with this id is yours. |
| `409` | `{ "error": "This account is closed." }` | The client is closed. `code` is `ACCOUNT_CLOSED`. |
| `409` | `{ "error": "This account was transferred to your client." }` | The client accepted a transfer and owns it now. `code` is `ACCOUNT_TRANSFERRED`. |


## OpenAPI

````yaml POST /v1/accounts/{id}/transfer
openapi: 3.1.0
info:
  title: Orgo API
  description: >-
    Launch cloud computers that AI agents can control and interact with. Create
    workspaces, provision computers, and control them programmatically.
  version: 2.0.0
  contact:
    name: Orgo Support
    email: spencer@orgo.ai
    url: https://orgo.ai
servers:
  - url: https://www.orgo.ai/api
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: >-
      Account capacity: how many computers an account may run, and adding or
      giving back more.
  - name: Clients
    description: >-
      Run Orgo for your clients from your own app: a workspace and scoped key
      each, billed to you or to them.
  - name: Workspaces
    description: Organize computers into named workspaces
  - name: Computers
    description: Provision and manage virtual computers
  - name: Computer Lifecycle
    description: Start, stop, and restart computers
  - name: Computer Actions
    description: Control mouse, keyboard, and execute commands
  - name: Screens
    description: >-
      More than one desktop on a single computer. Each screen is its own X
      server with its own cursor and window manager, so an agent working on one
      cannot disturb another.
  - name: Files
    description: Upload and download files
  - name: Templates
    description: Author, build, and launch reproducible computers from templates
paths:
  /v1/accounts/{id}/transfer:
    post:
      tags:
        - Clients
      summary: Transfer a client
      description: >-
        Hand the workspace, its computers, and its key to your client’s own Orgo
        account.
      operationId: transferClient
      parameters:
        - name: id
          in: path
          required: true
          description: The client’s `id`.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: Your client’s email. They accept signed in with it.
              required:
                - email
            example:
              email: it@acme.com
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                id: 8f14e45f-ceea-467a-9575-6f1c2b3d4e5f
                external_id: acme-dental
                name: Acme Dental
                status: active
                workspace_id: 550e8400-e29b-41d4-a716-446655440000
                created_at: '2026-10-01T09:00:00Z'
                closed_at: null
                limits:
                  max_computers: 3
                  monthly_ai_cap_usd: 40
                usage:
                  computers: 2
                  ai_spend_usd_this_month: 12.4
                billing:
                  status: active
                  price_usd: 250
                  email: billing@acme.com
                transfer:
                  email: it@acme.com
                  sent_at: '2026-10-20T15:00:00Z'
              schema:
                $ref: '#/components/schemas/Client'
        '400':
          description: Missing or not an email. It went to your own email.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                e1:
                  summary: Missing or not an email
                  value:
                    error: Enter your client’s email.
                e2:
                  summary: It went to your own email
                  value:
                    error: Send it to your client’s email, not yours.
        '401':
          description: No key, or not one of yours.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                e1:
                  summary: No key, or not one of yours
                  value:
                    error: Invalid API key
        '403':
          description: >-
            A client’s own key, or any key scoped to one workspace. You’re on
            the Free plan. `code` is `UPGRADE_REQUIRED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                e1:
                  summary: A client’s own key, or any key scoped to one workspace
                  value:
                    error: >-
                      Use your account-wide API key to manage accounts.
                      Workspace keys can’t.
                e2:
                  summary: You’re on the Free plan
                  value:
                    error: Invoicing is on every paid plan. Upgrade to use it.
        '404':
          description: No client with this id is yours.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                e1:
                  summary: No client with this id is yours
                  value:
                    error: Account not found.
        '409':
          description: >-
            The client is closed. `code` is `ACCOUNT_CLOSED`. The client
            accepted a transfer and owns it now. `code` is
            `ACCOUNT_TRANSFERRED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                e1:
                  summary: The client is closed
                  value:
                    error: This account is closed.
                e2:
                  summary: The client accepted a transfer and owns it now
                  value:
                    error: This account was transferred to your client.
components:
  schemas:
    Client:
      type: object
      description: 'A client: a workspace you run for them, with a key scoped to it.'
      properties:
        id:
          type: string
        external_id:
          type: string
        name:
          type: string
          nullable: true
        status:
          type: string
          enum:
            - active
            - closed
            - transferred
        workspace_id:
          type: string
        created_at:
          type: string
          format: date-time
        closed_at:
          type: string
          format: date-time
          nullable: true
        limits:
          type: object
          properties:
            max_computers:
              type: integer
              nullable: true
            monthly_ai_cap_usd:
              type: number
              nullable: true
        usage:
          type: object
          properties:
            computers:
              type: integer
            ai_spend_usd_this_month:
              type: number
        billing:
          type: object
          nullable: true
          properties:
            status:
              type: string
              enum:
                - sent
                - active
                - past_due
            price_usd:
              type: number
            email:
              type: string
        transfer:
          type: object
          nullable: true
          properties:
            email:
              type: string
            sent_at:
              type: string
              format: date-time
        computers:
          type: array
          description: On Get client only.
          items:
            type: object
    Error:
      type: object
      description: >-
        The base error body. Every failure carries `error`; individual endpoints
        add the fields named in the schemas below.
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable message.
          example: Access denied
        code:
          type: string
          description: >-
            Machine-readable reason. Present on the failures that define one,
            absent otherwise.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key authentication. Get your key at orgo.ai/workspaces

````

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