# Install Packs

> Install pack versions on bots: every one, or none.

Canonical URL: https://docs.botyard.io/docs/api/packs/install_packs_v1_orgs__org_id__packs_installs_post

`POST /v1/orgs/{org_id}/packs/installs`

Install pack versions on bots: every one, or none.

Only a bot's owner may install a pack on it, even on a bot open to every
member; otherwise the whole batch is a 403 and nothing is written.

Re-installing the version a bot already runs is `unchanged`. What the
install could not bind by itself is reported in `setups`, each with the
action it asks next (run it, a connect link, a secret to store, a server to
choose); carry them on with the setups routes.

**Turned off for now:** installing onto an existing bot would replace its
soul, so every batch is refused with a 409 `pack_install_existing_bot_disabled`
and nothing is written, until multi-pack installs and soul merging land.
Create a bot from the pack instead (`POST /bots/from-pack`). Uninstalling,
binding connections and the setup steps still work.

A `create` connection choice connects a new account after the install
commits, as `POST /bots/from-pack` does; it needs `mcp_server.create`.

## Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `org_id` | path | yes | string |  |

## Request body

`application/json`: PackInstallsBody (required)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `installs` | array of PackInstallRequest | yes | One per bot; a bot may appear only once. |

## Responses

| Status | Description | Body |
| --- | --- | --- |
| `201` | Successful Response | PackInstalls |
| `default` | RFC 9457 Problem Details error response | ProblemDetails |

Full schemas: operation `install_packs_v1_orgs__org_id__packs_installs_post` in the OpenAPI spec at https://api.botyard.io/openapi.json.
