> For the complete documentation index, see [llms.txt](https://ajuda.digitalsac.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ajuda.digitalsac.io/digicrm/configuracao/integracao-comercial/planos-comerciais.md).

# Planos comerciais

O sistema comercial deve expor um endpoint `GET` com o catálogo consumido pelo cadastro público e pela sincronização local.

### Request

```http
GET {CUSTOM_COMMERCIAL_URL}{CUSTOM_PLANS_ENDPOINT}
Authorization: Bearer SEU_CUSTOM_COMMERCIAL_TOKEN
apiKey: SEU_CUSTOM_COMMERCIAL_TOKEN
Content-Type: application/json
```

Timeout: 10 segundos.

### Response completa

```json
{
  "plans": [{
    "id": 2,
    "name": "Pro",
    "users": 10,
    "usersConnected": 10,
    "channels": 5,
    "campaignMessages": 1000,
    "price": "199.90",
    "additionalUserPrice": 15,
    "additionalChannelPrice": 25,
    "additionalSpacePrice": 5,
    "trial": 0,
    "trialDays": 0,
    "recurrence": "MENSAL",
    "activeia": true,
    "iaPrice": 40,
    "activecampaign": true,
    "campaignPrice": 30,
    "activecampaignwaba": true,
    "campaignWabaPrice": 35,
    "activecampaignsms": false,
    "campaignSmsPrice": 20,
    "activetypebot": true,
    "typebotPrice": 20,
    "activescheduler": true,
    "schedulerPrice": 10,
    "activekanban": true,
    "kanbanPrice": 10,
    "activecampaigndigicalls": false,
    "campaignDigicallsPrice": 60,
    "activeinternalchat": true,
    "internalChatPrice": 15,
    "valueCredit": 0,
    "contractedSpace": 5,
    "maxContacts": 10000,
    "isHidden": false
  }],
  "count": 1,
  "hasMore": false
}
```

Também são aceitos array direto ou coleção em `data`. Se `count` faltar, usa `total` ou o tamanho do array; `hasMore` ausente vira `false`.

### Limites e valores base

| Campo              | Alias aceito        | Tipo          | Obrigatório | Efeito               |
| ------------------ | ------------------- | ------------- | ----------- | -------------------- |
| `id`               | `planId`, `plan_id` | string/number | sim         | ID estável           |
| `name`             | —                   | string        | sim         | Nome único           |
| `users`            | —                   | number        | sim         | Usuários incluídos   |
| `usersConnected`   | `users_connected`   | number        | sim         | Sessões simultâneas  |
| `channels`         | —                   | number        | sim         | Canais incluídos     |
| `campaignMessages` | `campaign_messages` | number        | sim         | Franquia de campanha |
| `price`            | —                   | string/number | sim         | Mensalidade base     |
| `trial`            | —                   | number        | sim         | `0` ou `1`           |
| `trialDays`        | `trial_days`        | number        | sim         | Dias de trial        |
| `recurrence`       | —                   | string        | sim         | Ex.: `MENSAL`        |
| `valueCredit`      | `value_credit`      | number        | sim         | Crédito incluído     |
| `contractedSpace`  | `contracted_space`  | number        | sim         | Espaço base em GB    |
| `maxContacts`      | `max_contacts`      | number/null   | recomendado | `null` = ilimitado   |
| `isHidden`         | `is_hidden`         | boolean       | sim         | Oculta no cadastro   |

### Preços dos adicionais

| Campo                    | Alias                      | Efeito                  |
| ------------------------ | -------------------------- | ----------------------- |
| `additionalUserPrice`    | `additional_user_price`    | Preço por usuário extra |
| `additionalChannelPrice` | `additional_channel_price` | Preço por canal extra   |
| `additionalSpacePrice`   | `additional_space_price`   | Preço por GB extra      |

### Módulos

| Flag                      | Preço                    | Alias do preço             |
| ------------------------- | ------------------------ | -------------------------- |
| `activeia`                | `iaPrice`                | `ia_price`                 |
| `activecampaign`          | `campaignPrice`          | `campaign_price`           |
| `activecampaignwaba`      | `campaignWabaPrice`      | `campaign_waba_price`      |
| `activecampaignsms`       | `campaignSmsPrice`       | `campaign_sms_price`       |
| `activetypebot`           | `typebotPrice`           | `typebot_price`            |
| `activescheduler`         | `schedulerPrice`         | `scheduler_price`          |
| `activekanban`            | `kanbanPrice`            | `kanban_price`             |
| `activecampaigndigicalls` | `campaignDigicallsPrice` | `campaign_digicalls_price` |
| `activeinternalchat`      | `internalChatPrice`      | `internal_chat_price`      |

Aliases adicionais: `active_campaign_digicalls`, `active_internal_chat` e `useInternalChat`.

Flag `true` inclui o módulo no plano. Se for `false`, ele pode ser contratado por tenant em `additionalModules`.

### Normalização

* Booleanos: `true/false`, `1/0`, `yes/no`, `sim/não`.
* Números: number ou string numérica; inválidos viram `0`.
* `maxContacts`: `null` ou string vazia viram ilimitado.
* Prefira camelCase e tipos JSON nativos.

{% hint style="warning" %}
Envie o contrato completo. Campos ausentes podem virar `0` ou `false` e sobrescrever o plano local durante a sincronização.
{% endhint %}

Planos com `isHidden: true` não aparecem no cadastro, mas continuam sincronizados. Nunca reutilize IDs; `Tenant.planId` depende deles.
