# Re-assign an installed app

> The app_installations.reassign operation: POST /api/v1/app_installations/{id}/reassign in the REST API and the app_installations_reassign tool in the MCP server.

Makes another organization owner or admin the installer of an app: its calls are attributed to them and limited
to their access from now on. An installation paused because its installer left resumes, with the same tokens.
The new installer must be an `org_owner` or `org_admin` of the organization.

## At a glance

- **REST:** `POST /api/v1/app_installations/{id}/reassign`
- **MCP tool:** `app_installations_reassign`
- **Operation ID:** `app_installations.reassign`
- **Scope:** Organization
- **Permission:** `agents:admin`
- **Risk tier:** `security`
- **Dry run:** Supported (send `Ownrecord-Dry-Run: true`)
- **Idempotency:** `Idempotency-Key` required
- **Modes:** Test and live
- **Authentication:** API key with the `agents:admin` scope
- **Since:** M10

## Request

### Path parameters

| Field | Type        | Description |
| ----- | ----------- | ----------- |
| `id`  | `ains_…` ID |             |

### Body

A JSON object (`Content-Type: application/json`):

| Field    | Type       | Required | Description |
| -------- | ---------- | -------- | ----------- |
| `userId` | `usr_…` ID | Yes      |             |

## Response

`200 OK` with a JSON object:

| Field                               | Type                                                                                               | Description |
| ----------------------------------- | -------------------------------------------------------------------------------------------------- | ----------- |
| `id`                                | `ains_…` ID                                                                                        |             |
| `object`                            | `"app_installation"`                                                                               |             |
| `orgId`                             | `org_…` ID                                                                                         |             |
| `app`                               | object                                                                                             |             |
| `app.id`                            | `ocl_…` ID                                                                                         |             |
| `app.name`                          | string                                                                                             |             |
| `app.publisher`                     | string                                                                                             |             |
| `app.logoUrl`                       | string or null                                                                                     |             |
| `app.verified`                      | boolean                                                                                            |             |
| `app.status`                        | one of `active`, `disabled`                                                                        |             |
| `app.suspension`                    | object or null                                                                                     |             |
| `installedBy`                       | `usr_…` ID                                                                                         |             |
| `scopes`                            | array of one of 84 values, e.g. `org:read`, `org:write`, `org:admin` (all in the OpenAPI document) |             |
| `limitTo`                           | object                                                                                             |             |
| `limitTo.entityIds`                 | array of `ent_…` ID                                                                                |             |
| `limitTo.brandIds`                  | array of `brd_…` ID                                                                                |             |
| `limits`                            | object                                                                                             |             |
| `limits.rps`                        | integer or null                                                                                    |             |
| `limits.mutationsPerDay`            | integer or null                                                                                    |             |
| `limits.amountLimits`               | array of object                                                                                    |             |
| `limits.amountLimits[].operationId` | string                                                                                             |             |
| `limits.amountLimits[].perCall`     | money or null                                                                                      |             |
| `limits.amountLimits[].perDay`      | money or null                                                                                      |             |
| `status`                            | one of `active`, `paused`, `revoked`                                                               |             |
| `pausedReason`                      | one of `manual`, `installer_lost_access`, `platform_suspended`, `app_disabled` or null             |             |
| `pausedAt`                          | string or null                                                                                     |             |
| `revokedAt`                         | string or null                                                                                     |             |
| `createdAt`                         | string                                                                                             |             |
| `updatedAt`                         | string                                                                                             |             |

## Examples

### Re-assign after the installer left

```http
POST /api/v1/app_installations/ains_01m4ttwd3veh9apbewxheq5xhc/reassign
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "userId": "usr_01m4ttwd3veh9apbewxheq5xh7"
}
```

Response (`200`):

```json
{
  "id": "ains_01m4ttwd3veh9apbewxheq5xhc",
  "object": "app_installation",
  "orgId": "org_01m4ttwd3veh9apbewxheq5xh3",
  "app": {
    "id": "ocl_01m4ttwd3veh9apbewxheq5xha",
    "name": "Ledgerly AI",
    "publisher": "Ledgerly AI B.V.",
    "logoUrl": null,
    "verified": true,
    "status": "active",
    "suspension": null
  },
  "installedBy": "usr_01m4ttwd3veh9apbewxheq5xh7",
  "scopes": ["filings:read", "filings:write", "tasks:read", "tasks:write"],
  "limitTo": {
    "entityIds": ["ent_01m4ttwd3veh9apbewxheq5xh4"],
    "brandIds": []
  },
  "limits": {
    "rps": null,
    "mutationsPerDay": null,
    "amountLimits": []
  },
  "status": "active",
  "pausedReason": null,
  "pausedAt": null,
  "revokedAt": null,
  "createdAt": "2026-10-25T09:00:00.000Z",
  "updatedAt": "2026-10-26T14:30:00.000Z"
}
```

## Errors

| Code                                                                                             | HTTP status | When                                                                   | What to do                                                                                           |
| ------------------------------------------------------------------------------------------------ | ----------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed)           | 400         | The installation is revoked.                                           | Fix the fields listed in `details.issues` and send the request again.                                |
| [`installer_not_eligible`](https://ownrecord.io/docs/reference/errors.md#installer_not_eligible) | 400         | The person isn't an active org_owner or org_admin of the organization. | Re-assign the app to an org_owner or org_admin of this organization.                                 |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found)         | 404         | No installation with this ID exists in the organization.               | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
| [`version_conflict`](https://ownrecord.io/docs/reference/errors.md#version_conflict)             | 409         | The installation changed at the same moment; retry.                    | Fetch the object again and retry the change.                                                         |
| [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied)           | 403         | You can't manage the organization's apps.                              | Ask an organization owner or admin for a role or scope that allows this action.                      |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`invalid_json`](https://ownrecord.io/docs/reference/errors.md#invalid_json), [`unsupported_media_type`](https://ownrecord.io/docs/reference/errors.md#unsupported_media_type), [`authentication_required`](https://ownrecord.io/docs/reference/errors.md#authentication_required), [`api_key_invalid`](https://ownrecord.io/docs/reference/errors.md#api_key_invalid), [`idempotency_key_required`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_required), [`idempotency_key_reused`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_reused), [`idempotency_in_progress`](https://ownrecord.io/docs/reference/errors.md#idempotency_in_progress), [`approval_required`](https://ownrecord.io/docs/reference/errors.md#approval_required), [`approval_rejected`](https://ownrecord.io/docs/reference/errors.md#approval_rejected), [`approval_expired`](https://ownrecord.io/docs/reference/errors.md#approval_expired), [`stale_approval`](https://ownrecord.io/docs/reference/errors.md#stale_approval), [`approval_policy_denied`](https://ownrecord.io/docs/reference/errors.md#approval_policy_denied), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
