Tous les endpoints CRM Lookup sont scopés au workspace et requièrent les scopes OAuth client et crm. Ces endpoints sont appelés par le Middleware CRM lors des événements PBX (appels entrants, appels sortants, sessions de chat).

En-têtes : Authorization: Bearer {workspace-token}

Le contexte client est résolu automatiquement depuis le token OAuth.


GET /api/crm/lookup/contacts/search

Recherche des contacts dans le CRM connecté par numéro de téléphone ou adresse email. Généralement appelé lors d'un screen-pop quand un appel sonne sur le PBX.

Paramètres de requête

Paramètre Type Requis Description
phone string oui* Numéro de téléphone à rechercher
email string oui* Adresse email à rechercher
display_name string non Nom affiché de l'appelant — utilisé par les intégrations URL-builder pour construire l'URL du contact

*Au moins phone ou email est requis.

Réponse 200

{
  "contacts": [
    {
      "id": "crm-contact-uuid",
      "first_name": "Alice",
      "last_name": "Martin",
      "email": "alice.martin@acme.com",
      "phone_business_1": "+33142000000",
      "phone_mobile_1": "+33612345678",
      "company": "Acme Corp",
      "entity_url": "https://crm.example.com/contacts/123"
    }
  ]
}

Si aucune correspondance n'est trouvée dans le CRM, un contact fictif est retourné afin que 3CX puisse tout de même déclencher l'étape de création d'appel.


POST /api/crm/lookup/contacts

Crée un nouveau contact dans le CRM connecté.

Corps de la requête

Champ Type Requis Description
last_name string oui Nom de famille
first_name string non Prénom
civility string non Civilité
email string non Adresse email
phone string non Numéro de téléphone générique
phone_business string non Numéro de téléphone professionnel
phone_mobile string non Numéro de téléphone mobile
custom_value string non Valeur de champ CRM personnalisé
call_direction string non Direction de l'appel déclencheur (inbound ou outbound)

Réponse 201

{
  "response": "ok",
  "contact": { ... }
}

Réponse 400 — le connecteur CRM n'a pas pu créer le contact.


GET /api/crm/lookup/phone-calls

Retourne la liste des appels téléphoniques depuis le connecteur CRM connecté.

Paramètres de requête

Paramètre Description
filter[direction] inbound, outbound ou internal
filter[status] Statut de l'appel
filter[answered] Booléen — si l'appel a été décroché
filter[number_from] Numéro appelant
filter[number_to] Numéro appelé
filter[number_did] Numéro DID / groupe d'appel
filter[start_time] Heure de début de l'appel
filter[end_time] Heure de fin de l'appel
filter[agent_email] Adresse email de l'agent
filter[subject] Sujet de l'appel
include Relations à inclure (séparées par virgule) : segments, logs
sort Champ de tri : start_time, end_time, created_at, updated_at. Préfixez avec - pour décroissant
per_page Résultats par page (défaut : 20)

Réponse 200 — liste paginée d'objets appel.


POST /api/crm/lookup/phone-calls

Enregistre un appel téléphonique terminé dans le CRM connecté. C'est l'endpoint principal appelé par le Middleware CRM lorsqu'un appel se termine sur le PBX.

Corps de la requête

Champ Type Requis Description
direction string oui inbound, outbound ou internal (insensible à la casse)
status string oui completed, failed, busy, no-answer, Missed ou Notanswered
number_from string oui* Numéro appelant
number_to string oui* Numéro appelé
number_external string oui** Numéro de la partie externe
number_internal string oui** Extension interne
source string non Identifiant de la source PBX (ex. 3cx)
answered boolean non Si l'appel a été décroché
duration string/integer non Durée de l'appel
start_time_utc string non Heure de début en UTC — format : YYYY-MM-DDTHH:MM:SSZ
end_time_utc string non Heure de fin en UTC — format : YYYY-MM-DDTHH:MM:SSZ
subject string non Sujet de l'appel
body string non Notes ou extrait de transcription
recording_url string non URL de l'enregistrement de l'appel
agent_first_name string non Prénom de l'agent ayant pris l'appel
agent_last_name string non Nom de l'agent ayant pris l'appel
agent_email string non Email de l'agent ayant pris l'appel
queue_extension string non Extension de la file d'attente ou du groupe d'appel

*number_from et number_to sont mutuellement requis — fournissez les deux ou aucun.
**number_external et number_internal sont mutuellement requis — fournissez les deux ou aucun.

Réponse 201

{
  "response": "success",
  "message": "Call saved successfully.",
  "call": { ... }
}

Réponse 400 — la journalisation des appels n'est pas activée pour ce compte.


POST /api/crm/lookup/phone-calls/context

Crée ou met à jour un enregistrement de contexte d'appel pendant un appel en cours. Le contexte permet de pré-renseigner la fiche CRM afin qu'à la fin de l'appel, l'entrée complète puisse être enrichie sans dépendre uniquement du payload final.

Corps de la requête

Champ Type Requis Description
direction string oui inbound ou outbound
number_from string oui (si inbound) Numéro appelant
number_to string oui (si outbound) Numéro appelé
source string non Identifiant de la source PBX (ex. 3cx)
start_time_utc string non Heure de début en UTC — format : YYYY-MM-DDTHH:MM:SSZ
start_time_reference string non Référence temporelle du contexte : call (défaut) ou segment
segment_dn_type string non Type de DN : extension, trunk, call_queue, voicemail, ivr, external_number, call_flow
context_data array non Paires clé-valeur arbitraires à stocker avec le contexte

Réponse 201

{
  "response": "success",
  "message": "Call context saved successfully.",
  "call_context_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Variante par token

Pour les cas où le Middleware CRM ne peut pas utiliser un token OAuth standard, un token de contexte pré-émis peut être utilisé à la place :

POST /api/crm/phone-calls-context/{token}/{tokenSecret}

Cet endpoint accepte le même corps de requête et ne nécessite pas d'en-tête Authorization. Le token (UUID) et le tokenSecret sont émis par CX-Engine et scopés à un client spécifique.


POST /api/crm/lookup/chats

Enregistre une session de chat terminée dans le CRM connecté. Appelé par le Middleware CRM lorsqu'une session de chat se termine sur le PBX.

Corps de la requête

Champ Type Requis Description
email string oui Adresse email du client
source string non Identifiant de la source PBX (ex. 3cx)
number_external string non Numéro externe ou identifiant du client
name string non Nom affiché du client
start_time_utc string non Heure de début en UTC — format : YYYY-MM-DDTHH:MM:SSZ
end_time_utc string non Heure de fin en UTC — format : YYYY-MM-DDTHH:MM:SSZ
duration string/integer non Durée du chat
subject string non Sujet du chat
chat_messages string non Transcription ou résumé du chat
queue_extension string non Extension de la file d'attente ou du groupe d'appel
entity_type string non Type d'entité CRM à lier au chat
entity_id string non ID de l'entité CRM à lier au chat
agent string non Identifiant de l'agent
agent_first_name string non Prénom de l'agent ayant pris en charge le chat
agent_last_name string non Nom de l'agent ayant pris en charge le chat
agent_email string non Email de l'agent ayant pris en charge le chat

Réponse 201

{
  "response": "success",
  "message": "Chat saved successfully.",
  "chat": { ... }
}

Réponse 400 — la journalisation des chats n'est pas activée pour ce compte.