> For the complete documentation index, see [llms.txt](https://digitalsac.gitbook.io/digicalls/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://digitalsac.gitbook.io/digicalls/click-to-call.md).

# Click to Call

## Click to Call

Links de **Click to Call** colocam um botão "ligar" em qualquer lugar — site, CRM, e-mail, assinatura — que dispara uma chamada de voz pela sua conexão WhatsApp direto do navegador de quem clica.

Cada link é uma **URL pública** amarrada, **no servidor**, a uma conexão e a um **número de destino fixo**. O token da conexão e o número **nunca aparecem na URL**, e o link **só funciona no fluxo de Click to Call** — se alguém tentar usá-lo em outro lugar (webphone, SIP, API), não funciona.

{% hint style="info" %}
**Resumo:** URL pública e descartável · número fixo definido no cadastro · vários links por conexão · revogável a qualquer momento.
{% endhint %}

### Como funciona

{% hint style="info" %}

```
Site/CRM do cliente                DigiCalls
┌───────────────────┐    abre    ┌───────────────────────────────────────────────┐
│ <a href=".../call/│ ─────────▶ │   GET /call/{linkId}  (página enxuta)        │
│     l_ab12cd34">  │            │     1) troca o linkId por um TICKET efêmero   │
│   Ligar           │            │        (POST /api/ctc/{linkId}/start)         │
└───────────────────┘            │     2) mic + WebRTC no navegador de quem clica│
                                 │     3) o servidor liga para o NÚMERO FIXO     │
                                 │        da conexão do link                     │
                                 └───────────────────────────────────────────────┘
```

{% endhint %}

1. Você cria um link escolhendo a **conexão** e o **número fixo**.
2. O sistema gera uma URL pública, tipo `https://SEU_HOST/call/l_ab12cd34`.
3. Quem abre a URL vê uma página simples com um botão **Ligar**. Ao clicar, o navegador pede o microfone e a chamada é feita **para o número fixo** que você definiu, pela sua linha WhatsApp.

O `linkId` é **público e não-secreto**: não carrega token nem o id da conexão. Ao abrir a página, ele é trocado por um **ticket efêmero** (curta duração), válido **apenas** para as rotas de Click to Call. Um ticket que vaze não serve como login de webphone nem como credencial SIP, e a chamada só pode ir para o número já amarrado ao link.

### URL pública

```
https://SEU_HOST/call/l_ab12cd34
```

Exemplo de produção:

```
https://calls.digitalsac.io/call/l_ab12cd34
```

Não há token nem número na URL — tudo fica no servidor, amarrado ao link.

### Segurança

* **Número fixo no servidor.** O destino é gravado no cadastro do link; quem abre a URL **não escolhe e não troca** o número.
* **Sem segredo na URL.** O `linkId` não expõe o token da conexão nem o id dela.
* **Escopo travado.** O ticket efêmero é aceito **somente** pelas rotas `/api/ctc/*`. É **rejeitado** pela autenticação normal, então não vira login de webphone nem credencial SIP.
* **Revogável.** Desative ou exclua o link para cortar o acesso imediatamente.
* **Rate limit.** A emissão de ticket é limitada por IP para conter abuso.

### Pré-requisitos

* Conexão **WhatsApp (QR) pareada** (`state: open`).
* Navegador de quem clica com microfone e **HTTPS** (o `localhost` também vale em desenvolvimento).

{% hint style="info" %}
Funciona com conexões **WhatsApp (QR)** e com dispositivos da **API Oficial (Cloud API)**. No oficial, a Meta só completa a ligação se o número de destino já autorizou receber chamadas desta conta — veja a nota em Primeiros passos.
{% endhint %}

### Próximos passos

* Primeiros passos — criar um link no painel e colocar no site.
* Campos e API — campos do link e referência das rotas.
