> This page is for Referencia de la API.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://signalcore.ai/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://signalcore.ai/docs/_mcp/server.

# Phone Connect

POST https://signalcore.ai/v1/channels/phone/connect
Content-Type: application/json

A number the business keeps at its provider: its calls taken at LiveKit for the agent.
The channel's `address` is where the provider must send them, without registration.

Reference: https://signalcore.ai/docs/referencia/canales/phone-connect

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects an object.

- `agent_id` (string, required)
- `number` (string, required)

## Response

### 201

Successful Response

- `channel` (ChannelOut, required)
- `warnings` (list of string, required)

## Errors

### 422 Channels Phone Connect Request Unprocessable Entity Error

Validation Error

- `detail` (list of ValidationError, optional)

## Types

### ChannelOut

- `id` (string, required)
- `agent_id` (string, required)
- `kind` (enum, required)
  - Allowed values: `whatsapp`, `instagram`, `sms`, `phone`, `web`
- `provider` (string, required)
- `name` (string, required)
- `external_id` (string, required)
- `address` (string, required, nullable)
- `outbound` (boolean, required)
- `status` (enum, required)
  - Allowed values: `pending`, `active`, `error`, `disconnected`
- `detail` (string, required, nullable)
- `settings` (Settings, required)
- `created_at` (datetime, required)
- `web` (WebOut, optional, nullable) — A web channel as its panel shows it: the key the snippet carries, the sites, the look.

### ValidationError

- `loc` (list of ValidationErrorLocItem, required)
- `msg` (string, required)
- `type` (string, required)
- `input` (any, optional)
- `ctx` (map from string to any, optional)

### Settings

- `answers` (boolean, optional, default: true)
- `filter` (string, optional, nullable)
- `filter_keywords` (list of string, optional, default: [])
- `hours` (Hours, optional, nullable) — The week, in the agent's time zone: each day's stretches, in order and apart; a day left out, or empty, is closed.
- `answers_when` (enum, optional, default: in_hours)
  - Allowed values: `in_hours`, `out_of_hours`
- `away_message` (string, optional, nullable)
- `groups` (boolean, optional, default: false)
- `auto_release_after_h` (integer, optional, nullable)
- `instructions` (string, optional, nullable)
- `reply_delay_s` (integer, optional, default: 7)
- `split` (boolean, optional, default: true)
- `typing` (boolean, optional, default: true)
- `window_template` (string, optional, nullable)
- `voice_replies` (enum, optional, default: never)
  - Allowed values: `never`, `when_voice`, `always`

### WebOut

A web channel as its panel shows it: the key the snippet carries, the sites, the look.

- `key` (string, required)
- `origins` (list of string, required)
- `appearance` (Appearance, required) — How the widget looks: each unset field keeps the widget's own default (the page's type and ink, neutral greys). Colours are `#rrggbb`; sizes are pixels within what reads well.

### ValidationErrorLocItem

### Hours

The week, in the agent's time zone: each day's stretches, in order and apart; a day left out, or empty, is closed.

- `mon` (list of Span, optional, default: [])
- `tue` (list of Span, optional, default: [])
- `wed` (list of Span, optional, default: [])
- `thu` (list of Span, optional, default: [])
- `fri` (list of Span, optional, default: [])
- `sat` (list of Span, optional, default: [])
- `sun` (list of Span, optional, default: [])

### Appearance

How the widget looks: each unset field keeps the widget's own default (the page's type and ink, neutral greys). Colours are `#rrggbb`; sizes are pixels within what reads well.

- `accent` (string, optional, nullable)
- `accent_fg` (string, optional, nullable)
- `font` (enum, optional, nullable)
  - Allowed values: `Inter`, `Manrope`, `DM Sans`, `Plus Jakarta Sans`, `Poppins`, `Nunito`, `Lora`, `Playfair Display`
- `radius` (integer, optional, nullable)
- `theme` (enum, optional, default: auto)
  - Allowed values: `auto`, `light`, `dark`
- `position` (enum, optional, default: right)
  - Allowed values: `right`, `left`
- `launcher_size` (integer, optional, nullable)
- `panel_width` (integer, optional, nullable)
- `panel_height` (integer, optional, nullable)
- `header` (boolean, optional, default: false)
- `css` (string, optional, nullable)

### Span

A stretch of a day, from one time to a later one; `24:00` ends it at midnight.

- `start` (string, required)
- `end` (string, required)

## Examples

**Request**

```json
{
  "agent_id": "agent_id",
  "number": "number"
}
```

**Response**

```json
{
  "channel": {
    "id": "id",
    "agent_id": "agent_id",
    "kind": "whatsapp",
    "provider": "provider",
    "name": "name",
    "external_id": "external_id",
    "address": "address",
    "outbound": true,
    "status": "pending",
    "detail": "detail",
    "settings": {
      "answers": true,
      "filter": "filter",
      "filter_keywords": [
        "filter_keywords"
      ],
      "answers_when": "in_hours",
      "away_message": "away_message",
      "groups": true,
      "auto_release_after_h": 1,
      "instructions": "instructions",
      "reply_delay_s": 1,
      "split": true,
      "typing": true,
      "window_template": "window_template",
      "voice_replies": "never"
    },
    "created_at": "2024-01-15T09:30:00Z",
    "web": {
      "key": "key",
      "origins": [
        "origins"
      ],
      "appearance": {}
    }
  },
  "warnings": [
    "warnings"
  ]
}
```

**SDK Code**

```python
import requests

url = "https://signalcore.ai/v1/channels/phone/connect"

payload = {
    "agent_id": "agent_id",
    "number": "number"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```