---
title: "Manage a Slack migration"
method: POST
path: "/slack/migration"
tags: ["Imports"]
---

# Manage a Slack migration

`POST /slack/migration`

## Request

- Base URL: `https://api.ando.so/v1`
- URL: `https://api.ando.so/v1/slack/migration`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Discover channels after Slack consent, prepare exact mappings, apply an immutable plan, and inspect or retry durable results. Requires a human owner/admin API key with slack_migration:read; begin_connection, plan, apply and retry additionally require slack_migration:write. Independently gated discovery/write rollout. Initial mapping pilot supports internal public channels only.

## Request body

- SlackMigrationRequest: Human-authorized native Slack migration. Read connection and directory before submitting exact selections. Apply requires plan_id, plan_version and idempotency_key. Retry requires operation_id, item_ids and idempotency_key.
  - `action` 'connection' | 'begin_connection' | 'get_connection_attempt' | 'list_channels' | 'plan' | 'get_plan' | 'apply' | 'get_operation' | 'retry', required: Operation to perform.
  - `expected_slack_team_id` string: Verified Slack team ID. Required for planning.
  - `connection_attempt_id` string: Resumable connection reference.
  - `plan_id` string: Immutable plan reference.
  - `plan_version` 1
  - `operation_id` string: Durable operation reference.
  - `idempotency_key` string
  - `cursor` string
  - `limit` integer
  - `item_ids` string[]
  - `selections` object[]
    - `slack_channel_id` string, required
    - `target` union, required
      - object: Create a new channel; an existing name is a blocker.
        - `kind` 'create_channel', required
        - `name` string, required
      - object: Reuse this exact public channel without retargeting an existing mapping.
        - `kind` 'existing_channel', required
        - `conversation_id` string, required
    - `live_sync` boolean, required
    - `backfill_history` boolean, required

## Response `200`

Migration operation result.

- SlackMigrationResponse: Operation-specific result. Setup completion does not prove historical completeness. Private and Slack Connect sources are discoverable but blocked in this initial pilot.
  - `data` object, required: Connection identity/attempt, paginated directory, immutable plan with per-item blockers, operation reference, or per-item mapping/sync/history readback. Directory completeness is explicit.

## Other responses

- `400`: Bad request.
- `401`: Missing or invalid API key.
- `403`: Forbidden.
- `404`: Not found.
- `409`: Conflict.
- `429`: Rate limit or quota exceeded.
- `500`: Internal server error.

## Changes

- **2026-10-18** `aaceae49c08d`: 12 info
  - added the optional property `request_id` to the response with the `400` status
  - added the optional property `request_id` to the response with the `401` status
  - added the optional property `request_id` to the response with the `403` status
  - added the optional property `request_id` to the response with the `404` status
  - …8 more
- **2026-10-13** `a1b7544d3bf4`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ando/apis/ando-public-api/changes/slack/migration/post.md)

---

[API](https://skmtc.dev/ando/apis/ando-public-api.md) - [All operations](https://skmtc.dev/ando/apis/ando-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ando/apis/ando-public-api/revisions/d852746d81c2?raw)
