Aller au contenu

Customers

Les objets Customer vous permettent de créer un profil client persistant auquel vous pouvez associer des transactions, des méthodes de paiement, des abonnements et des factures.

Utiliser des Customers vous donne une vue consolidée de l’activité de chaque client dans votre dashboard, et permet d’envoyer automatiquement des reçus sans devoir préciser l’email à chaque paiement.

Customer vs. paiement anonyme

Vous pouvez créer des PaymentIntents sans Customer (paiements anonymes), mais associer un Customer enrichit vos données : historique complet, méthodes de paiement sauvegardées, reçus automatiques, et détection de fraude améliorée.

Endpoints

MéthodeEndpointDescription
POST/customers/Créer un nouveau Customer
GET/customers/Lister les Customers (paginé, filtrable)
GET/customers/{id}/Récupérer un Customer par son ID
PATCH/customers/{id}/Mettre à jour les données d'un Customer
DELETE/customers/{id}/Supprimer définitivement un Customer
GET/customers/{id}/transactions/Lister les transactions du Customer
GET/customers/{id}/payment-methods/Lister les méthodes de paiement du Customer

Schéma de l’objet

ResponseObjet Customer
Structure complète retournée par tous les endpoints de cette ressource.
json
{
  "id": "cust_3Nx8mLKZ2eZvKYlo",
  "object": "customer",
  "app": "app_xxxxxxxx",
  "email": "client@email.com",
  "firstname": "Madeleine",
  "lastname": "Nguema",
  "phone": "+24177654321",
  "address": null,
  "status": "active",
  "is_blacklisted": false,
  "transactions_count": 14,
  "total_spent": 245000,
  "currency": "XAF",
  "metadata": {
    "internal_id": "USER-00123"
  },
  "created_at": "2026-01-15T08:30:00Z",
  "updated_at": "2026-03-01T10:00:00Z"
}

Créer un Customer

Crée un nouveau profil client associé à votre App. L’email est l’identifiant unique du Customer — deux clients de la même App ne peuvent pas avoir le même email.

POSTCorps de la requête
emailRequis
stringemailex :client@email.com

Adresse email unique du Customer au sein de votre App. Utilisée pour l’envoi automatique des reçus et comme clé de déduplication.

Si vous tentez de créer un Customer avec un email déjà existant pour la même App, l’API retourne une erreur 409 Conflict — elle ne crée pas de doublon. Utilisez PATCH pour mettre à jour un Customer existant.

nameRequis
stringex :Madeleine Nguema

Nom complet du Customer. Le backend décompose automatiquement ce champ en firstname et lastname (split sur le premier espace). L’objet retourné expose les deux champs séparés.

Pour les noms composés (ex. “Jean-Claude” ou “Madeleine Nguema Obame”), le split se fait sur le premier espace. “Jean-Claude Ondo” → firstname: Jean-Claude, lastname: Ondo.

phoneOptionnel
stringE.164ex :+24177654321

Numéro de téléphone au format international E.164. Obligatoire pour les paiements par Mobile Money associés à ce Customer.

En savoir plus

Le format E.164 commence par + suivi du code pays et du numéro local sans espaces ni tirets. Exemples valides : +24177000001 (Gabon), +237612345678 (Cameroun). Les formats locaux (ex. 077 000 001) sont rejetés.

metadataOptionnel
object

Dictionnaire clé/valeur pour stocker vos propres identifiants — ID utilisateur de votre base, numéro de contrat, segment client, etc.

En savoir plus

Les métadonnées sont retournées dans tous les webhooks liés à ce Customer. Max 50 clés, 500 caractères par valeur. Non indexées — non utilisables comme critère de recherche via l’API.

Créer un Customer

bash
curl -X POST https://api.sangho.ga/v1/customers/ \
  -H "Authorization: Bearer sk_prod_xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "client@email.com",
    "name": "Madeleine Nguema",
    "phone": "+24177654321",
    "metadata": { "internal_id": "USER-00123" }
  }'
Response201 Created
Le Customer est créé. Les champs firstname et lastname sont dérivés automatiquement du champ name fourni.
json
{
  "id": "cust_3Nx8mLKZ2eZvKYlo",
  "object": "customer",
  "app": "app_xxxxxxxx",
  "email": "client@email.com",
  "firstname": "Madeleine",
  "lastname": "Nguema",
  "phone": "+24177654321",
  "address": null,
  "status": "active",
  "is_blacklisted": false,
  "transactions_count": 0,
  "total_spent": 0,
  "metadata": { "internal_id": "USER-00123" },
  "created_at": "2026-03-01T10:00:00Z",
  "updated_at": "2026-03-01T10:00:00Z"
}
Response409 Conflict — Email déjà utilisé
Un Customer avec cet email existe déjà pour cette App. Utilisez GET /customers/?search={email} pour le retrouver, puis PATCH pour le mettre à jour.
Sangho ne crée jamais de doublon. Le conflit est retourné proprement pour vous permettre de gérer la déduplication côté serveur.
json
{
  "error": {
    "type": "conflict_error",
    "code": "customer_email_exists",
    "message": "Un Customer avec cet email existe déjà.",
    "param": "email"
  }
}

Lister les Customers

GETParamètres de requête (query)
statusOptionnel
string

Filtrer par statut. Valeurs : active, inactive, blocked.

orderingOptionnel
stringdéfaut :-created_at

Tri des résultats. Champs disponibles : created_at, email, total_spent.

pageOptionnel
integerdéfaut :1

Numéro de page (pagination offset, commence à 1).

page_sizeOptionnel
integerdéfaut :20

Résultats par page. Minimum : 1. Maximum : 100.

Mettre à jour un Customer

Modifie un ou plusieurs champs d’un Customer existant. Tous les champs sont optionnels — seuls les champs fournis sont mis à jour.

PATCHCorps de la mise à jour (PATCH)
emailOptionnel
stringemail

Nouvel email. Doit être unique parmi les Customers de l’App. Retourne 409 si déjà utilisé.

nameOptionnel
string

Nouveau nom complet. Redécomposé en firstname / lastname côté backend.

phoneOptionnel
stringE.164

Nouveau numéro de téléphone au format E.164. Passez null pour supprimer.

metadataOptionnel
object

Fusion des métadonnées. Les clés existantes non mentionnées sont conservées. Passez une clé avec valeur null pour la supprimer.

En savoir plus

Exemple : si le Customer a { "a": "1", "b": "2" } et vous envoyez { "b": null, "c": "3" }, le résultat sera { "a": "1", "c": "3" }.

Supprimer un Customer

Supprime définitivement un Customer (hard delete). L’action est irréversible.

Suppression définitive

La suppression d’un Customer est permanente. Ses transactions passées sont conservées dans les logs pour des raisons de conformité légale OHADA, mais le profil client lui-même est détruit. Les PaymentIntents en cours associés à ce Customer restent valides mais perdent la référence Customer.

Rechercher des Customers

bash
curl "https://api.sangho.ga/v1/customers/?search=madeleine&status=active" \
  -H "Authorization: Bearer sk_prod_xxxx"

Mettre à jour un Customer

bash
curl -X PATCH https://api.sangho.ga/v1/customers/cust_xxx/ \
  -H "Authorization: Bearer sk_prod_xxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+24166000001",
    "metadata": { "plan": "premium", "legacy_id": null }
  }'
Response200 OK — Customer mis à jour
Retourne l'objet Customer complet avec les champs modifiés. Les métadonnées reflètent le merge appliqué.
json
{
  "id": "cust_3Nx8mLKZ2eZvKYlo",
  "object": "customer",
  "email": "client@email.com",
  "firstname": "Madeleine",
  "lastname": "Nguema",
  "phone": "+24166000001",
  "status": "active",
  "metadata": {
    "internal_id": "USER-00123",
    "plan": "premium"
  },
  "updated_at": "2026-03-15T14:00:00Z"
}

Supprimer un Customer

bash
curl -X DELETE https://api.sangho.ga/v1/customers/cust_xxx/ \
  -H "Authorization: Bearer sk_prod_xxxx"
Response204 No Content — Supprimé
La suppression a réussi. Aucun corps de réponse n'est retourné.