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

# Obtenir le Catalogue de Produits

> Obtenez toutes les cartes cadeaux et produits numériques disponibles, regroupés par catégorie

## Vue d'ensemble

Retourne le catalogue complet des cartes cadeaux et produits numériques organisés par catégories (Jeux, Streaming, etc.).

<Tip>
  **Mettez en cache ces données** pendant au moins 24 heures. Le catalogue change peu fréquemment.
</Tip>

## Réponse

<ResponseField name="success" type="boolean" required>
  Statut de la requête
</ResponseField>

<ResponseField name="totalCategories" type="integer">
  Nombre total de catégories dans le catalogue
</ResponseField>

<ResponseField name="totalProducts" type="integer">
  Nombre total de produits dans toutes les catégories
</ResponseField>

<ResponseField name="data" type="object" required>
  <Expandable title="propriétés">
    <ResponseField name="categories" type="array">
      Tableau d'objets catégorie avec produits

      <Expandable title="objet catégorie">
        <ResponseField name="title" type="string">
          Nom de la catégorie (ex. "PSN", "Game Stores", "iTunes")
        </ResponseField>

        <ResponseField name="products" type="array">
          Tableau d'objets produit

          <Expandable title="objet produit">
            <ResponseField name="id" type="string">
              ID unique du produit (à utiliser avec `/check-product`)
            </ResponseField>

            <ResponseField name="title" type="string">
              Nom d'affichage du produit
            </ResponseField>

            <ResponseField name="enabled" type="boolean">
              Disponible via l'API
            </ResponseField>

            <ResponseField name="region" type="string">
              Code de région géographique (ex. "germany", "united-states-america")
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta" type="object">
  <Expandable title="propriétés">
    <ResponseField name="timestamp" type="string">
      Horodatage de la réponse au format ISO 8601
    </ResponseField>
  </Expandable>
</ResponseField>

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.oneclickdz.com/v3/gift-cards/catalog \
    -H "X-Access-Token: YOUR_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.oneclickdz.com/v3/gift-cards/catalog",
    {
      headers: { "X-Access-Token": "YOUR_API_KEY" },
    }
  );
  const { data } = await response.json();

  // Filter enabled products
  const enabledProducts = data.categories.flatMap((cat) =>
    cat.products.filter((p) => p.enabled)
  );
  ```

  ```python Python theme={null}
  response = requests.get(
      'https://api.oneclickdz.com/v3/gift-cards/catalog',
      headers={'X-Access-Token': 'YOUR_API_KEY'}
  )
  catalog = response.json()['data']

  # Filter by category
  gaming = next(c for c in catalog['categories'] if c['name'] == 'Gaming Cards')
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init('https://api.oneclickdz.com/v3/gift-cards/catalog');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Access-Token: YOUR_API_KEY']);
  $response = json_decode(curl_exec($ch), true);
  $categories = $response['data']['categories'];
  ?>
  ```
</CodeGroup>

### Exemple de réponse

```json theme={null}
{
  "success": true,
  "totalCategories": 14,
  "totalProducts": 62,
  "data": {
    "categories": [
      {
        "title": "PSN",
        "products": [
          {
            "id": "6126393c6f57860f925a1983",
            "title": "PSN Germany",
            "enabled": true,
            "region": "germany"
          },
          {
            "id": "612619816f57860f9259eee3",
            "title": "PSN UK",
            "enabled": true,
            "region": "united-kingdom"
          },
          {
            "id": "60111eba751a26110ab5b209",
            "title": "PSN US",
            "enabled": true,
            "region": "united-states-america"
          }
        ]
      },
      {
        "title": "Game Stores",
        "products": [
          {
            "id": "6037a862b8d036107c61d312",
            "title": "Steam USD",
            "enabled": true,
            "region": "united-states-america"
          },
          {
            "id": "6038ffd52a60b8107c134e39",
            "title": "Steam EUR",
            "enabled": true,
            "region": "european-union"
          },
          {
            "id": "60b6f304ad371a16a4347e11",
            "title": "Roblox",
            "enabled": true
          }
        ]
      }
    ]
  },
  "meta": {
    "timestamp": "2025-10-29T00:36:52.615Z"
  }
}
```

## Construction de l'interface produit

```javascript theme={null}
// Example: Building a category-based UI
function renderCatalog(catalog) {
  return catalog.categories.map((category) => ({
    categoryName: category.name,
    products: category.products
      .filter((p) => p.enabled)
      .map((p) => ({
        id: p.id,
        name: p.title,
        imageUrl: `/images/products/${p.id}.png`,
      })),
  }));
}
```

## Stratégie de mise en cache

<CodeGroup>
  ```javascript Node.js theme={null}
  // Cache for 24 hours
  const cache = {
    data: null,
    timestamp: 0,
    ttl: 24 * 60 * 60 * 1000,
  };

  async function getCatalog() {
    const now = Date.now();

    if (cache.data && now - cache.timestamp < cache.ttl) {
      return cache.data;
    }

    const response = await fetch(
      "https://api.oneclickdz.com/v3/gift-cards/catalog",
      { headers: { "X-Access-Token": process.env.API_KEY } }
    );

    cache.data = await response.json();
    cache.timestamp = now;

    return cache.data;
  }
  ```

  ```python Python theme={null}
  from datetime import datetime, timedelta
  import requests

  class CatalogCache:
      def __init__(self):
          self.data = None
          self.timestamp = None
          self.ttl = timedelta(minutes=10)

      def get(self):
          if self.data and datetime.now() - self.timestamp < self.ttl:
              return self.data

          response = requests.get(
              'https://api.oneclickdz.com/v3/gift-cards/catalog',
              headers={'X-Access-Token': 'YOUR_API_KEY'}
          )

          self.data = response.json()
          self.timestamp = datetime.now()

          return self.data

  catalog_cache = CatalogCache()
  ```
</CodeGroup>

## Bonnes pratiques

<CardGroup cols={2}>
  <Card title="Mettre en cache le catalogue" icon="database">
    Mettre en cache pendant 10+ minutes pour réduire les appels API
  </Card>

  <Card title="Filtrer les activés" icon="filter">
    Afficher uniquement les produits avec `enabled: true`
  </Card>

  <Card title="Vérifier la région" icon="earth-americas">
    Filtrer par région si vous ciblez des marchés spécifiques
  </Card>

  <Card title="Organiser par catégorie" icon="folder-tree">
    Utiliser les catégories pour une meilleure UX
  </Card>
</CardGroup>

## Étapes suivantes

Après avoir obtenu le catalogue :

<Steps>
  <Step title="Afficher les produits">
    Montrer les produits aux utilisateurs organisés par catégorie
  </Step>

  <Step title="Vérifier les détails du produit">
    Utiliser `/checkProduct/:id` pour obtenir les prix et le stock
  </Step>

  <Step title="Passer la commande">
    Utiliser `/placeOrder` pour acheter le produit sélectionné
  </Step>
</Steps>

## Connexes

<CardGroup cols={2}>
  <Card title="Vérifier le produit" icon="magnifying-glass" href="/fr/api-reference/gift-cards/check-product">
    Obtenir les prix et le stock
  </Card>

  <Card title="Passer une commande" icon="cart-shopping" href="/fr/api-reference/gift-cards/place-order">
    Acheter un produit
  </Card>
</CardGroup>
