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

# Core concepts

> Robots, channels and conversations, and the one rule that shapes every integration.

## The one rule

**A channel always belongs to a robot.** There is no free-standing Instagram connection. Create the
robot first, then attach the channel to it.

```
create robot  →  attach channel  →  receive events
```

This is enforced in the data model, not a convention we could relax. A channel cannot exist without
a robot to own it.

> **Warning**
>
> Connecting a channel before creating a robot fails validation. It is the most common
> first-integration error.

## The objects

#### Robot

A workspace holding conversations, automation rules and training data. `rbt_…`

#### Channel

A connected surface, such as an Instagram page. Belongs to exactly one robot. `chn_…`

#### Conversation

One thread with one end customer, on one channel. `cnv_…`

**A robot holds at most one channel per type.** One robot cannot have two Instagram pages. Give the
second page its own robot.

## Customer and end user are two different people

These two words appear throughout this documentation and they never mean the same thing.

|              | Who it is                           | What they do                                                          |
| ------------ | ----------------------------------- | --------------------------------------------------------------------- |
| **Customer** | A business you serve                | Has a robot. Their operators answer conversations                     |
| **End user** | A person who messages that business | Sends the Instagram DM or Telegram message that starts a conversation |

If you are a partner, your customers are the businesses on your platform. Their end users are the
public. A conversation is always between an **end user** and a **customer's** operators or AI.

## One robot per customer

If you serve many customers, create one robot per customer. That is what keeps one customer's
conversations, automation rules and training data out of another's.

End users need no such separation: they are identified inside a robot's conversations, and the same
person messaging two different customers produces two unrelated conversations.

## `external_id` is your own identifier

Every robot can carry an `external_id`: your own customer id. We return it on every event, so you
never need a lookup table between our ids and yours.

```json
{ "name": "Rose Flower Shop", "external_id": "shop_10422" }
```

`external_id` is unique per partner, so yours cannot collide with another partner's. Reusing one of
your own returns `409`.

> **Info**
>
> Messages carry an `external_id` too, doing a different job: it is your idempotency key. Send a
> message with an `external_id` you have used before and we will not create a duplicate. See
> [Webhook events](/documentation/guides/webhook-events).

## Capacity

How many robots and channels you may have comes from your plan. If you need more, contact our
sales team.

When capacity runs out you get `403 capacity_exhausted`. `details` tells you where you stand: `occupied` is your enabled channels, `requested` is how many this call needs, and `capacity` is what your plan allows.

```json
{
  "error": {
    "code": "capacity_exhausted",
    "message": "You have reached the maximum number of channels your plan allows.",
    "request_id": "req_8f2Kq9mR",
    "details": { "occupied": 10, "requested": 1, "capacity": 10 }
  }
}
```

Deleting a robot or channel frees capacity immediately. **Disabling a channel frees it too** —
capacity counts enabled channels only, so a paused customer's page keeps its history, rules and
configuration without occupying a slot. See [Enable and disable a channel](/documentation/guides/when-a-plan-lapses#reactivating-after-a-renewal).