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

# Obtenir un produit

> Récupérer un produit spécifique par ID

## Autorisation

<ParamField header="Authorization" type="string" required>
  Jeton Bearer pour l'authentification. Format : `Bearer qwoty_your_token`
</ParamField>

## Paramètres de chemin

<ParamField path="id" type="string" required>
  UUID du produit
</ParamField>

## Exemples

<CodeGroup>
  ```bash cURL theme={null}
  curl https://qwoty.app/api/products/550e8400-e29b-41d4-a716-446655440000 \
    -H "Authorization: Bearer qwoty_your_token"
  ```

  ```javascript JavaScript theme={null}
  const productId = '550e8400-e29b-41d4-a716-446655440000'

  const response = await fetch(`https://qwoty.app/api/products/${productId}`, {
    headers: {
      Authorization: 'Bearer qwoty_your_token',
    },
  })

  const data = await response.json()
  ```

  ```python Python theme={null}
  import requests

  product_id = '550e8400-e29b-41d4-a716-446655440000'

  response = requests.get(
      f'https://qwoty.app/api/products/{product_id}',
      headers={
          'Authorization': 'Bearer qwoty_your_token'
      }
  )

  data = response.json()
  ```
</CodeGroup>

## Réponse

<ResponseField name="success" type="boolean">
  Indique si la requête a réussi
</ResponseField>

<ResponseField name="data" type="object">
  L'objet produit

  <Expandable title="Objet Produit">
    <ResponseField name="id" type="string">
      Identifiant unique (UUID)
    </ResponseField>

    <ResponseField name="product_parent_id" type="string">
      ID du produit parent (UUID)
    </ResponseField>

    <ResponseField name="workspace_id" type="string">
      ID de l'espace de travail (UUID)
    </ResponseField>

    <ResponseField name="name" type="string">
      Nom du produit (nom d'affichage combinant le parent et les options de variante)
    </ResponseField>

    <ResponseField name="api_name" type="string">
      Identifiant API (uniquement à la création)
    </ResponseField>

    <ResponseField name="reference" type="string">
      Référence interne
    </ResponseField>

    <ResponseField name="description" type="string">
      Description du produit
    </ResponseField>

    <ResponseField name="description_inherit_from_product" type="boolean">
      Indique si la description est héritée du produit parent
    </ResponseField>

    <ResponseField name="primary_image_inherit_from_product" type="boolean">
      Indique si l'image principale est héritée du produit parent
    </ResponseField>

    <ResponseField name="is_active" type="boolean">
      Statut actif
    </ResponseField>

    <ResponseField name="is_default" type="boolean">
      Indique s'il s'agit du produit par défaut
    </ResponseField>

    <ResponseField name="catalog_ids" type="array">
      IDs de catalogue (UUIDs) liés au produit parent
    </ResponseField>

    <ResponseField name="category_ids" type="array">
      IDs de catégorie (UUIDs) liés au produit parent
    </ResponseField>

    <ResponseField name="settings" type="object">
      Paramètres et configuration du produit

      <Expandable title="Objet Paramètres">
        <ResponseField name="unit_per_pack" type="number">
          Nombre d'unités par pack
        </ResponseField>

        <ResponseField name="product_type" type="string">
          Type de produit parent
        </ResponseField>

        <ResponseField name="language_id" type="string">
          ID de langue parent (UUID)
        </ResponseField>

        <ResponseField name="unit_of_measure" type="string">
          Unité de mesure parent
        </ResponseField>

        <ResponseField name="recurrence_type" type="string">
          Type de récurrence parent (`one_off` ou `recurring`)
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="shipping" type="object">
      Informations d'expédition

      <Expandable title="Objet Expédition">
        <ResponseField name="weight" type="number">
          Poids d'expédition
        </ResponseField>

        <ResponseField name="weight_unit" type="string">
          Unité de poids d'expédition (kg, lbs)
        </ResponseField>

        <ResponseField name="height" type="number">
          Hauteur d'expédition
        </ResponseField>

        <ResponseField name="length" type="number">
          Longueur d'expédition
        </ResponseField>

        <ResponseField name="width" type="number">
          Largeur d'expédition
        </ResponseField>

        <ResponseField name="length_unit" type="string">
          Unité de longueur d'expédition (cm, in, etc.)
        </ResponseField>

        <ResponseField name="country_of_origin" type="string">
          Pays d'origine pour l'expédition
        </ResponseField>

        <ResponseField name="harmonized_system_code" type="string">
          Code SH pour les douanes
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="inventory" type="object">
      Informations de stock

      <Expandable title="Objet Inventaire">
        <ResponseField name="sku" type="string">
          Unité de gestion des stocks (SKU)
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="identifiers" type="object">
      Identifiants de systèmes externes

      <Expandable title="Objet Identifiants">
        <ResponseField name="crm" type="string">
          ID CRM externe
        </ResponseField>

        <ResponseField name="accounting" type="string">
          ID comptable externe
        </ResponseField>

        <ResponseField name="erp" type="string">
          ID ERP externe
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="accounting" type="object">
      Informations comptables

      <Expandable title="Objet Comptabilité">
        <ResponseField name="ledger_account" type="string">
          Code du compte du grand livre
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="primary_image_id" type="string">
      UUID du média principal de ce produit. Null si aucun n'est défini.
      Lorsque `primary_image_inherit_from_product` est `true` et que ce champ est null,
      utiliser `parent_primary_image_id` comme image effective.
    </ResponseField>

    <ResponseField name="parent_primary_image_id" type="string">
      UUID du média principal du produit parent. Lecture seule.
      Utile lorsque `primary_image_inherit_from_product` est `true`.
    </ResponseField>

    <ResponseField name="options" type="array">
      Valeurs des options de variante (ex. : couleur, taille)

      <Expandable title="Objet Option">
        <ResponseField name="option_id" type="string">
          ID de définition de l'option
        </ResponseField>

        <ResponseField name="option_name" type="string">
          Nom de l'option (ex. : "Couleur")
        </ResponseField>

        <ResponseField name="option_api_name" type="string">
          Nom API de l'option
        </ResponseField>

        <ResponseField name="value_id" type="string">
          ID de la valeur d'option
        </ResponseField>

        <ResponseField name="value_name" type="string">
          Valeur de l'option (ex. : "Bleu")
        </ResponseField>

        <ResponseField name="value_api_name" type="string">
          Nom API de la valeur
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="prices" type="array">
      Prix associés à ce produit dans tous les catalogues de prix

      <Expandable title="Entrée de prix">
        <ResponseField name="id" type="string">ID du prix (UUID)</ResponseField>
        <ResponseField name="pricebook_id" type="string">ID du catalogue de prix (UUID)</ResponseField>
        <ResponseField name="pricebook_api_name" type="string">Nom API du catalogue de prix</ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="created_at" type="string">
      Horodatage ISO 8601
    </ResponseField>

    <ResponseField name="updated_at" type="string">
      Horodatage ISO 8601
    </ResponseField>

    <ResponseField name="created_by" type="string">
      ID de l'utilisateur ayant créé le produit
    </ResponseField>

    <ResponseField name="updated_by" type="string">
      ID de l'utilisateur ayant mis à jour le produit en dernier
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json Success Response theme={null}
  {
    "success": true,
    "data": {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "product_parent_id": "660e8400-e29b-41d4-a716-446655440001",
      "workspace_id": "880e8400-e29b-41d4-a716-446655440003",
      "name": "Consulting Services - Senior",
      "api_name": "consulting_services_senior",
      "reference": "SERV-001",
      "description": "Senior consultant hourly rate",
      "description_inherit_from_product": true,
      "primary_image_inherit_from_product": true,
      "is_active": true,
      "is_default": true,
      "catalog_ids": ["770e8400-e29b-41d4-a716-446655440002"],
      "category_ids": [],
      "settings": {
        "unit_per_pack": 1,
        "product_type": "service",
        "language_id": "990e8400-e29b-41d4-a716-446655440004",
        "unit_of_measure": "hour",
        "recurrence_type": "recurring"
      },
      "shipping": {
        "weight": null,
        "weight_unit": null,
        "height": null,
        "length": null,
        "width": null,
        "length_unit": null,
        "country_of_origin": null,
        "harmonized_system_code": null
      },
      "inventory": {
        "sku": "CONS-SEN-001"
      },
      "identifiers": {
        "crm": "crm_123",
        "accounting": "acc_789",
        "erp": "erp_456"
      },
      "accounting": {
        "ledger_account": "4010"
      },
      "primary_image_id": "cc0e8400-e29b-41d4-a716-446655440020",
      "parent_primary_image_id": "dd0e8400-e29b-41d4-a716-446655440021",
      "options": [
        {
          "option_id": "aa0e8400-e29b-41d4-a716-446655440010",
          "option_name": "Seniority",
          "option_api_name": "seniority",
          "value_id": "bb0e8400-e29b-41d4-a716-446655440011",
          "value_name": "Senior",
          "value_api_name": "senior"
        }
      ],
      "prices": [
        {
          "id": "ee0e8400-e29b-41d4-a716-446655440030",
          "pricebook_id": "ff0e8400-e29b-41d4-a716-446655440031",
          "pricebook_api_name": "standard"
        }
      ],
      "created_at": "2024-12-21T10:30:00Z",
      "updated_at": "2024-12-21T10:30:00Z",
      "created_by": "aa1e8400-e29b-41d4-a716-446655440099",
      "updated_by": "aa1e8400-e29b-41d4-a716-446655440099"
    }
  }
  ```
</ResponseExample>

## Réponses d'erreur

<ResponseExample>
  ```json Not Found theme={null}
  {
    "success": false,
    "error": "Product not found"
  }
  ```

  ```json Unauthorized theme={null}
  {
    "success": false,
    "error": "Invalid API token"
  }
  ```

  ```json Invalid ID Format theme={null}
  {
    "success": false,
    "error": "Invalid product ID format"
  }
  ```
</ResponseExample>

## Notes

Cet endpoint permet d'accéder directement à un produit en utilisant uniquement l'ID du produit.

Pour accéder aux produits via leur produit parent, vous pouvez également utiliser :

* `GET /api/product-parents/{id}/products/{product_id}`
