
# Referință API REST Procurize.AI

**Accesează programatic baza ta de cunoștințe – documente, chestionare, RAG și rapoarte – utilizând token-ul tău API.**

> **Se aplică la:** API Procurize.AI v1  
> **Autentificare:** Cheie API prin antetul `X-API-Key` (vezi [Token-uri API](/api-tokens/) pentru gestionarea token-urilor)  
> **URL de bază:** `https://api.procurize.com`

## Prezentare generală

API-ul REST Procurize.AI oferă acces programatic la funcționalitățile cheie ale platformei. Îți permite să integrezi Procurize.AI cu sistemele interne, să automatizezi gestionarea bazei de cunoștințe și să construiești fluxuri de lucru personalizate.

**Module suportate (autentificate prin token):**

- [**RagArticle**](#ragarticle) – gestionare documente
- [**RagFaq**](#ragfaq) – gestionare intrări FAQ
- [**RagQuery**](#ragquery) – executare interogări RAG

## Autentificare

Toate punctele finale autentificate necesită un token API transmis în antetul cererii.

| Antet | Valoare |
|-------|---------|
| `X-API-Key` | `<YOUR_API_TOKEN>` |

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

> 💡 Token-urile sunt legate de organizația ta – nu este necesar să specifici un ID de organizație în cerere .

## URL de bază

Toate punctele finale ale API-ului REST sunt disponibile la:
```
https://api.procurize.com
```

## Gestionarea erorilor

API-ul folosește coduri de stare HTTP standard.

| Cod | Semnificație |
|-----|--------------|
| `200 OK` | Cerere cu succes |
| `201 Created` | Resursă creată cu succes |
| `204 No Content` | Cerere cu succes, fără corp de răspuns |
| `400 Bad Request` | Parametri invalizi sau cerere malformată |
| `401 Unauthorized` | Token API lipsă sau invalid |
| `403 Forbidden` | Token-ul nu are permisiunea pentru această acțiune |
| `404 Not Found` | Resursă inexistentă |
| `500 Internal Server Error` | Eroare internă a serverului |

Răspunsurile de eroare includ un cod de eroare citibil de mașină și un mesaj citibil de om.

## Referință module

### RagArticle

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

**Rezumat:** Rezumat pentru pagina principală

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| proj | query | string (uuid) | Nu | ID-ul proiectului. |

**Răspuns (200):**
```json
{
  "active": 5
}
```

---

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

**Rezumat:** Număr de articole

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| q | query | string | Nu | Filtru pe numele sau codul articolului. |
| state | query | array | Nu | Filtru pe stări. |
| project | query | array | Nu | Filtru pe proiecte. |
| type | query | array | Nu | Filtru pe tipuri de documente. |

**Răspuns (200):**
```json
42
```

---

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

**Rezumat:** Obține lista de articole

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| q | query | string | Nu | Filtru pe numele sau codul articolului. |
| state | query | array | Nu | Filtru pe stări. |
| project | query | array | Nu | Filtru pe proiecte. |
| type | query | array | Nu | Filtru pe tipuri de documente. |
| s | query | string | Nu | Câmp de sortare. |
| asc | query | boolean | Nu | Sortare ascendentă. |
| ps | query | integer (int32) | Nu | Dimensiunea paginii. |
| p | query | integer (int32) | Nu | Număr de pagină (începând de la 1). |

**Răspuns (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": "Titlu Articol",
      "description": "Descriere articol",
      "documentTypes": [
        {
          "id": "00000000-0000-0000-0000-000000000000",
          "name": "Nume Tip",
          "plural": "Nume Tipuri",
          "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": "Analysis completed successfully",
          "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

**Rezumat:** Returnează conținutul Markdown din fișier

**Corp cerere (multipart/form-data):**
```json
{
  "url": "https://example.com/file.pdf",
  "file": "binary"
}
```

**Răspuns (200):**
```json
"Markdown content from file"
```

---

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

**Rezumat:** Creare articol

**Corp cerere (multipart/form-data):**
```json
{
  "code": "ART-001",
  "name": "Titlu Articol",
  "description": "Descriere articol",
  "content": "# Conținut Articol\n\nAcesta este conținutul articolului.",
  "url": "https://example.com/file.pdf",
  "file": "binary"
}
```

**Răspuns (200):**
```json
{
  "code": "ART-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Titlu Articol",
  "description": "Descriere articol",
  "documentTypes": null,
  "size": 150,
  "revision": null,
  "type": "Article",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

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

**Rezumat:** Verifică existența articolului.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

**Răspuns (200):**
```json
true
```

---

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

**Rezumat:** Obține informații despre articol prin cod.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

**Răspuns (200):**
```json
{
  "code": "ART-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Titlu Articol",
  "description": "Descriere articol",
  "documentTypes": null,
  "size": 150,
  "revision": null,
  "type": "Article",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

#### GET /questionnaire/rag/article

**Rezumat:** Obține conținutul articolului prin cod

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |
| format | query | string | Nu | Dacă este true, returnează conținut HTML în corpul răspunsului. În caz contrar, returnează conținutul articolului în format Markdown. |
| split | query | boolean | Nu | Dacă este true, returnează conținutul separat pe elemente RAG. |
| css | query | boolean | Nu | Dacă este true, returnează conținutul HTML/PDF cu CSS. |

**Răspuns (200):**
```json
"# Titlu Articol\n\nAcesta este conținutul articolului în format Markdown."
```

#### POST /questionnaire/rag/article

**Rezumat:** Actualizează metadatele articolului

**Corp cerere:**
```json
{
  "code": "ART-001",
  "name": "Titlu Articol Actualizat",
  "description": "Descriere actualizată",
  "projects": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "documentTypes": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "Nume Tip",
      "plural": "Nume Tipuri"
    }
  ],
  "isShared": true,
  "state": "Active"
}
```

**Răspuns (200):**
```json
{}
```

#### DELETE /questionnaire/rag/article

**Rezumat:** Șterge articol

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

---

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

**Rezumat:** Obține articolul ca PDF prin cod

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

**Răspuns (200):**
```json
(pdf binary)
```

---

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

**Rezumat:** Obține conținutul articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

**Răspuns (200):**
```json
{
  "content": "# Titlu Articol\n\nConținut aici."
}
```

---

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

**Rezumat:** Actualizează conținutul articolului

**Corp cerere (multipart/form-data):**
```json
{
  "code": "ART-001",
  "content": "# Conținut Actualizat",
  "file": "binary"
}
```

---

#### POST /questionnaire/rag/plural

**Rezumat:** Obține forma de plural a substantivului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| noun | query | string | Nu | Substantivul de pluralizat. |

**Răspuns (200):**
```json
{
  "plural": "Articole"
}
```

---

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

**Rezumat:** Analizează articolul cu AI și returnează tipurile acestuia

**Corp cerere (multipart/form-data):**
```json
{
  "code": "ART-001",
  "content": "# Conținut Articol"
}
```

**Răspuns (200):**
```json
[
  {
    "plural": "Tipuri"
  }
]
```

---

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

**Rezumat:** Formatează conținutul articolului cu AI

**Corp cerere (multipart/form-data):**
```json
{
  "code": "ART-001",
  "content": "# Conținut Articol"
}
```

**Răspuns (200):**
```json
{
  "formattedContent": "# Conținut Articol Formatat"
}
```

---

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

**Rezumat:** Îmbunătățește documentul pe baza sugestiilor

**Corp cerere (multipart/form-data):**
```json
{
  "suggestions": [
    {
      "sectionTitle": "Introducere",
      "suggestion": "Adaugă mai multe detalii aici."
    }
  ],
  "code": "ART-001",
  "content": "# Conținut Articol"
}
```

**Răspuns (200):**
```json
{
  "improvedContent": "# Conținut Îmbunătățit"
}
```

---

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

**Rezumat:** Returnează lista de părți ale articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | query | array | Da | Listă de părți ale articolului. |

**Răspuns (200):**
```json
[
  {
    "id": "00000000-0000-0000-0000-000000000000",
    "code": "part-1",
    "title": "Introducere",
    "orderNumber": 1,
    "content": "Conținut introducere."
  }
]
```

---

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

**Rezumat:** Returnează lista de revizii ale articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |

**Răspuns (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": "Analysis completed",
      "operationId": "op-12345"
    }
  }
]
```

---

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

**Rezumat:** Obține informații despre revizia articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | path | string (uuid) | Da | ID-ul reviziei. |

**Răspuns (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": "Analysis completed",
    "operationId": "op-12345"
  }
}
```

---

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

**Rezumat:** Obține conținutul reviziei articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | path | string (uuid) | Da | ID-ul reviziei. |

**Răspuns (200):**
```json
"# Conținut Revizie Articol\n\nVersiunea anterioară."
```

---

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

**Rezumat:** Analizează conținutul articolului cu AI

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul articolului. |
| rev | query | integer (int32) | Nu | Numărul reviziei. |
| force | query | boolean | Nu | Forțează crearea unei noi analize și șterge rezultatul incomplet anterior, dacă există. |

**Răspuns (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": "Analysis completed",
  "operationId": "op-12345"
}
```

---

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

**Rezumat:** Obține rezultatul analizei articolului

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | path | string (uuid) | Da | ID-ul analizei. |

**Răspuns (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": "Analysis completed",
  "operationId": "op-12345",
  "fragments": [
    "fragment-1",
    "fragment-2"
  ],
  "ownInconcies": "Inconsecvențe proprii găsite",
  "ragInconcies": "Inconsecvențe RAG găsite",
  "proposals": "Propuneri de îmbunătățire"
}
```

---

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

**Rezumat:** Listează toate mesajele

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | query | string (uuid) | Da | ID-ul colecției RAG. |
| item | query | string (uuid) | Nu | ID-ul elementului RAG. |
| message | query | string (uuid) | Nu | ID-ul mesajului. |
| asc | query | boolean | Nu | Sortare ascendentă. |
| ps | query | integer (int32) | Nu | Dimensiunea paginii. |
| p | query | integer (int32) | Nu | Număr de pagină (începând de la 1). |

**Răspuns (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": "Conținut mesaj",
      "created": "2025-01-15T10:30:00Z",
      "updated": "2025-01-15T10:30:00Z",
      "replies": 0
    }
  ]
}
```

---

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

**Rezumat:** Adaugă un mesaj nou

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | query | string (uuid) | Da | ID-ul colecției RAG. |
| item | query | string (uuid) | Nu | ID-ul elementului RAG. |
| message | query | string (uuid) | Nu | ID-ul mesajului la care se răspunde. |

**Corp cerere:**
```json
{
  "text": "Conținut mesaj nou"
}
```

**Răspuns (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": "Conținut mesaj nou",
  "created": "2025-01-15T10:30:00Z",
  "updated": "2025-01-15T10:30:00Z",
  "replies": 0
}
```

---

#### POST /questionnaire/rag/message

**Rezumat:** Actualizează mesajul existent

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| c | query | string (uuid) | Da | ID-ul colecției RAG. |
| id | query | string (uuid) | Da | ID-ul mesajului. |

**Corp cerere:**
```json
{
  "text": "Conținut mesaj actualizat"
}
```

**Răspuns (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": "Conținut mesaj actualizat",
  "created": "2025-01-15T10:30:00Z",
  "updated": "2025-01-15T10:45:00Z",
  "replies": 0
}
```

#### DELETE /questionnaire/rag/message

**Rezumat:** Șterge mesajul existent

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| id | query | string (uuid) | Da | ID-ul mesajului. |

**Răspuns (200):**
```json
{}
```

---

### RagFaq

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

**Rezumat:** Rezumat pentru pagina principală

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| proj | query | string (uuid) | Nu | ID-ul proiectului. |

**Răspuns (200):**
```json
{
  "active": 3
}
```

---

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

**Rezumat:** Număr de colecții FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| q | query | string | Nu | Filtru pe numele sau codul colecției. |
| state | query | array | Nu | Filtru pe stări. |
| project | query | array | Nu | Filtru pe proiecte. |

**Răspuns (200):**
```json
3
```

---

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

**Rezumat:** Obține lista de colecții FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| q | query | string | Nu | Filtru pe numele sau codul colecției. |
| state | query | array | Nu | Filtru pe stări. |
| project | query | array | Nu | Filtru pe proiecte. |
| s | query | string | Nu | Câmp de sortare. |
| asc | query | boolean | Nu | Sortare ascendentă. |
| ps | query | integer (int32) | Nu | Dimensiunea paginii. |
| p | query | integer (int32) | Nu | Număr de pagină (începând de la 1). |

**Răspuns (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": "Colecție FAQ",
      "description": "Descriere colecție FAQ",
      "documentTypes": null,
      "size": 5,
      "revision": null,
      "type": "Faq",
      "state": "Active",
      "projects": null,
      "items": null,
      "isShared": false
    }
  ]
}
```

---

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

**Rezumat:** Găsește elemente FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| q | query | string | Da | Filtru pe întrebare. |
| project | query | string (uuid) | Nu | Filtru pe proiect. |
| ps | query | integer (int32) | Nu | Dimensiunea paginii. |
| p | query | integer (int32) | Nu | Număr de pagină (începând de la 1). |

**Răspuns (200):**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 5,
    "totalPages": 1
  },
  "items": [
    {
      "index": 0,
      "question": "Ce este acest produs?",
      "answer": "Acesta este un produs excelent.",
      "comment": "FAQ produs",
      "state": "Active"
    }
  ]
}
```

---

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

**Rezumat:** Creare colecție FAQ nouă.

**Corp cerere (multipart/form-data):**
```json
{
  "code": "FAQ-001",
  "name": "Colecție FAQ",
  "description": "Descriere colecție FAQ",
  "content": "Conținut aici",
  "file": "binary"
}
```

**Răspuns (200):**
```json
{
  "code": "FAQ-001",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Colecție FAQ",
  "description": "Descriere colecție FAQ",
  "documentTypes": null,
  "size": 5,
  "revision": null,
  "type": "Faq",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

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

**Rezumat:** Actualizează metadatele colecției FAQ.

**Corp cerere:**
```json
{
  "code": "FAQ-001",
  "name": "Colecție FAQ Actualizată",
  "description": "Descriere actualizată",
  "projects": null,
  "documentTypes": null,
  "isShared": false,
  "state": "Active"
}
```

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

**Rezumat:** Șterge colecția FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |

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

**Rezumat:** Obține colecția FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |

**Răspuns (200):**
```json
{
  "code": "FAQ-001",
  "org": "00000000-0000-0000-0000-000000000000",
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "Colecție FAQ",
  "description": "Descriere colecție FAQ",
  "documentTypes": null,
  "size": 5,
  "revision": null,
  "type": "Faq",
  "state": "Active",
  "projects": null,
  "items": null,
  "isShared": false
}
```

---

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

**Rezumat:** Verifică existența colecției FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |

**Răspuns (200):**
```json
true
```

---

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

**Rezumat:** Număr de elemente FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |
| q | query | string | Nu | Filtru pe conținutul elementului FAQ. |

**Corp cerere:**
```json
["Active", "Default"]
```

**Răspuns (200):**
```json
5
```

---

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

**Rezumat:** Obține lista de elemente FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |
| q | query | string | Nu | Filtru pe conținutul elementului FAQ. |
| state | query | array | Nu | Filtru pe stări. |
| s | query | string | Nu | Câmp de sortare. |
| asc | query | boolean | Nu | Sortare ascendentă. |
| ps | query | integer (int32) | Nu | Dimensiunea paginii. |
| p | query | integer (int32) | Nu | Număr de pagină (începând de la 1). |

**Răspuns (200):**
```json
{
  "paging": {
    "pageNumber": 1,
    "pageSize": 10,
    "total": 5,
    "totalPages": 1
  },
  "items": [
    {
      "index": 0,
      "question": "Ce este acest produs?",
      "answer": "Acesta este un produs excelent.",
      "comment": "FAQ produs",
      "state": "Active"
    }
  ]
}
```

---

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

**Rezumat:** Creare element FAQ nou.

**Corp cerere:**
```json
{
  "code": "FAQ-001",
  "index": 0,
  "question": "Ce este acest produs?",
  "answer": "Acesta este un produs excelent.",
  "comment": "FAQ produs",
  "state": "Active"
}
```

**Răspuns (200):**
```json
{
  "index": 0,
  "question": "Ce este acest produs?",
  "answer": "Acesta este un produs excelent.",
  "comment": "FAQ produs",
  "state": "Active"
}
```

---

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

**Rezumat:** Obține element FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |
| index | query | integer (int32) | Da | Index zero‑based al elementului FAQ în colecție. |

**Răspuns (200):**
```json
{
  "index": 0,
  "question": "Ce este acest produs?",
  "answer": "Acesta este un produs excelent.",
  "comment": "FAQ produs",
  "state": "Active"
}
```

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

**Rezumat:** Actualizează element FAQ.

**Corp cerere:**
```json
{
  "code": "FAQ-001",
  "index": 0,
  "newIndex": 1,
  "question": "Întrebare actualizată?",
  "answer": "Răspuns actualizat.",
  "comment": "Comentariu actualizat",
  "state": "Active"
}
```

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

**Rezumat:** Șterge element FAQ.

**Parametri:**
| Nume | În | Tip | Obligatoriu | Descriere |
|------|----|-----|--------------|-----------|
| code | query | string | Da | Codul colecției. |
| index | query | integer (int32) | Da | Index zero‑based al elementului FAQ în colecție. |

---

### RagQuery

#### POST /questionnaire/rag/query

**Rezumat:** Execută interogare în baza de cunoștințe RAG

**Corp cerere:**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "excludeCollections": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "question": "Ce este acest produs?",
  "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ăspuns (200):**
```json
{
  "attempt": 1,
  "preparedQuery": {
    "original": "Ce este acest produs?",
    "enhanced": "Ce este acest produs și caracteristicile sale?"
  },
  "ragItems": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "distance": 0.25
    }
  ],
  "question": "Ce este acest produs?",
  "generalInstructions": "Pe baza bazei de cunoștințe, iată răspunsul:",
  "text": "Acest produs este o soluție excelentă pentru nevoile tale.",
  "explanation": "Răspunsul a fost găsit în multiple surse cu încredere ridicată."
}
```

---

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

**Rezumat:** Execută interogare în baza de cunoștințe RAG (flux)

**Corp cerere:**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "excludeCollections": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "question": "Ce este acest produs?",
  "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ăspuns (200):**
```json
[
  {
    "text": "Acest produs este o soluție excelentă",
    "fragments": [
      {
        "id": "00000000-0000-0000-0000-000000000000",
        "part": 1,
        "distance": 0.25,
        "type": "Article",
        "code": "ART-001",
        "title": "Titlu Produs",
        "fragment": "Fragment conținut produs"
      }
    ]
  },
  {
    "text": " pentru nevoile tale.",
    "fragments": []
  }
]
```

---

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

**Rezumat:** Execută interogare în baza de cunoștințe RAG (fragmente)

**Corp cerere:**
```json
{
  "project": "00000000-0000-0000-0000-000000000000",
  "exclude_documents": [
    "00000000-0000-0000-0000-000000000000"
  ],
  "query": "Ce este acest produs?",
  "top_k": 5,
  "similarity_threshold": 0.5,
  "prepare_query": true
}
```

**Răspuns (200):**
```json
{
  "results": [
    {
      "document_id": "00000000-0000-0000-0000-000000000000",
      "document_code": "ART-001",
      "document_title": "Titlu Produs",
      "revision": 3,
      "chunk_index": 0,
      "content": "Fragment conținut produs",
      "metadata": {
        "author": "John Doe",
        "created_at": "2025-01-15T10:30:00Z",
        "last_updated_at": "2025-01-15T10:35:00Z",
        "doc_categories": [
          "Produs",
          "Informație"
        ]
      },
      "similarity_score": 0.85
    }
  ]
}
```

## Articole conexe

- [Token-uri API – Generare & Management](/api-tokens/) – cum să creezi și să gestionezi token-urile
- [Întreabă AI cu baza ta de cunoștințe](/ask-ai-with-your-knowledge-base/) – utilizarea interogărilor RAG