## Vue d'ensemble
Les clients revendeurs sont les utilisateurs finaux de votre plateforme. En mode **live**, KennHosting crée un compte utilisateur (`is_reseller_client=true`) — ce compte ne peut pas se connecter directement sur kennhosting.com. En mode **sandbox**, aucun compte réel n'est créé (`user_id=null`).
**Scope requis :** `reseller:clients`
## Créer un client
```http
POST /api/v1/reseller/clients
```
**Corps de la requête :**
| Champ | Type | Requis | Description |
|-------|------|--------|-------------|
| `name` | string | Oui | Nom complet du client |
| `email` | string | Oui | Email unique |
| `password` | string | Non | Mot de passe (auto-généré si absent) |
| `external_ref` | string | Non | Référence dans votre système |
```bash
curl -X POST "https://kennhosting.com/api/v1/reseller/clients" \
-H "Authorization: Bearer kh_live_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Jean Dupont",
"email": "jean@exemple.cm",
"external_ref": "client-001"
}'
```
**Réponse (201) :**
```json
{
"success": true,
"data": {
"id": 1,
"name": "Jean Dupont",
"email": "jean@exemple.cm",
"external_ref": "client-001",
"sandbox": false,
"user_id": 42
}
}
```
En mode sandbox (`kh_test_`), `"sandbox": true` et `"user_id": null`. Aucun compte KennHosting n'est créé.
**Erreurs possibles :**
```json
// Email déjà utilisé pour un de vos clients
{"code": "duplicate_email", "message": "Un client avec cet email existe déjà."}
// Email déjà utilisé sur KennHosting (live uniquement)
{"code": "email_taken", "message": "Cet email est déjà utilisé sur KennHosting."}
```
## Lister les clients
```http
GET /api/v1/reseller/clients
```
Retourne uniquement les clients correspondant au mode du token (live ou sandbox).
**Paramètres optionnels :**
| Paramètre | Description |
|-----------|-------------|
| `page` | Numéro de page (défaut : 1) |
| `per_page` | Éléments par page (défaut : 50) |
**Réponse :**
```json
{
"success": true,
"data": [
{
"id": 1,
"reseller_profile_id": 1,
"user_id": 42,
"name": "Jean Dupont",
"email": "jean@exemple.cm",
"external_ref": "client-001",
"sandbox": false,
"created_at": "2026-01-15T10:00:00.000000Z",
"user": {
"id": 42,
"name": "Jean Dupont",
"email": "jean@exemple.cm"
}
}
],
"meta": {
"pagination": {
"total": 1,
"per_page": 50,
"current_page": 1,
"last_page": 1
}
}
}
```
## Détail d'un client
```http
GET /api/v1/reseller/clients/{id}
```
Inclut la liste des services actifs du client.
```json
{
"success": true,
"data": {
"id": 1,
"name": "Jean Dupont",
"email": "jean@exemple.cm",
"user": { "id": 42, "name": "Jean Dupont", "email": "jean@exemple.cm", "created_at": "..." },
"services": [
{ "id": 5, "uuid": "...", "domain": "jean.cm", "status": "active" }
]
}
}
```
## Modifier un client
```http
PUT /api/v1/reseller/clients/{id}
```
| Champ | Type | Description |
|-------|------|-------------|
| `name` | string | Nouveau nom (synchronisé avec le compte KH en live) |
| `external_ref` | string | Nouvelle référence externe |
```json
{
"name": "Jean D. Modifié",
"external_ref": "client-001-v2"
}
```
## Supprimer un client
```http
DELETE /api/v1/reseller/clients/{id}
```
La suppression est bloquée si le client possède des services actifs ou des commandes en cours (`has_services`). Supprimez d'abord tous ses services.
**Réponse (200) :**
```json
{
"success": true,
"data": { "deleted": true }
}
```