
# Référence de l'API REST Procurize.AI

**Accédez programmatiquement à votre base de connaissances – documents, questionnaires, RAG et rapports – en utilisant votre jeton API.**

> **Applicable à :** Procurize.AI API v1  
> **Authentification :** clé API via l'en‑tête `X-API-Key` (voir [Jetons API](/api-tokens/) pour la gestion des jetons)  
> **URL de base :** `https://api.procurize.com`

## Vue d'ensemble

L'API REST de Procurize.AI fournit un accès programmatique aux fonctionnalités clés de la plateforme. Elle vous permet d’intégrer Procurize.AI à vos systèmes internes, d’automatiser la gestion de la base de connaissances et de créer des flux de travail personnalisés.

**Modules pris en charge (authentifiés par jeton) :**

- [**RagArticle**](#ragarticle) – gérer les documents
- [**RagFaq**](#ragfaq) – gérer les entrées FAQ
- [**RagQuery**](#ragquery) – exécuter des requêtes RAG

## Authentification

Tous les points de terminaison authentifiés nécessitent un jeton API passé dans l’en‑tête de la requête.

| En‑tête | Valeur |
|--------|--------|
| `X-API-Key` | `<YOUR_API_TOKEN>` |

**Exemple :**
```bash
curl -X GET "https://api.procurize.com/v1/..." \
  -H "X-API-Key: your-api-token-here"
```

> 💡 Les jetons sont liés à votre organisation – vous n’avez pas besoin de spécifier un ID d’organisation dans la requête.

## URL de base

Tous les points de terminaison de l’API REST sont servis sous :
```
https://api.procurize.com
```

## Gestion des erreurs

L'API utilise les codes d’état HTTP standard.

| Code | Signification |
|------|----------------|
| `200 OK` | Requête réussie |
| `201 Created` | Ressource créée avec succès |
| `204 No Content` | Requête réussie, aucun corps de réponse |
| `400 Bad Request` | Paramètres invalides ou requête mal formée |
| `401 Unauthorized` | Jeton API manquant ou invalide |
| `403 Forbidden` | Le jeton n’a pas la permission pour cette action |
| `404 Not Found` | Ressource inexistante |
| `500 Internal Server Error` | Erreur serveur inattendue |

Les réponses d’erreur incluent un code d’erreur lisible par machine et un message lisible par l’homme.

## Référence des modules

### RagArticle

#### GET /questionnaire/rag/articles/summary

**Résumé :** Résumé pour la page d’accueil

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| proj | query | string (uuid) | Non | ID du projet. |

**Réponse (200) :**
```json
{
  "active": 5
}
```

---

#### GET /questionnaire/rag/articles/total

**Résumé :** Nombre d’articles

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| q | query | string | Non | Filtre sur le nom ou le code de l’article. |
| state | query | array | Non | Filtre sur les états. |
| project | query | array | Non | Filtre sur les projets. |
| type | query | array | Non | Filtre sur les types de documents. |

**Réponse (200) :**
```json
42
```

---

#### GET /questionnaire/rag/articles/list

**Résumé :** Obtenir la liste des articles

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| q | query | string | Non | Filtre sur le nom ou le code de l’article. |
| state | query | array | Non | Filtre sur les états. |
| project | query | array | Non | Filtre sur les projets. |
| type | query | array | Non | Filtre sur les types de documents. |
| s | query | string | Non | Champ de tri. |
| asc | query | boolean | Non | Tri ascendant. |
| ps | query | integer (int32) | Non | Taille de page. |
| p | query | integer (int32) | Non | Numéro de page (à partir de 1). |

**Réponse (200) :**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 42,
    "totalPages": 5
  },
  "items": [
    {
      "code": "ART-001",
      "org": "00000000-0000-0000-0000-000000000000",
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "Titre de l’article",
      "description": "Description de l’article",
      "documentTypes": [
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "Nom du type",
          "plural": "Noms du type",
          "count": 5
        }
      ],
      "size": 150,
      "revision": {
        "id": "00000000-0000-0000-0000-000000000000",
        "collectionId": "00000000-0000-0000-0000-000000000000",
        "rev": 3,
        "date": "2025-01-15T10:30:00Z",
        "author": {
          "id": "user123",
          "name": "John Doe",
          "email": "john.doe@example.com",
          "login": "johndoe",
          "ra": true
        },
        "authorName": "John Doe",
        "analysisSummary": {
          "id": "00000000-0000-0000-0000-000000000000",
          "initiator": {
            "id": "user123",
            "name": "John Doe",
            "email": "john.doe@example.com",
            "login": "johndoe",
            "ra": true
          },
          "created": "2025-01-15T10:30:00Z",
          "state": "Completed",
          "stateDate": "2025-01-15T10:35:00Z",
          "stateDetails": "Analyse terminée avec succès",
          "operationId": "op-12345"
        }
      },
      "type": "Article",
      "state": "Active",
      "projects": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "items": [
        "00000000-0000-0000-0000-000000000000"
      ],
      "isShared": false
    }
  ]
}
```

---

#### POST /questionnaire/rag/file-to-md

**Résumé :** Retourne le contenu Markdown du fichier

**Corps de la requête (multipart/form-data) :**
```json
{
  "url": "https://example.com/file.pdf",
  "file": "binary"
}
```

**Réponse (200) :**
```json
"Contenu Markdown du fichier"
```

---

#### POST /questionnaire/rag/article/create

**Résumé :** Créer un article

**Corps de la requête (multipart/form-data) :**
```json
{
  "code": "ART-001",
  "name": "Titre de l’article",
  "description": "Description de l’article",
  "content": "# Contenu de l’article\n\nCeci est le contenu de l’article.",
  "url": "https://example.com/file.pdf",
  "file": "binary"
}
```

**Réponse (200) :**
```json
{
  "code": "ART-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Titre de l’article",
  "description": "Description de l’article",
  "documentTypes": null,
  "size": 150,
  "revision": null,
  "type": "Article",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

#### GET /questionnaire/rag/article/check

**Résumé :** Vérifier l’existence d’un article.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

**Réponse (200) :**
```json
true
```

---

#### GET /questionnaire/rag/article-info

**Résumé :** Obtenir les informations d’un article par code.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

**Réponse (200) :**
```json
{
  "code": "ART-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Titre de l’article",
  "description": "Description de l’article",
  "documentTypes": null,
  "size": 150,
  "revision": null,
  "type": "Article",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

#### GET /questionnaire/rag/article

**Résumé :** Obtenir le contenu d’un article par code

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |
| format | query | string | Non | Si vrai, renvoie le contenu HTML dans le corps de la réponse. Sinon, renvoie le contenu en format Markdown. |
| split | query | boolean | Non | Si vrai, renvoie le contenu séparé par les éléments RAG. |
| css | query | boolean | Non | Si vrai, renvoie le contenu HTML/PDF avec CSS. |

**Réponse (200) :**
```json
"# Titre de l’article\n\nCeci est le contenu de l’article au format Markdown."
```

#### POST /questionnaire/rag/article

**Résumé :** Mettre à jour les métadonnées de l’article

**Corps de la requête :**
```json
{
  "code": "ART-001",
  "name": "Titre de l’article mis à jour",
  "description": "Description mise à jour",
  "projects": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "documentTypes": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "Nom du type",
      "plural": "Noms du type"
    }
  ],
  "isShared": true,
  "state": "Active"
}
```

**Réponse (200) :**
```json
{}
```

#### DELETE /questionnaire/rag/article

**Résumé :** Supprimer l’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

---

#### GET /questionnaire/rag/article/pdf

**Résumé :** Obtenir l’article au format PDF par code

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

**Réponse (200) :**
```json
(pdf binary)
```

---

#### GET /questionnaire/rag/article/content

**Résumé :** Obtenir le contenu de l’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

**Réponse (200) :**
```json
{
  "content": "# Titre de l’article\n\nContenu ici."
}
```

---

#### POST /questionnaire/rag/article/content

**Résumé :** Mettre à jour le contenu de l’article

**Corps de la requête (multipart/form-data) :**
```json
{
  "code": "ART-001",
  "content": "# Contenu mis à jour",
  "file": "binary"
}
```

---

#### POST /questionnaire/rag/plural

**Résumé :** Obtenir la forme plurielle du nom

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| noun | query | string | Non | Nom à mettre au pluriel. |

**Réponse (200) :**
```json
{
  "plural": "Articles"
}
```

---

#### POST /questionnaire/rag/article/find-types

**Résumé :** Analyser l’article avec l’IA et renvoyer leurs types

**Corps de la requête (multipart/form-data) :**
```json
{
  "code": "ART-001",
  "content": "# Contenu de l’article"
}
```

**Réponse (200) :**
```json
[
  {
    "plural": "Types"
  }
]
```

---

#### POST /questionnaire/rag/article/format-with-ai

**Résumé :** Formater le contenu de l’article avec l’IA

**Corps de la requête (multipart/form-data) :**
```json
{
  "code": "ART-001",
  "content": "# Contenu de l’article"
}
```

**Réponse (200) :**
```json
{
  "formattedContent": "# Contenu d’article formaté"
}
```

---

#### POST /questionnaire/rag/article/improve-on-suggestions

**Résumé :** Améliorer le document à partir des suggestions

**Corps de la requête (multipart/form-data) :**
```json
{
  "suggestions": [
    {
      "sectionTitle": "Introduction",
      "suggestion": "Ajouter plus de détails ici."
    }
  ],
  "code": "ART-001",
  "content": "# Contenu de l’article"
}
```

**Réponse (200) :**
```json
{
  "improvedContent": "# Contenu amélioré"
}
```

---

#### GET /questionnaire/rag/article/parts

**Résumé :** Retourne la liste des parties de l’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | query | array | Oui | Liste des parties d’article. |

**Réponse (200) :**
```json
[
  {
    "id": "00000000-0000-0000-0000-000000000000",
    "code": "part-1",
    "title": "Introduction",
    "orderNumber": 1,
    "content": "Contenu de l’introduction."
  }
]
```

---

#### GET /questionnaire/rag/article/revisions

**Résumé :** Retourne la liste des révisions d’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |

**Réponse (200) :**
```json
[
  {
    "id": "00000000-0000-0000-0000-000000000000",
    "collectionId": "00000000-0000-0000-0000-000000000000",
    "rev": 1,
    "date": "2025-01-15T10:30:00Z",
    "author": {
      "id": "user123",
      "name": "John Doe",
      "email": "john.doe@example.com",
      "login": "johndoe",
      "ra": true
    },
    "authorName": "John Doe",
    "analysisSummary": {
      "id": "00000000-0000-0000-0000-000000000000",
      "initiator": {
        "id": "user123",
        "name": "John Doe",
        "email": "john.doe@example.com",
        "login": "johndoe",
        "ra": true
      },
      "created": "2025-01-15T10:30:00Z",
      "state": "Completed",
      "stateDate": "2025-01-15T10:35:00Z",
      "stateDetails": "Analyse terminée",
      "operationId": "op-12345"
    }
  }
]
```

---

#### GET /questionnaire/rag/article/revisions/info/{id}

**Résumé :** Obtenir les informations d’une révision d’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | path | string (uuid) | Oui | ID de la révision. |

**Réponse (200) :**
```json
{
  "id": "00000000-0000-0000-0000-000000000000",
  "collectionId": "00000000-0000-0000-0000-000000000000",
  "rev": 1,
  "date": "2025-01-15T10:30:00Z",
  "author": {
    "id": "user123",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "login": "johndoe",
    "ra": true
  },
  "authorName": "John Doe",
  "analysisSummary": {
    "id": "00000000-0000-0000-0000-000000000000",
    "initiator": {
      "id": "user123",
      "name": "John Doe",
      "email": "john.doe@example.com",
      "login": "johndoe",
      "ra": true
    },
    "created": "2025-01-15T10:30:00Z",
    "state": "Completed",
    "stateDate": "2025-01-15T10:35:00Z",
    "stateDetails": "Analyse terminée",
    "operationId": "op-12345"
  }
}
```

---

#### GET /questionnaire/rag/article/revisions/{id}

**Résumé :** Obtenir le contenu d’une révision d’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | path | string (uuid) | Oui | ID de la révision. |

**Réponse (200) :**
```json
"# Contenu de la révision d’article\n\nVersion précédente."
```

---

#### GET /questionnaire/rag/article/analyze

**Résumé :** Analyser le contenu d’un article avec l’IA

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de l’article. |
| rev | query | integer (int32) | Non | Numéro de révision. |
| force | query | boolean | Non | Forcer la création d’une nouvelle analyse et supprimer le résultat d’analyse incomplet précédent s’il existe. |

**Réponse (200) :**
```json
{
  "id": "00000000-0000-0000-0000-000000000000",
  "initiator": {
    "id": "user123",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "login": "johndoe",
    "ra": true
  },
  "created": "2025-01-15T10:30:00Z",
  "state": "Completed",
  "stateDate": "2025-01-15T10:35:00Z",
  "stateDetails": "Analyse terminée",
  "operationId": "op-12345"
}
```

---

#### GET /questionnaire/rag/article/analyze/{id}

**Résumé :** Obtenir le résultat d’une analyse d’article

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | path | string (uuid) | Oui | ID de l’analyse. |

**Réponse (200) :**
```json
{
  "id": "00000000-0000-0000-0000-000000000000",
  "initiator": {
    "id": "user123",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "login": "johndoe",
    "ra": true
  },
  "created": "2025-01-15T10:30:00Z",
  "state": "Completed",
  "stateDate": "2025-01-15T10:35:00Z",
  "stateDetails": "Analyse terminée",
  "operationId": "op-12345",
  "fragments": [
    "fragment-1",
    "fragment-2"
  ],
  "ownInconcies": "Incohérences propres trouvées",
  "ragInconcies": "Incohérences RAG trouvées",
  "proposals": "Propositions d’amélioration"
}
```

---

#### GET /questionnaire/rag/messages/list

**Résumé :** Lister tous les messages

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | query | string (uuid) | Oui | ID de la collection RAG. |
| item | query | string (uuid) | Non | ID de l’élément RAG. |
| message | query | string (uuid) | Non | ID du message. |
| asc | query | boolean | Non | Tri ascendant. |
| ps | query | integer (int32) | Non | Taille de page. |
| p | query | integer (int32) | Non | Numéro de page (à partir de 1). |

**Réponse (200) :**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 5,
    "totalPages": 1
  },
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "replyTo": null,
      "questionnaire": null,
      "section": null,
      "question": null,
      "ragCollection": "00000000-0000-0000-0000-000000000000",
      "ragItem": "00000000-0000-0000-0000-000000000000",
      "targetId": "00000000-0000-0000-0000-000000000000",
      "targetType": "Question",
      "targetNum": 1,
      "author": {
        "id": "user123",
        "name": "John Doe",
        "email": "john.doe@example.com",
        "login": "johndoe",
        "ra": true
      },
      "text": "Contenu du message",
      "created": "2025-01-15T10:30:00Z",
      "updated": "2025-01-15T10:30:00Z",
      "replies": 0
    }
  ]
}
```

---

#### POST /questionnaire/rag/messages/add

**Résumé :** Ajouter un nouveau message

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | query | string (uuid) | Oui | ID de la collection RAG. |
| item | query | string (uuid) | Non | ID de l’élément RAG. |
| message | query | string (uuid) | Non | ID du message auquel répondre. |

**Corps de la requête :**
```json
{
  "text": "Contenu du nouveau message"
}
```

**Réponse (200) :**
```json
{
  "id": "00000000-0000-0000-0000-000000000000",
  "replyTo": null,
  "questionnaire": null,
  "section": null,
  "question": null,
  "ragCollection": "00000000-0000-0000-0000-000000000000",
  "ragItem": "00000000-0000-0000-0000-000000000000",
  "targetId": "00000000-0000-0000-0000-000000000000",
  "targetType": "Question",
  "targetNum": 1,
  "author": {
    "id": "user123",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "login": "johndoe",
    "ra": true
  },
  "text": "Contenu du nouveau message",
  "created": "2025-01-15T10:30:00Z",
  "updated": "2025-01-15T10:30:00Z",
  "replies": 0
}
```

---

#### POST /questionnaire/rag/message

**Résumé :** Mettre à jour un message existant

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| c | query | string (uuid) | Oui | ID de la collection RAG. |
| id | query | string (uuid) | Oui | ID du message. |

**Corps de la requête :**
```json
{
  "text": "Contenu du message mis à jour"
}
```

**Réponse (200) :**
```json
{
  "id": "00000000-0000-0000-0000-000000000000",
  "replyTo": null,
  "questionnaire": null,
  "section": null,
  "question": null,
  "ragCollection": "00000000-0000-0000-0000-000000000000",
  "ragItem": "00000000-0000-0000-0000-000000000000",
  "targetId": "00000000-0000-0000-0000-000000000000",
  "targetType": "Question",
  "targetNum": 1,
  "author": {
    "id": "user123",
    "name": "John Doe",
    "email": "john.doe@example.com",
    "login": "johndoe",
    "ra": true
  },
  "text": "Contenu du message mis à jour",
  "created": "2025-01-15T10:30:00Z",
  "updated": "2025-01-15T10:45:00Z",
  "replies": 0
}
```

#### DELETE /questionnaire/rag/message

**Résumé :** Supprimer un message existant

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| id | query | string (uuid) | Oui | ID du message. |

**Réponse (200) :**
```json
{}
```

---

### RagFaq

#### GET /questionnaire/rag/faq-collections/summary

**Résumé :** Résumé pour la page d’accueil

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| proj | query | string (uuid) | Non | ID du projet. |

**Réponse (200) :**
```json
{
  "active": 3
}
```

---

#### GET /questionnaire/rag/faq-collections/total

**Résumé :** Nombre de collections FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| q | query | string | Non | Filtre sur le nom ou le code de la collection. |
| state | query | array | Non | Filtre sur les états. |
| project | query | array | Non | Filtre sur les projets. |

**Réponse (200) :**
```json
3
```

---

#### GET /questionnaire/rag/faq-collections/list

**Résumé :** Obtenir la liste des collections FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| q | query | string | Non | Filtre sur le nom ou le code de la collection. |
| state | query | array | Non | Filtre sur les états. |
| project | query | array | Non | Filtre sur les projets. |
| s | query | string | Non | Champ de tri. |
| asc | query | boolean | Non | Tri ascendant. |
| ps | query | integer (int32) | Non | Taille de page. |
| p | query | integer (int32) | Non | Numéro de page (à partir de 1). |

**Réponse (200) :**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 3,
    "totalPages": 1
  },
  "items": [
    {
      "code": "FAQ-001",
      "org": "00000000-0000-0000-0000-000000000000",
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "Collection FAQ",
      "description": "Description de la collection FAQ",
      "documentTypes": null,
      "size": 5,
      "revision": null,
      "type": "Faq",
      "state": "Active",
      "projects": null,
      "items": null,
      "isShared": false
    }
  ]
}
```

---

#### GET /questionnaire/rag/faq-collections/find-items

**Résumé :** Trouver des éléments FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| q | query | string | Oui | Filtre sur la question. |
| project | query | string (uuid) | Non | Filtre sur le projet. |
| ps | query | integer (int32) | Non | Taille de page. |
| p | query | integer (int32) | Non | Numéro de page (à partir de 1). |

**Réponse (200) :**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 5,
    "totalPages": 1
  },
  "items": [
    {
      "index": 0,
      "question": "Quel est ce produit ?",
      "answer": "C’est un excellent produit.",
      "comment": "FAQ produit",
      "state": "Active"
    }
  ]
}
```

---

#### POST /questionnaire/rag/faq-collection/create

**Résumé :** Créer une nouvelle collection FAQ.

**Corps de la requête (multipart/form-data) :**
```json
{
  "code": "FAQ-001",
  "name": "Collection FAQ",
  "description": "Description de la collection FAQ",
  "content": "Contenu ici",
  "file": "binary"
}
```

**Réponse (200) :**
```json
{
  "code": "FAQ-001",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Collection FAQ",
  "description": "Description de la collection FAQ",
  "documentTypes": null,
  "size": 5,
  "revision": null,
  "type": "Faq",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

#### POST /questionnaire/rag/faq-collection

**Résumé :** Mettre à jour les métadonnées d’une collection FAQ.

**Corps de la requête :**
```json
{
  "code": "FAQ-001",
  "name": "Collection FAQ mise à jour",
  "description": "Description mise à jour",
  "projects": null,
  "documentTypes": null,
  "isShared": false,
  "state": "Active"
}
```

#### DELETE /questionnaire/rag/faq-collection

**Résumé :** Supprimer une collection FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |

#### GET /questionnaire/rag/faq-collection

**Résumé :** Obtenir une collection FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |

**Réponse (200) :**
```json
{
  "code": "FAQ-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Collection FAQ",
  "description": "Description de la collection FAQ",
  "documentTypes": null,
  "size": 5,
  "revision": null,
  "type": "Faq",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

#### GET /questionnaire/rag/faq-collection/check

**Résumé :** Vérifier l’existence d’une collection FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |

**Réponse (200) :**
```json
true
```

---

#### GET /questionnaire/rag/faq-collection/items-total

**Résumé :** Nombre d’éléments FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |
| q | query | string | Non | Filtre sur le contenu de l’élément FAQ. |

**Corps de la requête :**
```json
["Active", "Default"]
```

**Réponse (200) :**
```json
5
```

---

#### GET /questionnaire/rag/faq-collection/items

**Résumé :** Obtenir la liste des éléments FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |
| q | query | string | Non | Filtre sur le contenu de l’élément FAQ. |
| state | query | array | Non | Filtre sur les états. |
| s | query | string | Non | Champ de tri. |
| asc | query | boolean | Non | Tri ascendant. |
| ps | query | integer (int32) | Non | Taille de page. |
| p | query | integer (int32) | Non | Numéro de page (à partir de 1). |

**Réponse (200) :**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 5,
    "totalPages": 1
  },
  "items": [
    {
      "index": 0,
      "question": "Quel est ce produit ?",
      "answer": "C’est un excellent produit.",
      "comment": "FAQ produit",
      "state": "Active"
    }
  ]
}
```

---

#### POST /questionnaire/rag/faq-collection/item/create

**Résumé :** Créer un nouvel élément FAQ.

**Corps de la requête :**
```json
{
  "code": "FAQ-001",
  "index": 0,
  "question": "Quel est ce produit ?",
  "answer": "C’est un excellent produit.",
  "comment": "FAQ produit",
  "state": "Active"
}
```

**Réponse (200) :**
```json
{
  "index": 0,
  "question": "Quel est ce produit ?",
  "answer": "C’est un excellent produit.",
  "comment": "FAQ produit",
  "state": "Active"
}
```

---

#### GET /questionnaire/rag/faq-collection/item

**Résumé :** Obtenir un élément FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |
| index | query | integer (int32) | Oui | Index (base zéro) de l’élément FAQ dans la collection. |

**Réponse (200) :**
```json
{
  "index": 0,
  "question": "Quel est ce produit ?",
  "answer": "C’est un excellent produit.",
  "comment": "FAQ produit",
  "state": "Active"
}
```

#### POST /questionnaire/rag/faq-collection/item

**Résumé :** Mettre à jour un élément FAQ.

**Corps de la requête :**
```json
{
  "code": "FAQ-001",
  "index": 0,
  "newIndex": 1,
  "question": "Question mise à jour ?",
  "answer": "Réponse mise à jour.",
  "comment": "Commentaire mis à jour",
  "state": "Active"
}
```

#### DELETE /questionnaire/rag/faq-collection/item

**Résumé :** Supprimer un élément FAQ.

**Paramètres :**
| Nom | Dans | Type | Obligatoire | Description |
|------|------|------|-------------|-------------|
| code | query | string | Oui | Code de la collection. |
| index | query | integer (int32) | Oui | Index (base zéro) de l’élément FAQ dans la collection. |

---

### RagQuery

#### POST /questionnaire/rag/query

**Résumé :** Effectuer une requête dans la base de connaissances RAG

**Corps de la requête :**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "excludeCollections": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "question": "Quel est ce produit ?",
  "yourCompanyName": "Acme Corp",
  "yourCompanyAlias": "Acme",
  "customerName": "John Doe",
  "options": [
    "option1",
    "option2"
  ],
  "multiselect": false,
  "nArticles": 5,
  "nFaqs": 3,
  "threshold": 0.5,
  "debug": false,
  "withJustification": true,
  "withConfidenceLevel": true,
  "withFragments": true,
  "nAttempts": 3
}
```

**Réponse (200) :**
```json
{
  "attempt": 1,
  "preparedQuery": {
    "original": "Quel est ce produit ?",
    "enhanced": "Quel est ce produit et ses caractéristiques ?"
  },
  "ragItems": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "distance": 0.25
    }
  ],
  "question": "Quel est ce produit ?",
  "generalInstructions": "En se basant sur la base de connaissances, voici la réponse :",
  "text": "Ce produit est une excellente solution pour vos besoins.",
  "explanation": "La réponse a été trouvée dans plusieurs sources avec une forte confiance."
}
```

---

#### POST /questionnaire/rag/query-stream

**Résumé :** Effectuer une requête dans la base de connaissances RAG (flux)

**Corps de la requête :**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "excludeCollections": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "question": "Quel est ce produit ?",
  "yourCompanyName": "Acme Corp",
  "yourCompanyAlias": "Acme",
  "customerName": "John Doe",
  "options": [
    "option1",
    "option2"
  ],
  "multiselect": false,
  "nArticles": 5,
  "nFaqs": 3,
  "threshold": 0.5,
  "debug": false,
  "withJustification": true,
  "withConfidenceLevel": true,
  "withFragments": true,
  "nAttempts": 3
}
```

**Réponse (200) :**
```json
[
  {
    "text": "Ce produit est une excellente solution",
    "fragments": [
      {
        "id": "00000000-0000-0000-0000-000000000000",
        "part": 1,
        "distance": 0.25,
        "type": "Article",
        "code": "ART-001",
        "title": "Titre du produit",
        "fragment": "Fragment de contenu du produit"
      }
    ]
  },
  {
    "text": " pour vos besoins.",
    "fragments": []
  }
]
```

---

#### POST /questionnaire/rag/query-fragments

**Résumé :** Effectuer une requête dans la base de connaissances RAG (fragments)

**Corps de la requête :**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "exclude_documents": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "query": "Quel est ce produit ?",
  "top_k": 5,
  "similarity_threshold": 0.5,
  "prepare_query": true
}
```

**Réponse (200) :**
```json
{
  "results": [
    {
      "document_id": "00000000-0000-0000-0000-000000000000",
      "document_code": "ART-001",
      "document_title": "Titre du produit",
      "revision": 3,
      "chunk_index": 0,
      "content": "Fragment de contenu du produit",
      "metadata": {
        "author": "John Doe",
        "created_at": "2025-01-15T10:30:00Z",
        "last_updated_at": "2025-01-15T10:35:00Z",
        "doc_categories": [
          "Produit",
          "Information"
        ]
      },
      "similarity_score": 0.85
    }
  ]
}
```

## Articles associés

- [Jetons API – Génération & Gestion](/api-tokens/) – comment créer et gérer les jetons  
- [Interroger l’IA avec votre base de connaissances](/ask-ai-with-your-knowledge-base/) – utilisation des requêtes RAG