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

# Lister & consulter les tâches

> GET /api/v1/tasks — Lister vos tâches avec pagination curseur.

## Lister les tâches

```
GET https://dloopiq.onrender.com/api/v1/tasks
Authorization: Bearer <jwt_acheteur>
```

### Paramètres de requête

| Paramètre   | Type   | Description                                                         |
| ----------- | ------ | ------------------------------------------------------------------- |
| `status`    | string | Filtrer par statut : `PENDING`, `VALIDATING`, `COMPLETED`, `FAILED` |
| `type`      | string | Filtrer par type : `SENTIMENT_ANALYSIS`, etc.                       |
| `projectId` | string | Filtrer par projet                                                  |
| `locale`    | string | Filtrer par langue                                                  |
| `limit`     | number | Nombre de résultats par page (défaut: 20, max: 100)                 |
| `cursor`    | string | Curseur de pagination (valeur `nextCursor` de la page précédente)   |

### Exemple

```bash theme={null}
# Première page — tâches complétées
curl "https://dloopiq.onrender.com/api/v1/tasks?status=COMPLETED&limit=20" \
  -H "Authorization: Bearer eyJhbGci..."
```

### Réponse

```json theme={null}
{
  "tasks": [
    {
      "id": "cmpkb4ghw00016qduu44p7n2q",
      "type": "SENTIMENT_ANALYSIS",
      "content": "Ce produit est fantastique !",
      "options": ["Positif", "Négatif", "Neutre"],
      "status": "COMPLETED",
      "result": "Positif",
      "confidence": 0.87,
      "locale": "fr",
      "costCents": 20,
      "totalResponses": 3,
      "createdAt": "2026-05-25T10:00:00Z",
      "validatedAt": "2026-05-25T10:05:00Z"
    }
  ],
  "nextCursor": "cmpkb4ghw00016qduu44p7n2r",
  "hasMore": true
}
```

### Pagination curseur

```typescript theme={null}
async function getAllCompletedTasks() {
  const tasks = []
  let cursor: string | null = null

  do {
    const url = new URL('https://dloopiq.onrender.com/api/v1/tasks')
    url.searchParams.set('status', 'COMPLETED')
    url.searchParams.set('limit', '100')
    if (cursor) url.searchParams.set('cursor', cursor)

    const res = await fetch(url, {
      headers: { 'Authorization': `Bearer ${JWT}` }
    })
    const data = await res.json()

    tasks.push(...data.tasks)
    cursor = data.nextCursor
  } while (cursor)

  return tasks
}
```

***

## Consulter une tâche

```
GET https://dloopiq.onrender.com/api/v1/tasks/:id
Authorization: Bearer <jwt_acheteur>
```

```bash theme={null}
curl "https://dloopiq.onrender.com/api/v1/tasks/cmpkb4ghw00016qduu44p7n2q" \
  -H "Authorization: Bearer eyJhbGci..."
```

### Réponse complète

```json theme={null}
{
  "id": "cmpkb4ghw00016qduu44p7n2q",
  "type": "SENTIMENT_ANALYSIS",
  "content": "Ce produit est fantastique !",
  "options": ["Positif", "Négatif", "Neutre"],
  "status": "COMPLETED",
  "result": "Positif",
  "confidence": 0.87,
  "locale": "fr",
  "costCents": 20,
  "responses": [
    { "answer": "Positif", "timeSpentMs": 3200 },
    { "answer": "Positif", "timeSpentMs": 2100 },
    { "answer": "Neutre",  "timeSpentMs": 4500 }
  ],
  "totalResponses": 3,
  "validationsNeeded": 3,
  "createdAt": "2026-05-25T10:00:00Z",
  "validatedAt": "2026-05-25T10:05:00Z"
}
```

***

## Mettre à jour une tâche

```
PATCH https://dloopiq.onrender.com/api/v1/tasks/:id
Authorization: Bearer <jwt_acheteur>
Content-Type: application/json
```

Seules les tâches en statut `PENDING` peuvent être modifiées.

```bash theme={null}
curl -X PATCH "https://dloopiq.onrender.com/api/v1/tasks/cmpkb4ghw00016qduu44p7n2q" \
  -H "Authorization: Bearer eyJhbGci..." \
  -H "Content-Type: application/json" \
  -d '{
    "maxCents": 30,
    "validationsNeeded": 5
  }'
```

***

## Erreurs courantes

| Code               | HTTP | Description                                       |
| ------------------ | ---- | ------------------------------------------------- |
| `TASK_NOT_FOUND`   | 404  | ID introuvable ou n'appartient pas à votre compte |
| `UNAUTHORIZED`     | 401  | JWT manquant ou expiré                            |
| `TASK_NOT_PENDING` | 400  | Tentative de modification d'une tâche non-PENDING |
