> ## Documentation Index
> Fetch the complete documentation index at: https://chariow.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Affiliés

> Apprenez à gérer votre programme d'affiliation via l'API Chariow

Chariow fournit un système complet de gestion d'affiliation qui vous permet de développer vos ventes grâce aux partenariats. Les affiliés peuvent promouvoir vos produits en utilisant des codes de parrainage uniques et gagner des commissions sur les ventes réussies.

## Objet Affilié

Un affilié contient des informations sur son compte, ses métriques de performance et les détails imbriqués de son compte :

```json theme={null}
{
  "id": "saff_xyz789abc",
  "status": "active",
  "source": {
    "value": "invitation",
    "label": "Invitation",
    "description": "A rejoint via une invitation de la boutique"
  },
  "total_visits": 156,
  "total_sales": 32,
  "total_earnings": {
    "value": 1250,
    "formatted": "$1,250.00",
    "short": "1.25K",
    "currency": "USD"
  },
  "first_visit_at": "2025-01-16T08:00:00+00:00",
  "last_visit_at": "2025-02-01T14:22:00+00:00",
  "suspended_at": null,
  "suspended_reason": null,
  "account": {
    "id": "aff_abc123def",
    "pseudo": "creative_studio",
    "country": {
      "code": "US",
      "name": "United States"
    },
    "status": "active",
    "user": {
      "id": "usr_def456",
      "name": "John Doe",
      "email": "john@example.com",
      "first_name": "John",
      "last_name": "Doe"
    },
    "created_at": "2025-01-15T09:00:00+00:00"
  },
  "store": {
    "id": "str_xyz789",
    "name": "Ma Boutique Numérique"
  },
  "created_at": "2025-01-15T10:00:00+00:00",
  "updated_at": "2025-02-01T14:22:00+00:00"
}
```

### Champs Clés

* **`id`** : ID public de l'affilié de la boutique (préfixé par `saff_`)
* **`status`** : Statut actuel (`active` ou `suspended`)
* **`source`** : Comment l'affilié a rejoint (par exemple, `invitation`, `network`)
* **`total_visits`** : Nombre de visites via le lien de parrainage
* **`total_sales`** : Nombre de ventes complétées à partir des recommandations
* **`total_earnings`** : Commission totale gagnée avec montant formaté
* **`account`** : Détails imbriqués du compte affilié incluant les informations utilisateur
* **`account.user`** : Profil utilisateur de l'affilié (nom, email, etc.)
* **`account.pseudo`** : Nom d'affichage utilisé par l'affilié
* **`account.country`** : Pays de l'affilié avec code et nom
* **`suspended_at`** : Horodatage de la suspension (null si actif)
* **`suspended_reason`** : Raison de la suspension (null si actif)

## Statuts des Affiliés

| Statut      | Description                                        |
| ----------- | -------------------------------------------------- |
| `active`    | L'affilié est actif et peut gagner des commissions |
| `suspended` | Le compte affilié a été suspendu                   |

## Obtenir un Affilié

Récupérez un affilié spécifique en utilisant son code de parrainage unique :

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.chariow.com/v1/affiliates/CREATOR123" \
    -H "Authorization: Bearer sk_live_your_api_key"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.chariow.com/v1/affiliates/CREATOR123', {
    headers: {
      'Authorization': 'Bearer sk_live_your_api_key'
    }
  });

  const { data } = await response.json();
  ```
</CodeGroup>

Ceci est utile pour :

* Valider un code affilié avant d'appliquer des commissions
* Afficher les informations de l'affilié sur votre site web
* Construire des tableaux de bord pour les affiliés

## Envoyer des Invitations d'Affiliation

Invitez des affiliés potentiels à rejoindre votre programme en envoyant des emails d'invitation :

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.chariow.com/v1/affiliates/invitations" \
    -H "Authorization: Bearer sk_live_your_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "emails": ["jean@example.com", "marie@example.com", "partenaire@entreprise.com"]
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.chariow.com/v1/affiliates/invitations', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sk_live_your_api_key',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      emails: ['jean@example.com', 'marie@example.com', 'partenaire@entreprise.com']
    })
  });

  const { data } = await response.json();
  ```
</CodeGroup>

### Invitations par Lot

Vous pouvez envoyer jusqu'à 25 invitations en une seule requête. L'API va :

* Créer et envoyer des invitations pour les nouveaux emails valides
* Ignorer les emails qui sont déjà des affiliés enregistrés
* Ignorer les emails qui ont des invitations en attente

### Réponse

```json theme={null}
{
  "message": "2 invitations envoyées avec succès",
  "data": [
    {
      "id": "affinv_abc123xyz",
      "email": "jean@example.com",
      "status": "pending",
      "expires_at": "2026-02-10T10:30:00+00:00",
      "invited_by": {
        "id": "tm_abc123",
        "name": "Propriétaire de la Boutique"
      },
      "accepted_at": null,
      "created_at": "2026-01-11T10:30:00+00:00"
    },
    {
      "id": "affinv_def456uvw",
      "email": "marie@example.com",
      "status": "pending",
      "expires_at": "2026-02-10T10:30:00+00:00",
      "invited_by": {
        "id": "tm_abc123",
        "name": "Propriétaire de la Boutique"
      },
      "accepted_at": null,
      "created_at": "2026-01-11T10:30:00+00:00"
    }
  ],
  "errors": []
}
```

## Objet Invitation

Une invitation contient des informations sur son statut, qui l'a envoyée et son expiration :

```json theme={null}
{
  "id": "affinv_abc123xyz",
  "email": "jean@example.com",
  "status": "pending",
  "expires_at": "2026-02-10T10:30:00+00:00",
  "invited_by": {
    "id": "tm_abc123",
    "name": "Propriétaire de la Boutique"
  },
  "accepted_at": null,
  "created_at": "2026-01-11T10:30:00+00:00"
}
```

### Statuts des Invitations

| Statut      | Description                                 |
| ----------- | ------------------------------------------- |
| `pending`   | Invitation envoyée mais pas encore acceptée |
| `accepted`  | L'invitation a été acceptée                 |
| `expired`   | L'invitation a dépassé sa date d'expiration |
| `cancelled` | L'invitation a été annulée                  |

## Événements Webhook

Lorsqu'un affilié rejoint votre boutique (accepte une invitation), un événement webhook est déclenché via les [Pulses](/fr/guides/pulses).

### affiliate.joined

Déclenché lorsqu'un nouvel affilié rejoint votre boutique.

```json theme={null}
{
  "event": "affiliate.joined",
  "affiliate": {
    "id": "saff_xyz789abc",
    "account": {
      "id": "aff_abc123def",
      "code": "CREATOR123",
      "pseudo": "studio_creatif",
      "email": "creator@example.com",
      "first_name": "Jean",
      "last_name": "Dupont",
      "name": "Jean Dupont",
      "country": {
        "code": "FR",
        "name": "France"
      },
      "phone": {
        "country_code": "FR",
        "formatted": "+33 6 12 34 56 78"
      }
    },
    "source": "invitation",
    "status": "active",
    "joined_at": "2025-01-15T10:40:00+00:00"
  },
  "store": {
    "id": "str_xyz789",
    "name": "Ma Boutique Digitale",
    "url": "https://maboutique.mychariow.com"
  }
}
```

Configurez les Pulses dans votre tableau de bord Chariow (**Automatisation** → **Pulses**) pour recevoir ces événements.

## Exemple d'Implémentation

Voici un exemple complet de gestion des affiliés dans votre application :

```javascript theme={null}
class AffiliateManager {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = 'https://api.chariow.com/v1';
  }

  async getAffiliate(code) {
    const response = await fetch(
      `${this.baseUrl}/affiliates/${code}`,
      { headers: { 'Authorization': `Bearer ${this.apiKey}` }}
    );

    if (!response.ok) {
      throw new Error('Affilié non trouvé');
    }

    const { data } = await response.json();
    return data;
  }

  async sendInvitations(emails) {
    const response = await fetch(
      `${this.baseUrl}/affiliates/invitations`,
      {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${this.apiKey}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ emails })
      }
    );

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message);
    }

    return response.json();
  }

  async validateAffiliateCode(code) {
    try {
      const affiliate = await this.getAffiliate(code);
      return {
        valid: affiliate.status === 'active',
        affiliate
      };
    } catch (error) {
      return { valid: false, error: error.message };
    }
  }
}

// Utilisation
const manager = new AffiliateManager('sk_live_your_api_key');

// Valider un code affilié au moment du paiement
const { valid, affiliate } = await manager.validateAffiliateCode('CREATOR123');
if (valid) {
  console.log(`L'affilié ${affiliate.account.user.name} est actif`);
  console.log(`Gains totaux : ${affiliate.total_earnings.formatted}`);
}

// Envoyer des invitations aux affiliés potentiels
const result = await manager.sendInvitations([
  'partenaire1@example.com',
  'partenaire2@example.com'
]);
console.log(`${result.data.length} invitations envoyées`);
```

## Résumé des Endpoints API

| Endpoint                         | Méthode | Description                               |
| -------------------------------- | ------- | ----------------------------------------- |
| `/v1/affiliates/{affiliateCode}` | GET     | Obtenir les détails d'un affilié par code |
| `/v1/affiliates/invitations`     | POST    | Envoyer des invitations d'affiliation     |

## Bonnes Pratiques

### Validation du Code Affilié

* Validez toujours les codes affiliés avant d'appliquer des commissions
* Vérifiez que le statut de l'affilié est `active`
* Mettez en cache les données des affiliés pour réduire les appels API

### Gestion des Invitations

* Utilisez les invitations par lot pour plus d'efficacité (jusqu'à 25 emails)
* Gérez les emails ignorés avec élégance
* Implémentez une logique de nouvelle tentative pour les invitations échouées

### Intégration Webhook

* Configurez les webhooks pour recevoir les événements `affiliate.joined`
* Utilisez les webhooks pour déclencher des workflows d'intégration
* Stockez les données des affiliés lorsqu'ils rejoignent pour des recherches plus rapides

### Suivi des Commissions

* Suivez avec précision les recommandations des affiliés
* Fournissez aux affiliés des statistiques en temps réel
* Implémentez des fenêtres d'attribution appropriées

## Ressources Connexes

<CardGroup cols={2}>
  <Card title="Guide des Pulses" icon="bolt" href="/fr/guides/pulses">
    Configurer les webhooks pour les événements affiliés
  </Card>

  <Card title="API Obtenir Affilié" icon="code" href="/api-reference/affiliates/get-affiliate">
    Voir la référence API Obtenir Affilié
  </Card>

  <Card title="API Envoyer Invitations" icon="envelope" href="/api-reference/affiliates/send-invitations">
    Voir la référence API Envoyer Invitations
  </Card>

  <Card title="Guide des Ventes" icon="receipt" href="/fr/guides/sales">
    Suivre les ventes des affiliés
  </Card>
</CardGroup>
