Cloud Call Documentation API
v1.0

Documentation API Cloud Call

L'API Cloud Call vous permet d'intégrer la téléphonie IA dans vos applications. Tous les endpoints retournent du JSON. L'authentification utilise des Bearer tokens JWT.

URL de base : https://api.cloud-call.io
Authentification requise — Toutes les routes protégées nécessitent un header Authorization: Bearer <accessToken>. Le token expire après 15 minutes. Utilisez POST /api/auth/refresh pour obtenir un nouveau token via le refreshToken.
Authentification
POST /api/auth/register Créer un nouveau compte
Corps de la requête
ChampTypeRequisDescription
emailstringRequisAdresse e-mail unique
passwordstringRequisMinimum 8 caractères
firstNamestringRequisPrénom
lastNamestringRequisNom de famille
organizationNamestringRequisNom de l'organisation
Réponse 201 — Compte créé
{
  "accessToken":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
  "user": {
    "id":             "usr_01J...",
    "email":          "contact@entreprise.fr",
    "firstName":     "Sophie",
    "lastName":      "Martin",
    "organizationId": "org_01J...",
    "role":           "owner",
    "createdAt":      "2025-01-15T10:00:00.000Z"
  }
}
POST /api/auth/login Se connecter
Corps de la requête
ChampTypeRequisDescription
emailstringRequisAdresse e-mail
passwordstringRequisMot de passe
Réponse 200
{
  "accessToken":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
  "user": {
    "id":    "usr_01J...",
    "email": "contact@entreprise.fr",
    "role":  "owner"
  }
}
POST /api/auth/refresh Renouveler le token d'accès
Corps de la requête
ChampTypeRequisDescription
refreshTokenstringRequisToken de renouvellement obtenu lors de la connexion
Réponse 200
{
  "accessToken":  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4..."
}
GET /api/auth/me Profil de l'utilisateur connecté
Headers requis
HeaderValeurDescription
AuthorizationstringRequisBearer <accessToken>
Réponse 200
{
  "id":             "usr_01J...",
  "email":          "contact@entreprise.fr",
  "firstName":     "Sophie",
  "lastName":      "Martin",
  "role":           "owner",
  "organizationId": "org_01J...",
  "plan":           "pro",
  "createdAt":      "2025-01-15T10:00:00.000Z"
}
Appels
GET /api/calls Lister les appels
Paramètres de requête
ParamètreTypeRequisDescription
pageintegerOptionnelNuméro de page (défaut : 1)
limitintegerOptionnelRésultats par page, max 100 (défaut : 20)
directionstringOptionnelinbound | outbound
statusstringOptionnelcompleted | missed | in_progress
date_fromstringOptionnelISO 8601, ex. 2025-01-01T00:00:00Z
date_tostringOptionnelISO 8601
Réponse 200
{
  "data": [
    {
      "id":           "call_01J...",
      "direction":   "inbound",
      "status":      "completed",
      "from":        "+33612345678",
      "to":          "+33756789012",
      "duration":    187,
      "startedAt":   "2025-03-10T14:32:00.000Z",
      "endedAt":     "2025-03-10T14:35:07.000Z",
      "hasRecording": true,
      "sentiment":   "positive"
    }
  ],
  "total": 142,
  "page":  1,
  "limit": 20
}
GET /api/calls/:id Détail d'un appel
Réponse 200
{
  "id":           "call_01J...",
  "direction":   "inbound",
  "status":      "completed",
  "from":        "+33612345678",
  "to":          "+33756789012",
  "duration":    187,
  "transcript":  "Bonjour, je voudrais...",
  "summary":     "Client demande remboursement livraison J+3",
  "sentiment":   "positive",
  "recordingUrl": "https://cdn.cloud-call.io/recordings/call_01J....mp3",
  "agentId":     "agt_01J...",
  "contactId":   "cnt_01J...",
  "tags":        ["livraison", "remboursement"],
  "startedAt":   "2025-03-10T14:32:00.000Z",
  "endedAt":     "2025-03-10T14:35:07.000Z"
}
Contacts
GET /api/contacts Lister les contacts
Paramètres de requête
ParamètreTypeRequisDescription
pageintegerOptionnelNuméro de page (défaut : 1)
limitintegerOptionnelRésultats par page (défaut : 20)
searchstringOptionnelRecherche par nom, téléphone ou email
tagstringOptionnelFiltrer par tag
Réponse 200
{
  "data": [
    {
      "id":        "cnt_01J...",
      "firstName": "Marie",
      "lastName":  "Dupont",
      "phone":     "+33612345678",
      "email":     "marie.dupont@exemple.fr",
      "tags":      ["prospect", "lyon"],
      "callCount": 3,
      "createdAt": "2025-02-01T09:00:00.000Z"
    }
  ],
  "total": 84,
  "page":  1,
  "limit": 20
}
POST /api/contacts Créer un contact
Corps de la requête
ChampTypeRequisDescription
phonestringRequisFormat E.164 ex. +33612345678
firstNamestringOptionnelPrénom
lastNamestringOptionnelNom
emailstringOptionnelAdresse e-mail
tagsstring[]OptionnelListe de tags
customFieldsobjectOptionnelChamps personnalisés clé/valeur
Réponse 201 — Contact créé
{
  "id":        "cnt_01J...",
  "phone":     "+33612345678",
  "firstName": "Marie",
  "lastName":  "Dupont",
  "email":     "marie.dupont@exemple.fr",
  "tags":      ["prospect"],
  "createdAt": "2025-03-15T11:00:00.000Z"
}
DELETE /api/contacts/:id Supprimer un contact
Réponse 200
{ "success": true }
POST /api/contacts/import Importer depuis un fichier CSV
Corps — multipart/form-data
ChampTypeRequisDescription
fileFileRequisFichier CSV (max 10 Mo). Colonnes : phone, firstName, lastName, email, tags
Réponse 200
{
  "imported": 243,
  "skipped":  7,
  "errors": [
    { "row": 4, "reason": "Numéro de téléphone invalide" }
  ]
}
Campagnes
POST /api/campaigns Créer une campagne d'appels sortants
Corps de la requête
ChampTypeRequisDescription
namestringRequisNom de la campagne
agentIdstringRequisID de l'agent IA à utiliser
contactIdsstring[]RequisListe d'IDs de contacts à appeler
callWindowobjectOptionnelFenêtre horaire : {from: "09:00", to: "18:00", timezone: "Europe/Paris"}
maxConcurrentintegerOptionnelAppels simultanés max (défaut : 3)
retryCountintegerOptionnelNombre de rappels si pas de réponse (défaut : 2)
Réponse 201
{
  "id":          "cmp_01J...",
  "name":        "Relance prospects mars",
  "status":      "draft",
  "totalCalls":  150,
  "createdAt":   "2025-03-01T08:00:00.000Z"
}
POST /api/campaigns/:id/start Démarrer une campagne
Réponse 200
{ "id": "cmp_01J...", "status": "running", "startedAt": "2025-03-01T09:00:00.000Z" }
POST /api/campaigns/:id/pause Mettre en pause une campagne
Réponse 200
{ "id": "cmp_01J...", "status": "paused" }
Facturation
GET /api/billing/credits Solde de crédits de l'organisation
Réponse 200
{
  "balance":       1240,
  "unit":          "minutes",
  "plan":          "pro",
  "monthlyIncluded": 500,
  "renewsAt":      "2025-04-01T00:00:00.000Z"
}
POST /api/billing/checkout Créer une session de paiement
Corps de la requête
ChampTypeRequisDescription
packstringRequisstarter | pro | enterprise | credits_500 | credits_1000
successUrlstringOptionnelURL de redirection après paiement réussi
cancelUrlstringOptionnelURL de redirection en cas d'annulation
Réponse 200
{
  "checkoutUrl": "https://checkout.revolut.com/payment-link/...",
  "sessionId":   "pay_01J...",
  "expiresAt":   "2025-03-15T12:30:00.000Z"
}
Webhooks sortants
Cloud Call envoie ces événements en POST vers l'URL webhook configurée dans votre tableau de bord. Chaque requête inclut le header X-Cloud Call-Signature (HMAC-SHA256 du corps avec votre clé secrète) pour vérifier l'authenticité.
call.started WEBHOOK Déclenché dès qu'un appel est établi
{
  "event":     "call.started",
  "id":        "evt_01J...",
  "createdAt": "2025-03-10T14:32:00.000Z",
  "data": {
    "callId":    "call_01J...",
    "direction": "inbound",
    "from":      "+33612345678",
    "to":        "+33756789012",
    "agentId":   "agt_01J...",
    "contactId": "cnt_01J...",
    "startedAt": "2025-03-10T14:32:00.000Z"
  }
}
call.ended WEBHOOK Déclenché à la fin d'un appel (avec transcription)
{
  "event":     "call.ended",
  "id":        "evt_01J...",
  "createdAt": "2025-03-10T14:35:07.000Z",
  "data": {
    "callId":       "call_01J...",
    "duration":     187,
    "status":       "completed",
    "transcript":   "Bonjour, je voudrais...",
    "summary":      "Client demande remboursement livraison J+3",
    "sentiment":    "positive",
    "recordingUrl": "https://cdn.cloud-call.io/recordings/call_01J....mp3",
    "tags":         ["livraison", "remboursement"],
    "endedAt":      "2025-03-10T14:35:07.000Z"
  }
}
call.transferred WEBHOOK Déclenché quand l'IA transfère vers un agent humain
{
  "event":     "call.transferred",
  "id":        "evt_01J...",
  "createdAt": "2025-03-10T14:34:00.000Z",
  "data": {
    "callId":         "call_01J...",
    "transferredTo":  "+33756789099",
    "reason":         "Demande client — dossier complexe",
    "agentNote":      "Client Premium, 18 mois, frustré livraison J+5",
    "transferredAt":  "2025-03-10T14:34:00.000Z"
  }
}