> ## 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

> Validez des clés, gérez les activations et les révocations.

Permissions : `licenses.read`, `licenses.write` (inclut la lecture). Guide : [Licences](https://docs.pulse-sell.com/guides/licenses.md). Partout où `{id}` apparaît, vous pouvez mettre **l'identifiant de la licence ou la clé elle-même**.

## Valider une clé

`POST /licenses/validate` — `licenses.read`

Ne modifie rien et répond **toujours `200`** : lisez `valid` et `reason`.

| Champ | Requis | Description |
| - | - | - |
| `key` | oui | La clé saisie par l'utilisateur. |
| `device_id` | non | Si fourni, la réponse indique `device_activated`. |

```bash cURL 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 Réponse theme={null}
{
  "data": {
    "valid": false,
    "reason": "expired",
    "status": "active",
    "license_id": "cm1lic001",
    "product_id": "cm1prod002",
    "expires_at": "2026-09-30T00:00:00.000Z",
    "activations": { "used": 1, "max": 3, "remaining": 2 },
    "device_activated": true
  }
}
```

`reason` vaut `null` (valide), `not_found`, `revoked`, `expired` ou `inactive`.

## Lister les licences

`GET /licenses` — `licenses.read`

| Paramètre | Description |
| - | - |
| `per_page`, `cursor` | [Pagination](https://docs.pulse-sell.com/concepts/pagination.md). |
| `product_id` | Filtrer par produit. |
| `status` | `active`, `inactive`, `expired`, `revoked`, `used`. |
| `customer_email` | E-mail exact de l'acheteur. |

## Obtenir une licence

`GET /licenses/{id}` — `licenses.read`

Inclut la liste des activations.

```json Réponse theme={null}
{
  "data": {
    "id": "cm1lic001", "key": "ABCD-1234-EFGH-5678", "product_id": "cm1prod002", "status": "active",
    "max_activations": 3, "activations_count": 1, "expires_at": "2027-10-29T00:00:00.000Z",
    "customer_email": "awa@example.com", "order_id": "cm1sale001", "assigned_at": "2026-10-29T16:17:10.000Z",
    "activations": [ { "id": "cm1act001", "device_id": "machine-42", "device_name": "MacBook de Awa", "is_active": true, "activated_at": "2026-10-29T16:20:00.000Z" } ]
  }
}
```

## Lister les activations

`GET /licenses/{id}/activations` — `licenses.read`

## Activer sur un appareil

`POST /licenses/{id}/activate` — `licenses.write`

| Champ | Requis | Description |
| - | - | - |
| `device_id` | oui | Identifiant stable de l'appareil (200 caractères). |
| `device_name` | non | Nom lisible. |

Activer deux fois le même appareil est sans effet. `409` quand le nombre maximal d'activations est atteint ; `403`/`422` si la licence est révoquée ou expirée.

```bash cURL 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"}'
```

## Désactiver un appareil

`POST /licenses/{id}/deactivate` — `licenses.write`

Corps : `device_id` (requis). Libère la place pour un autre appareil.

## Révoquer

`POST /licenses/{id}/revoke` — `licenses.write`

Corps : `reason` (optionnel, 300 caractères). La licence est refusée immédiatement.

```bash cURL 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"}'
```


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