# Produits
Source: https://docs.lomi.africa/build/billing/products

Gérez les produits, les tarifs et la configuration des abonnements.

***

title: Produits
description: Gérez les produits, les tarifs et la configuration des abonnements.
--------------------------------------------------------------------------------

import { Tabs, Tab } from 'fumadocs-ui/components/tabs';
import { Callout } from '@/components/docs/docs-callout';

L’API Products permet de gérer votre catalogue. Un produit représente un article ou un service ; chaque produit peut avoir jusqu’à **3 tarifs actifs**.

## Créer un produit

Crée un produit avec un ou plusieurs tarifs. Au moins un tarif est obligatoire.

**Référence API (schéma complet) :** [Créer un produit](/api/products/ProductsController_create)

**L’essentiel :**

* `name`, `product_type` (`one_time`, `recurring`, `usage_based`) et un tableau `prices` sont obligatoires.
* Chaque tarif exige `amount` et `currency_code`. Pour un produit récurrent, ajoutez `billing_interval` sur le tarif.
* Champs réservés au récurrent : `trial_enabled`, `trial_period_days`, `failed_payment_action`, `charge_day`, `first_payment_type`: voir la page API.
* Packs d’usage : `amount` sur le tarif est ce que le client paie. `included_units` est le nombre d’unités que ce paiement achète. `usage_unit` est le libellé de l’unité. lomi. additionne `quantity` sur un compteur. Laissez `billing_interval` vide. Voir [Facturation à l’usage](/build/billing/usage-billing).

<Callout type="info">
  **Métadonnées optionnelles** pour les produits récurrents (via `metadata` à la création / mise à jour) : `subscription_length` (`"automatic"` par défaut) et `fixed_charges` (nombre entier de cycles avant expiration). Ce ne sont pas des champs API de premier niveau ; stockez-les dans `metadata`.
</Callout>

<Callout type="info">
  **Payez ce que vous voulez** (`pricing_model: pay_what_you_want`, ponctuel uniquement) : `minimum_amount` est obligatoire ; `amount` est le prix unitaire suggéré. Le serveur impose `amount >= minimum_amount` et le `maximum_amount` optionnel. Champs tarif complets : [Créer un produit](/api/products/ProductsController_create).
</Callout>

<Tabs items={["TypeScript", "Python", "cURL"]}>
  <Tab value="TypeScript">
    ```typescript
    import { LomiSDK } from '@lomi./sdk';

    const lomi = new LomiSDK({
      apiKey: process.env.LOMI_SECRET_KEY!,
      environment: 'live',
    });

    // One-time product
    const product = await lomi.products.create({
      name: 'E-book Bundle',
      description: 'Collection de guides complète',
      product_type: 'one_time',
      prices: [
        {
          amount: 25000,
          currency_code: 'XOF',
          is_default: true,
        },
      ],
      display_on_storefront: true,
    });

    // Subscription product with trial
    const subscription = await lomi.products.create({
      name: 'Premium Plan',
      description: 'Accès premium mensuel',
      product_type: 'recurring',
      prices: [
        {
          amount: 10000,
          currency_code: 'XOF',
          billing_interval: 'month',
          is_default: true,
        },
      ],
      trial_enabled: true,
      trial_period_days: 14,
      failed_payment_action: 'continue',
    });

    // Pay what you want (one-time only)
    const tipJar = await lomi.products.create({
      name: 'Community tip jar',
      product_type: 'one_time',
      prices: [
        {
          pricing_model: 'pay_what_you_want',
          amount: 1000,
          minimum_amount: 500,
          maximum_amount: 5000,
          currency_code: 'XOF',
          is_default: true,
        },
      ],
    });

    // Pack d'usage : amount est le prix du pack, included_units est ce que ce paiement achète
    const pack = await lomi.products.create({
      name: 'Appels API',
      product_type: 'usage_based',
      usage_unit: 'appel',
      prices: [
        {
          amount: 5000,
          currency_code: 'XOF',
          included_units: 1000,
          is_default: true,
        },
      ],
    });

    console.log(`Product created: ${product.product_id}`);
    ```
  </Tab>

  <Tab value="Python">
    ```python
    from lomi import LomiClient
    import os

    client = LomiClient(
        api_key=os.environ["LOMI_SECRET_KEY"],
        environment="test"
    )

    # One-time product
    product = client.products.create({
        "name": "E-book Bundle",
        "description": "Collection de guides complète",
        "product_type": "one_time",
        "prices": [
            {
                "amount": 25000,
                "currency_code": "XOF",
                "is_default": True
            }
        ],
        "display_on_storefront": True
    })

    # Pay what you want (one-time only)
    tip_jar = client.products.create({
        "name": "Community tip jar",
        "product_type": "one_time",
        "prices": [
            {
                "pricing_model": "pay_what_you_want",
                "amount": 1000,
                "minimum_amount": 500,
                "maximum_amount": 5000,
                "currency_code": "XOF",
                "is_default": True
            }
        ]
    })

    # Pack d'usage : amount est le prix du pack, included_units est ce que ce paiement achète
    pack = client.products.create({
        "name": "Appels API",
        "product_type": "usage_based",
        "usage_unit": "appel",
        "prices": [
            {
                "amount": 5000,
                "currency_code": "XOF",
                "included_units": 1000,
                "is_default": True
            }
        ]
    })

    print(f"Product created: {product['product_id']}")
    ```
  </Tab>

  <Tab value="cURL">
    ```bash
    curl -X POST "https://api.lomi.africa/products" \
      -H "X-API-KEY: $LOMI_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "E-book Bundle",
        "description": "Collection de guides complète",
        "product_type": "one_time",
        "prices": [
          {
            "amount": 25000,
            "currency_code": "XOF",
            "is_default": true
          }
        ],
        "display_on_storefront": true
      }'

    # Pay what you want (one-time only)
    curl -X POST "https://api.lomi.africa/products" \
      -H "X-API-KEY: $LOMI_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Community tip jar",
        "product_type": "one_time",
        "prices": [
          {
            "pricing_model": "pay_what_you_want",
            "amount": 1000,
            "minimum_amount": 500,
            "maximum_amount": 5000,
            "currency_code": "XOF",
            "is_default": true
          }
        ]
      }'

    # Pack d'usage : amount est le prix du pack, included_units est ce que ce paiement achète
    curl -X POST "https://api.lomi.africa/products" \
      -H "X-API-KEY: $LOMI_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Appels API",
        "product_type": "usage_based",
        "usage_unit": "appel",
        "prices": [
          {
            "amount": 5000,
            "currency_code": "XOF",
            "included_units": 1000,
            "is_default": true
          }
        ]
      }'
    ```
  </Tab>
</Tabs>

***

## Lister les produits

**Référence API :** [Lister les produits](/api/products/ProductsController_findAll), `isActive`, `limit` et `offset`.

<Tabs items={["TypeScript", "Python", "cURL"]}>
  <Tab value="TypeScript">
    ```typescript
    const products = await lomi.products.list({
      isActive: true,
      limit: 20,
    });
    ```
  </Tab>

  <Tab value="Python">
    ```python
    products = client.products.list(isActive=True, limit=20)
    ```
  </Tab>

  <Tab value="cURL">
    ```bash
    curl -X GET "https://api.lomi.africa/products?isActive=true&limit=20" \
      -H "X-API-KEY: $LOMI_SECRET_KEY"
    ```
  </Tab>
</Tabs>

***

## Obtenir un produit

**Référence API :** [Obtenir un produit](/api/products/ProductsController_findOne), renvoie le produit et tous ses tarifs.

<Tabs items={["TypeScript", "Python", "cURL"]}>
  <Tab value="TypeScript">
    ```typescript
    const product = await lomi.products.get('prod_abc123...');
    console.log(`Default price: ${product.prices.find(p => p.is_default)?.amount}`);
    ```
  </Tab>

  <Tab value="Python">
    ```python
    product = client.products.get('prod_abc123...')
    ```
  </Tab>

  <Tab value="cURL">
    ```bash
    curl -X GET "https://api.lomi.africa/products/prod_abc123..." \
      -H "X-API-KEY: $LOMI_SECRET_KEY"
    ```
  </Tab>
</Tabs>

***

## Ajouter un tarif à un produit

**Référence API :** [Ajouter un tarif](/api/products/ProductsController_addPrice)

<Callout type="warning">
  Un produit peut compter au maximum **3 tarifs actifs**. Les tarifs existants ne se modifient pas, créez-en un nouveau.
</Callout>

<Tabs items={["TypeScript", "Python", "cURL"]}>
  <Tab value="TypeScript">
    ```typescript
    const price = await lomi.products.addPrice('prod_abc123...', {
      amount: 50000,
      currency_code: 'XOF',
      billing_interval: 'year',
    });

    console.log(`New price added: ${price.price_id}`);

    // Pay what you want price
    const pwywPrice = await lomi.products.addPrice('prod_abc123...', {
      pricing_model: 'pay_what_you_want',
      amount: 1000,
      minimum_amount: 500,
      maximum_amount: 5000,
      currency_code: 'XOF',
    });
    ```
  </Tab>

  <Tab value="Python">
    ```python
    price = client.products.add_price('prod_abc123...', {
        "amount": 50000,
        "currency_code": "XOF",
        "billing_interval": "year"
    })
    ```
  </Tab>

  <Tab value="cURL">
    ```bash
    curl -X POST "https://api.lomi.africa/products/prod_abc123.../prices" \
      -H "X-API-KEY: $LOMI_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "amount": 50000,
        "currency_code": "XOF",
        "billing_interval": "year"
      }'
    ```
  </Tab>
</Tabs>

***

## Définir le tarif par défaut

**Référence API :** [Définir le tarif par défaut](/api/products/ProductsController_setDefaultPrice)

<Tabs items={["TypeScript", "Python", "cURL"]}>
  <Tab value="TypeScript">
    ```typescript
    const product = await lomi.products.setDefaultPrice('prod_abc123...', 'price_def456...');
    ```
  </Tab>

  <Tab value="Python">
    ```python
    product = client.products.set_default_price('prod_abc123...', 'price_def456...')
    ```
  </Tab>

  <Tab value="cURL">
    ```bash
    curl -X POST "https://api.lomi.africa/products/prod_abc123.../prices/price_def456.../default" \
      -H "X-API-KEY: $LOMI_SECRET_KEY"
    ```
  </Tab>
</Tabs>

***

## API associée

* [Créer un produit](/api/products/ProductsController_create)
* [Lister les produits](/api/products/ProductsController_findAll)
* [Obtenir un produit](/api/products/ProductsController_findOne)
* [Ajouter un tarif](/api/products/ProductsController_addPrice)
* [Définir le tarif par défaut](/api/products/ProductsController_setDefaultPrice)
* [Checkout avec un produit](/build/accept/checkout)
