# Guide : n8n

Deux façons de brancher le téléphone dans n8n :

- **Un workflow classique** (recommandé pour l'automatisation) : un nœud **HTTP Request** lance l'appel, un nœud
  **Webhook** reçoit les événements signés (question, fin d'appel…).
- **Un agent IA n8n** : le nœud **AI Agent** utilise nos outils via le nœud **MCP Client Tool**.

## Avant de commencer

1. Crée ton compte sur `/app/`, vérifie ton numéro de mobile par SMS (5 minutes offertes), puis crée une clé API
   (`tel_…`) dans **Clés API**.
2. Récupère ton **secret de webhook** (`whsec_…`, propre à ton compte) : il sert à vérifier que les événements viennent
   bien de nous. Il n'est pas encore affiché dans l'espace client : demande-le au support en attendant.
3. Dans n8n, crée un identifiant (credential) **Header Auth** : nom `Authorization`, valeur `Bearer tel_…`.

## 1. Lancer un appel (HTTP Request)

| Paramètre | Valeur |
|---|---|
| Method | `POST` |
| URL | `https://api.dialyne.com/v1/missions` |
| Authentication | Generic Credential Type › Header Auth (l'identifiant ci-dessus) |
| Send Body | JSON |

```json
{
  "numero": "+33142000000",
  "mission": "Demande si la commande 4521 est prête et à quelle heure on peut passer la chercher, au nom de Moha K.",
  "webhook_url": "https://ton-n8n.exemple.fr/webhook/telephone"
}
```

La réponse (201) contient l'`id` de la mission. L'appel continue en arrière-plan : la suite arrive par webhook.

## 2. Recevoir les événements (Webhook)

1. Ajoute un nœud **Webhook** : méthode `POST`, chemin `telephone`. Dans ses options, active **Raw Body** : la
   signature se calcule sur le corps brut, octet pour octet.
2. Mets l'URL de production de ce nœud dans `webhook_url` (HTTPS public obligatoire).
3. Ajoute un nœud **Code** juste après pour vérifier la signature (voir aussi [Webhooks](webhooks.md)) :

```js
// n8n auto-hébergé : autorise le module crypto avec NODE_FUNCTION_ALLOW_BUILTIN=crypto
const crypto = require('crypto');
const SECRET = $env.DIALYNE_WEBHOOK_SECRET;            // whsec_…
const headers = $input.first().json.headers;
const ts = headers['x-webhook-timestamp'] ?? '';
const sig = headers['x-webhook-signature'] ?? '';
const raw = await this.helpers.getBinaryDataBuffer(0, 'data'); // corps brut (option Raw Body)

const attendu = 'sha256=' + crypto.createHmac('sha256', SECRET).update(ts + '.').update(raw).digest('hex');
const ok = /^\d+$/.test(ts) && Math.abs(Date.now() / 1000 - Number(ts)) <= 300
  && sig.length === attendu.length && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(attendu));
if (!ok) throw new Error('Signature invalide');
return [{ json: JSON.parse(raw.toString('utf8')) }];
```

4. Ajoute un nœud **Switch** sur `{{ $json.type }}` :
   - `appel.question` : la question est dans `data.question`, l'identifiant dans `data.question_id`, l'échéance dans
     `data.expires_at`. Réponds avec un HTTP Request `POST /v1/missions/{{ $json.mission_id }}/answer` et le corps
     `{"reponse": "…", "question_id": "{{ $json.data.question_id }}"}`. Si la réponse doit venir d'une personne
     (Telegram, Slack…), commence par `POST /v1/missions/{{ $json.mission_id }}/question/prolonger`.
   - `appel.fin` : résultat dans `data.resultat`, résumé dans `data.resume`.
   - `appel.rappel_suggere` : l'interlocuteur veut être rappelé ; relance avec `POST /v1/missions/{id}/rappeler`.

Réponds vite (le nœud Webhook répond 200 tout de suite par défaut) : au-delà de 10 s, nous réessayons l'envoi.

## 3. Variante : un agent IA n8n

1. Ajoute un nœud **AI Agent** et un modèle de chat.
2. Branche un sous-nœud **MCP Client Tool** :
   - Endpoint : `https://mcp.dialyne.com/mcp` (selon ta version de n8n, le champ s'appelle
     « Endpoint » ou « SSE Endpoint » ; choisis le transport **HTTP Streamable** s'il t'est proposé) ;
   - Authentication : **Bearer**, avec ta clé `tel_…` ;
   - Tools to Include : **All**.
3. L'agent dispose alors de `place_phone_call`, `get_call`, `answer_call_question`, `hold_call_question`… Dis-lui de
   suivre l'appel avec `get_call` jusqu'à `done = true`.

Pour une automatisation sans humain, la variante HTTP Request + Webhook est plus fiable : chaque étape est
explicite et rejouable.
