Skip to main content

API Externe - Portail Clients CAM

Vue d'ensemble

L'API Externe du Portail Clients CAM permet aux applications tierces de créer des prospects et des demandes de crédit de manière sécurisée et contrôlée. Cette API REST est conçue pour être intégrée dans des sites web, applications mobiles ou systèmes partenaires.

URL de Base

https://[domaine-api]/api/external/

Authentification

Méthode d'authentification : Clé API

L'API utilise un système d'authentification basé sur des clés API. Chaque client reçoit une clé unique qui doit être incluse dans toutes les requêtes. L'API Key de chaque environnement est disponible dans le keepass.

Méthodes de transmission de la clé API

Option 1 : En-tête HTTP (Recommandée)

X-API-Key: sk_test_1234567890abcdef_site_internet

Option 2 : Paramètre de requête

GET /api/external/health?apikey=sk_test_1234567890abcdef_site_internet

Configuration des clés API

Les clés API sont configurées dans le fichier appsettings.json :

{
"ExternalApi": {
"ApiKeys": {
"site_internet": {
"Key": "sk_test_1234567890abcdef_site_internet",
"Name": "Site Internet Public",
"ClientId": "site_internet_client",
"ClientName": "Site Internet CAM",
"IsActive": true,
"ExpiresAt": null,
"Permissions": [
"ExternalApi.ProspectCredit.Create",
"ExternalApi.ProspectCredit.ViewStatus"
]
}
}
}
}

Limitation de taux (Rate Limiting)

L'API applique une limitation de taux pour prévenir les abus et garantir la disponibilité du service.

Limites par défaut

  • Requêtes maximales : 100 requêtes
  • Fenêtre de temps : 1 heure
  • Identification : Par clé API ou adresse IP

En-têtes de réponse

Lorsque la limite est atteinte :

  • Statut HTTP : 429 Too Many Requests
  • En-tête : Retry-After: [secondes]

Endpoints disponibles

1. Création de Prospect et Demande de Crédit

Crée un nouveau prospect et une demande de crédit associée dans Salesforce.

Endpoint

POST /api/external/prospect-credit

En-têtes requis

Content-Type: application/json
X-API-Key: [votre-clé-api]

Corps de la requête

{
"prospect": {
"nom": "Dupont",
"prenom": "Jean",
"rid": "1234567",
"email": "[email protected]",
"numeroTelephonePortable": "852950",
"adresse": {
"rue": "123 Rue de la Paix",
"complementAdresse": "Appartement 4B",
"batiment": "Résidence Les Fleurs",
"codePostal": "98800",
"ville": "NOUMEA",
"pays": "FRANCE"
}
},
"demandeCredit": {
"description": "Achat véhicule",
"montantDemande": 25000,
"montantEcheanceSouhaite": 500,
"dureeRemboursementMois": 60
}
}

Validation des données

Champs obligatoires :

  • prospect.nom (max 100 caractères)
  • prospect.prenom (max 100 caractères)
  • prospect.email (format email valide, max 255 caractères)
  • prospect.numeroTelephonePortable (format téléphone valide, max 20 caractères)
  • prospect.adresse.rue (max 255 caractères)
  • prospect.adresse.codePostal (exactement 5 caractères)
  • prospect.adresse.ville (max 100 caractères)
  • prospect.adresse.pays (max 100 caractères)
  • demandeCredit.description (max 1000 caractères)
  • demandeCredit.montantDemande (> 0)
  • demandeCredit.montantEcheanceSouhaite (> 0)
  • demandeCredit.dureeRemboursementMois (entre 1 et 600)

Champs optionnels :

  • prospect.rid (exactement 7 caractères si fourni)
  • prospect.adresse.complementAdresse (max 255 caractères)
  • prospect.adresse.batiment (max 100 caractères)

Réponses

Succès (200 OK)

{
"success": true,
"code": 200,
"message": "Prospect et demande de crédit créés avec succès.",
"prospectSalesforceId": "0031234567890ABC",
"opportuniteSalesforceId": "0061234567890DEF",
"taskSalesforceId": "00T1234567890GHI"
}

Prospect existant (409 Conflict)

{
"success": false,
"code": 409,
"message": "Un prospect correspondant existe déjà dans notre système.",
"prospectSalesforceId": "0031234567890ABC"
}

Erreur de validation (400 Bad Request)

{
"success": false,
"code": 400,
"message": "Données de requête invalides. Veuillez vérifier tous les champs requis."
}

Erreur Salesforce (502 Bad Gateway)

{
"success": false,
"code": 502,
"message": "Erreur lors de la communication avec Salesforce. Veuillez réessayer plus tard."
}

Erreur interne (500 Internal Server Error)

{
"success": false,
"code": 500,
"message": "Une erreur interne s'est produite. Veuillez contacter le support technique."
}

Comportement fonctionnel

  1. Vérification d'existence : L'API vérifie si un prospect correspondant existe déjà en utilisant :

    • Combinaison nom + prénom dans la base de données locale
    • Email dans la base de données locale
    • Combinaison nom + prénom dans Salesforce
    • Email dans Salesforce
  2. Création en cascade : Si aucun prospect n'existe :

    • Création du prospect dans Salesforce avec le RecordType "Prospect Personne Physique"
    • Création de l'opportunité liée au prospect
    • Création d'une tâche de contrôle pour suivi
  3. Mapping d'adresse : Le système tente de mapper automatiquement la ville et le code postal vers un département Salesforce existant.

2. Santé de l'API

Point de terminaison pour vérifier l'état de santé de l'API.

Endpoint

GET /api/external/health

Authentification

Aucune authentification requise.

Réponse (200 OK)

{
"status": "healthy",
"timestamp": "2024-01-15T16:20:30.123Z",
"version": "1.0.0",
"service": "External Prospect Credit API"
}

Codes de réponse HTTP

CodeSignificationDescription
200OKRequête traitée avec succès
400Bad RequestErreur de validation des données
401UnauthorizedClé API invalide ou manquante
409ConflictProspect existant trouvé
429Too Many RequestsLimite de taux dépassée
500Internal Server ErrorErreur interne du serveur
502Bad GatewayErreur de communication avec Salesforce

Gestion des erreurs

Stratégie de retry

En cas d'erreur temporaire (codes 5xx), il est recommandé d'implémenter une stratégie de retry avec backoff exponentiel :

async function createProspectWithRetry(data, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch('/api/external/prospect-credit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'votre-clé-api'
},
body: JSON.stringify(data)
});

if (response.ok || response.status < 500) {
return await response.json();
}

// Attendre avant le prochain essai
await new Promise(resolve =>
setTimeout(resolve, Math.pow(2, i) * 1000)
);
} catch (error) {
if (i === maxRetries - 1) throw error;
}
}
}

Logging et traçabilité

Toutes les opérations sont tracées avec les informations suivantes :

  • Identifiant du client (clé API)
  • Horodatage de la requête
  • Données de la requête (sans informations sensibles)
  • Résultat de l'opération
  • Identifiants Salesforce générés

Exemples d'intégration

JavaScript/TypeScript

interface ProspectCreditRequest {
prospect: {
nom: string;
prenom: string;
rid?: string;
email: string;
numeroTelephonePortable: string;
adresse: {
rue: string;
complementAdresse?: string;
batiment?: string;
codePostal: string;
ville: string;
pays: string;
};
};
demandeCredit: {
description: string;
montantDemande: number;
montantEcheanceSouhaite: number;
dureeRemboursementMois: number;
};
}

class CamApiClient {
constructor(private apiKey: string, private baseUrl: string) {}

async createProspectCredit(data: ProspectCreditRequest) {
const response = await fetch(`${this.baseUrl}/api/external/prospect-credit`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': this.apiKey
},
body: JSON.stringify(data)
});

return await response.json();
}

async getStatus(numeroReference: string) {
const response = await fetch(
`${this.baseUrl}/api/external/prospect-credit/${numeroReference}/status`,
{
headers: { 'X-API-Key': this.apiKey }
}
);

return await response.json();
}
}

cURL

# Création d'un prospect
curl -X POST "https://api.cam.nc/api/external/prospect-credit" \
-H "Content-Type: application/json" \
-H "X-API-Key: sk_test_1234567890abcdef_site_internet" \
-d '{
"prospect": {
"nom": "Dupont",
"prenom": "Jean",
"email": "[email protected]",
"numeroTelephonePortable": "+33612345678",
"adresse": {
"rue": "123 Rue de la Paix",
"codePostal": "98800",
"ville": "Nouméa",
"pays": "Nouvelle-Calédonie"
}
},
"demandeCredit": {
"description": "Achat véhicule",
"montantDemande": 25000,
"montantEcheanceSouhaite": 500,
"dureeRemboursementMois": 60
}
}'

# Vérification de santé
curl -X GET "https://api.cam.nc/api/external/health"

Sécurité

Bonnes pratiques

  1. Protection de la clé API :

    • Ne jamais exposer la clé API côté client
    • Stocker la clé dans des variables d'environnement
    • Utiliser HTTPS uniquement
  2. Validation côté client :

    • Valider les données avant envoi
    • Implémenter des contrôles de format
    • Gérer les erreurs de manière appropriée
  3. Gestion des timeouts :

    • Définir des timeouts appropriés (30-60 secondes)
    • Implémenter des indicateurs de chargement
    • Informer l'utilisateur en cas de délai

Conformité

  • RGPD : Les données personnelles sont traitées conformément au RGPD
  • Traçabilité bancaire : Toutes les opérations sont auditées
  • Chiffrement : Communications HTTPS obligatoires

Support et monitoring

Logs applicatifs

L'API génère des logs détaillés pour :

  • Authentification et autorisation
  • Validation des données
  • Interactions avec Salesforce
  • Erreurs et exceptions

Métriques disponibles

  • Nombre d'appels par clé API
  • Taux de succès/échec
  • Latence des réponses
  • Utilisation de la limitation de taux

Contact support

Pour toute question technique ou problème d'intégration :

  • Email : [email protected]
  • Documentation : [URL de la documentation]
  • Statut du service : [URL du tableau de bord]

Version du document : 1.0
Dernière mise à jour : Janvier 2025
API Version : v1.0