---
title: "Connect a new channel account"
method: POST
path: "/api/channels"
tags: ["Channels"]
---

# Connect a new channel account

`POST /api/channels`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/channels`
- Auth: API key in cookie `luca.session_token`

Closed on purpose. A channel account only gets created by finishing a verified provider flow, so posting credentials straight here always returns 400. Use the connect flow for that channel.

**Session-only.** This endpoint isn't on the API-key allowlist. An organization API key gets a 403 here, whatever scopes it holds.

## Headers

- `Luca-API-Version` '1'

## Request body

- ChannelCreate
  - `channel` 'telegram' | 'instagram' | 'messenger' | 'whatsapp', required
  - `externalAccountId` string, required
  - `encryptedCredentials` string, required

## Response `200`

ok

- ChannelAccountSummary
  - `id` string, uuid, required
  - `channel` 'telegram' | 'instagram' | 'messenger' | 'whatsapp', required
  - `externalAccountId` string, required
  - `displayName` string
  - `status` 'connected' | 'disconnected' | 'paused' | 'suspended' | 'reconnect_required', required
  - `aiDmAutoSendEnabled` boolean, required
  - `aiDmAutoSendActive` boolean, required
  - `connectedAt` string, required
  - `coachState` object, required
    - `code` 'connected' | 'checking' | 'degraded' | 'action_required' | 'reconnect_required' | 'paused' | 'externally_blocked', required
    - `label` string, required
    - `description` string, required
    - `actions` string[], required
  - `cleanup` object
    - `status` 'completed' | 'queued' | 'retry_required', required
  - `composer` object, required
    - `canSend` boolean, required
    - `text` boolean, required
    - `media` object[], required
      - `kind` 'image' | 'video' | 'audio' | 'voice' | 'document', required
      - `maxBytes` integer, required
      - `mimeTypes` string[]
    - `interactions` object[], required
      - `kind` 'buttons' | 'list' | 'quick_replies' | 'inline_buttons', required
      - `maxOptions` integer, required
      - `titleMaxLength` integer, required
      - `descriptionMaxLength` integer
    - `templates` boolean, required
    - `externallyBlocked` boolean, required
    - `blocker` string
  - `health` object
    - `status` 'green' | 'yellow' | 'red', required
    - `signals` string[], required
    - `checkedAt` string, nullable, required
    - `readiness` object, nullable
      - `version` 1, required
      - `status` 'ready' | 'degraded' | 'blocked' | 'unknown', required
      - `checks` object[], required
        - `key` string, required
        - `status` 'pass' | 'warn' | 'fail' | 'unknown', required
        - `source` 'provider' | 'local' | 'cached', required
        - `detail` string
      - `checkedAt` string, required

## Other responses

- `400`: validation failed
- `401`: unauthorized
- `429`: rate limited

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
