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

# Passer une Commande

> Achetez des cartes cadeaux ou des produits numériques

## Vue d'ensemble

Créez des commandes pour des cartes cadeaux et des produits numériques. Les cartes sont livrées numériquement via l'endpoint `/checkOrder`.

<Note>
  **Avant de commander :** Vérifiez le stock via `/checkProduct` et vérifiez le solde du compte.
</Note>

## Corps de la requête

<ParamField body="productId" type="string" required>
  ID du produit depuis `/catalog`
</ParamField>

<ParamField body="typeId" type="string" required>
  ID du type depuis `/checkProduct`
</ParamField>

<ParamField body="quantity" type="integer" required>
  Nombre de cartes à commander (minimum : 1)
</ParamField>

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.oneclickdz.com/v3/gift-cards/placeOrder \
    -X POST \
    -H "Content-Type: application/json" \
    -H "X-Access-Token: YOUR_API_KEY" \
    -d '{
      "productId": "507f1f77bcf86cd799439011",
      "typeId": "type_001",
      "quantity": 2
    }'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.oneclickdz.com/v3/gift-cards/placeOrder",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-Access-Token": "YOUR_API_KEY",
      },
      body: JSON.stringify({
        productId: "507f1f77bcf86cd799439011",
        typeId: "type_001",
        quantity: 2,
      }),
    }
  );
  const { data } = await response.json();
  console.log("Order ID:", data.orderId);
  ```

  ```python Python theme={null}
  response = requests.post(
      'https://api.oneclickdz.com/v3/gift-cards/placeOrder',
      headers={
          'Content-Type': 'application/json',
          'X-Access-Token': 'YOUR_API_KEY'
      },
      json={
          'productId': '507f1f77bcf86cd799439011',
          'typeId': 'type_001',
          'quantity': 2
      }
  )
  order_id = response.json()['data']['orderId']
  ```

  ```php PHP theme={null}
  <?php
  $data = [
      'productId' => '507f1f77bcf86cd799439011',
      'typeId' => 'type_001',
      'quantity' => 2
  ];

  $ch = curl_init('https://api.oneclickdz.com/v3/gift-cards/placeOrder');
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'Content-Type: application/json',
      'X-Access-Token: YOUR_API_KEY'
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  $response = json_decode(curl_exec($ch), true);
  $orderId = $response['data']['orderId'];
  ?>
  ```
</CodeGroup>

### Réponse de succès

```json theme={null}
{
  "success": true,
  "data": {
    "orderId": "6901616fe9e88196b4eb64b3"
  },
  "meta": {
    "timestamp": "2025-10-29T01:00:00.000Z"
  },
  "requestId": "req_1730163600_abc123"
}
```

## Liste de vérification avant commande

<Steps>
  <Step title="Vérifier le stock">
    ```javascript theme={null}
    const product = await checkProduct(productId);
    const type = product.types.find(t => t.id === typeId);
    if (!type || type.quantity < quantity) {
      throw new Error('Insufficient stock');
    }
    ```
  </Step>

  <Step title="Vérifier le solde">
    ```javascript theme={null}
    const balance = await getBalance();
    const totalCost = type.price * quantity;
    if (balance < totalCost) {
      throw new Error('Insufficient balance');
    }
    ```
  </Step>

  <Step title="Passer la commande">
    ```javascript theme={null}
    const order = await placeOrder({ productId, typeId, quantity });
    ```
  </Step>

  <Step title="Interroger pour les cartes">
    ```javascript theme={null}
    const result = await pollOrder(order.orderId);
    ```
  </Step>
</Steps>

## Réponses d'erreur

<AccordionGroup>
  <Accordion title="ERR_VALIDATION">Paramètres de requête invalides</Accordion>
  <Accordion title="ERR_STOCK">Produit en rupture de stock</Accordion>
  <Accordion title="INSUFFICIENT_BALANCE">Solde insuffisant</Accordion>
</AccordionGroup>

## Traitement

<Warning>Les commandes sont **définitives une fois passées**. Sauvegardez `orderId` immédiatement.</Warning>

La plupart des commandes sont traitées en quelques secondes. Interrogez `/checkOrder/:orderId` toutes les 5 à 10 secondes jusqu'à ce que le statut soit `FULFILLED` ou `REFUNDED`.

## Liens utiles

<CardGroup cols={2}>
  <Card title="Vérifier la Commande" icon="magnifying-glass" href="/fr/api-reference/gift-cards/check-order">
    Obtenir les cartes lorsque livrées
  </Card>

  <Card title="Vérifier le Produit" icon="box" href="/fr/api-reference/gift-cards/check-product">
    Vérifier le stock au préalable
  </Card>
</CardGroup>
