# Modifications des prix

> Changements de prix de liste et aperçu d'un changement, y compris ce que le client paiera avant et après.

Les modifications en masse, la planification et les courriels de changement de prix client nécessitent le plan Pro. Le plan Gratuit peut publier immédiatement des importations de feuilles de calcul à prix standard sans courriel. Les prix convenus existants et les changements planifiés publiés continuent à s'appliquer lorsque le Pro prend fin.

Les prix de liste ne changent jamais silencieusement dans TradeCatalog. Les nouveaux prix sont placés dans un **changement de prix** pour une seule liste de prix : un brouillon que le personnel examine, date et publie. Les clients ne reçoivent un courriel uniquement lorsqu'ils ont un changement de prix personnel. Le plan Standard est la liste lorsque vous ne nommez pas une autre liste. Un brouillon ne mélange jamais les listes.

## Comment sont effectués les changements de prix

- **À partir de l'API :** [`PUT /products`](/docs/api/products#create-or-update-products) avec un nouveau `listPrice` pour un produit existant l'ajoute à un brouillon et retourne l'`priceChangeId` de ce brouillon.
- **À partir de l'application :** importations de feuilles de calcul, et changements en masse comme « +4 % sur la catégorie des boulons ».

La publication, la planification et l'annulation se font dans l'application, sous **Changements de prix**. Il n’existe pas d’API pour cela : une personne vérifie toujours un changement de prix avant que les clients ne le voient.

## Statuts

| Statut      | Signification                                                |
| ----------- | ------------------------------------------------------------ |
| `draft`     | Non publié. Aucun prix n’a changé.                           |
| `scheduled` | Publié avec une date future. Les prix changent à cette date. |
| `live`      | En vigueur.                                                  |
| `cancelled` | Annulé avant qu’il n’entre en vigueur.                       |

## L'objet de changement de prix

```json
{
  "id": "c4d5e6f7-1234-4abc-9def-0123456789ab",
  "source": "import",
  "title": "API import (Sage stock sync)",
  "supplierNote": null,
  "status": "draft",
  "effectiveAt": null,
  "notifyCustomers": true,
  "raiseFixedPrices": false,
  "priceListId": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
  "priceListName": "Standard",
  "createdBy": "Fq3L0cZ7tN1pW9aYx2Rk",
  "publishedAt": null,
  "cancelledAt": null,
  "createdAt": "2026-09-27T02:00:14.000Z",
  "items": 38
}
```

| Champ              | Type           | Description                                                                                                                                         |
| ------------------ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `source`           | chaîne         | `import` (feuille de calcul ou API) ou `bulk` (une variation en pourcentage effectuée dans l'application).                                          |
| `title`            | chaîne         | Affiché au personnel. Les brouillons API sont intitulés « Importation API (nom de la clé) ».                                                        |
| `supplierNote`     | chaîne ou null | Message aux clients dans le courriel de changement de prix.                                                                                         |
| `status`           | chaîne         | Voir [statuts](#statuses).                                                                                                                          |
| `effectiveAt`      | chaîne ou null | Quand les nouveaux prix s'appliquent.                                                                                                               |
| `notifyCustomers`  | booléen        | Si les clients reçoivent un courriel avec leurs nouveaux prix.                                                                                      |
| `raiseFixedPrices` | booléen        | Si les prix convenus augmentent du même pourcentage. Cette option est séparée de la liste.                                                          |
| `priceListId`      | chaîne ou null | La liste dans laquelle ce changement est écrit. Null signifie Standard, y compris les changements effectués avant que les listes ne soient nommées. |
| `priceListName`    | chaîne         | Le nom de cette liste. `Standard` lorsqu’`priceListId` est null.                                                                                    |
| `createdBy`        | chaîne ou null | Identifiant de la personne qui l’a créé. Pour les brouillons API, la personne qui a créé la clé.                                                    |
| `items`            | entier         | Nombre de produits modifiés. Seulement dans la liste.                                                                                               |

## Changements de prix de liste

**GET** `/api/v1/price-changes`

Du plus récent au plus ancien. Couvre les **100 derniers** changements de prix.

| Nom      | Type   | Requis | Description                                      |
| -------- | ------ | ------ | ------------------------------------------------ |
| `limit`  | entier | non    | 1 à 100. Valeur par défaut 100.                  |
| `offset` | entier | non    | Nombre de lignes à ignorer. Valeur par défaut 0. |

```bash
curl https://tradecatalog.app/api/v1/price-changes \
  -H "Authorization: Bearer $TRADECATALOG_API_KEY"
```

```js
const res = await fetch('https://tradecatalog.app/api/v1/price-changes', {
  headers: { Authorization: `Bearer ${process.env.TRADECATALOG_API_KEY}` },
})
const { data: changes } = await res.json()
const drafts = changes.filter((change) => change.status === 'draft')
```

## Aperçu d'un changement de prix

**GET** `/api/v1/price-changes/{id}`

Tout ce que le personnel voit avant la publication : combien de prix augmentent et diminuent, les plus grandes variations, les avertissements, et combien de prix convenus sont touchés. Passez `customer` pour voir les prix propres à ce client avant et après.

| Nom        | Emplacement | Type   | Requis | Description                           |
| ---------- | ----------- | ------ | ------ | ------------------------------------- |
| `id`       | chemin      | chaîne | oui    | Identifiant du changement de prix.    |
| `customer` | requête     | chaîne | non    | Identifiant client ou code de compte. |

```bash
curl "https://tradecatalog.app/api/v1/price-changes/c4d5e6f7-1234-4abc-9def-0123456789ab?customer=OAK01" \
  -H "Authorization: Bearer $TRADECATALOG_API_KEY"
```

```js
const res = await fetch(
  `https://tradecatalog.app/api/v1/price-changes/${priceChangeId}?customer=OAK01`,
  { headers: { Authorization: `Bearer ${process.env.TRADECATALOG_API_KEY}` } },
)
const { data: preview } = await res.json()
if (preview.warnings.length)
  console.warn('Check these before publishing', preview.warnings)
```

```json
{
  "data": {
    "change": {
      "id": "c4d5e6f7-1234-4abc-9def-0123456789ab",
      "source": "import",
      "title": "API import (Sage stock sync)",
      "supplierNote": null,
      "status": "draft",
      "effectiveAt": null,
      "notifyCustomers": true,
      "raiseFixedPrices": false,
      "priceListId": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "priceListName": "Standard",
      "createdBy": "Fq3L0cZ7tN1pW9aYx2Rk",
      "publishedAt": null,
      "cancelledAt": null,
      "createdAt": "2026-09-27T02:00:14.000Z"
    },
    "counts": { "total": 38, "up": 36, "down": 2 },
    "biggest": [
      {
        "productId": "3f8a2c1e-9b4d-4e6f-a7c8-1d2e3f4a5b6c",
        "oldPrice": 1850,
        "newPrice": 1950,
        "sku": "HX-8510",
        "name": "Hex bolt M10 x 50 zinc",
        "changeBp": 541
      }
    ],
    "warnings": [],
    "fixedAffected": 3,
    "customer": {
      "name": "Oakfield Joinery",
      "rows": [
        {
          "sku": "HX-8510",
          "name": "Hex bolt M10 x 50 zinc",
          "before": 1573,
          "after": 1658,
          "label": "Brand discount −15%"
        }
      ]
    }
  },
  "currency": "GBP"
}
```

| Champ           | Description                                                                                                                                                                                                                         |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `counts`        | Produits du changement, et combien augmentent et diminuent.                                                                                                                                                                         |
| `biggest`       | Jusqu'à 20 articles avec la plus grande variation en pourcentage. `changeBp` est la variation en points de base (541 = +5,41 %).                                                                                                    |
| `warnings`      | Articles qui varient de plus de 30 % dans les deux sens, ou qui passent à zéro. Généralement des fautes de frappe.                                                                                                                  |
| `fixedAffected` | Prix convenus sur ces produits qui sont valides actuellement. Ils ne changent que si le changement augmente les prix convenus.                                                                                                      |
| `customer`      | Avec `customer` : les prix unitaires de ce client avant et après, provenant de leur propre liste puis de leur ajustement, pour les 50 premiers articles au maximum. Un client sur une autre liste reste inchangé. `null` sans cela. |

`404 not_found` s'il n'y a pas de changement de prix dans cet espace de travail.
