> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pulse-sell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Licences

> Valider une clé, gérer les activations par appareil, révoquer.

Quand vous vendez un logiciel, un plugin ou un accès, chaque achat émet une **clé de licence**. L'API vous permet de la valider depuis votre propre serveur, de gérer les appareils activés et de la révoquer.

> [!NOTE]
>
> Permissions : `licenses.read` pour lire et valider, `licenses.write` pour activer, désactiver et révoquer. Référence : [Licences](https://docs.pulse-sell.com/api-reference/licences).

## Valider une clé

`POST /licenses/validate` est l'appel à faire quand votre utilisateur saisit sa clé. Il **ne modifie rien** et ne demande que `licenses.read`.

```bash theme={null}
curl -X POST https://api.pulse-sell.com/v1/licenses/validate \
  -H "Authorization: Bearer $PULSESELL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "key": "ABCD-1234-EFGH-5678", "device_id": "machine-42" }'
```

```json theme={null}
{
  "data": {
    "valid": true,
    "reason": null,
    "status": "active",
    "license_id": "cm1lic001",
    "product_id": "cm1prod002",
    "expires_at": "2027-10-29T00:00:00.000Z",
    "activations": { "used": 1, "max": 3, "remaining": 2 },
    "device_activated": true
  }
}
```

La réponse est **toujours `200`** : une clé inconnue n'est pas une erreur, c'est un résultat de validation. Lisez `valid` et `reason` :

| `reason` | Sens |
| - | - |
| `null` | La licence est valide. |
| `not_found` | Clé inconnue, ou appartenant à une autre boutique (indistinguable, volontairement). |
| `revoked` | La licence a été révoquée (remboursement, fraude…). |
| `expired` | La date d'expiration est passée. |
| `inactive` | La licence a été désactivée. |

`device_activated` n'apparaît que si vous avez envoyé `device_id` : il indique si **cet** appareil est déjà activé, pour savoir s'il faut appeler l'activation.

## Activer sur un appareil

Si votre produit limite le nombre d'appareils, activez la licence au premier lancement. Vous pouvez utiliser l'identifiant de la licence **ou la clé elle-même** dans l'adresse.

```bash theme={null}
curl -X POST https://api.pulse-sell.com/v1/licenses/ABCD-1234-EFGH-5678/activate \
  -H "Authorization: Bearer $PULSESELL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "device_id": "machine-42", "device_name": "MacBook de Awa" }'
```

* Activer deux fois le même appareil est sans danger : l'activation existante est réutilisée.
* Quand `max_activations` est atteint, l'API répond `409` : proposez à l'utilisateur de désactiver un ancien appareil.
* `POST /licenses/{id}/deactivate` libère un appareil (changement d'ordinateur).
* `GET /licenses/{id}/activations` liste les appareils.

## Révoquer

```bash theme={null}
curl -X POST https://api.pulse-sell.com/v1/licenses/cm1lic001/revoke \
  -H "Authorization: Bearer $PULSESELL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Fraude" }'
```

Une licence révoquée est refusée immédiatement par la validation. Un remboursement révoque aussi automatiquement les licences de la commande.

## Lister et filtrer

`GET /licenses` accepte `product_id`, `status` (`active`, `inactive`, `expired`, `revoked`, `used`) et `customer_email`.

## Recevoir les événements

Cinq événements Pulses couvrent tout le cycle : `license.issued`, `license.activated`, `license.expiring` (7 jours avant), `license.expired` et `license.revoked`. Voir [Événements](https://docs.pulse-sell.com/pulses/events.md).

> [!TIP]
>
> Un exemple complet, avec mise en cache et réaction aux pannes réseau, est détaillé dans [Intégrer des licences dans votre logiciel](https://docs.pulse-sell.com/use-cases/saas-license.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.