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

# Import batch CSV

> POST /api/v1/tasks/batch/csv — Importer des tâches depuis un fichier CSV.

## Endpoint

```
POST https://dloopiq.onrender.com/api/v1/tasks/batch/csv
Authorization: Bearer <jwt_acheteur>
Content-Type: multipart/form-data
```

***

## Format CSV

### Colonnes

| Colonne     | Obligatoire | Description                                                 |
| ----------- | ----------- | ----------------------------------------------------------- |
| `type`      | ✅           | Type de tâche (`SENTIMENT_ANALYSIS`, `BINARY_CHOICE`, etc.) |
| `content`   | ✅           | Texte, URL ou contenu de la tâche                           |
| `options`   | ✅           | Options séparées par `\|` (pipe)                            |
| `locale`    | ❌           | Langue (`fr`, `en`, `de`…) — défaut: `en`                   |
| `maxCents`  | ❌           | Budget par tâche en centimes — défaut: `20`                 |
| `projectId` | ❌           | ID d'un projet existant                                     |

### Exemple de fichier

```csv theme={null}
type,content,options,locale,maxCents
SENTIMENT_ANALYSIS,"Ce produit est fantastique !","Positif|Négatif|Neutre",fr,25
BINARY_CHOICE,"Cette image contient-elle de la violence ?","Oui|Non",fr,20
IMAGE_CLASSIFICATION,"https://example.com/chat.jpg","Chat|Chien|Oiseau|Autre",en,20
RELEVANCE_RATING,"Résultat : recette de quiche","1|2|3|4|5",fr,20
AI_RESPONSE_RATING,"Q: Capitale de France ? R: Paris","Excellent|Bon|Moyen|Mauvais",fr,25
```

<Warning>
  Les options sont séparées par des **pipes `|`**, pas des virgules — pour éviter les conflits avec le délimiteur CSV.
</Warning>

***

## Upload

```bash theme={null}
curl -X POST https://dloopiq.onrender.com/api/v1/tasks/batch/csv \
  -H "Authorization: Bearer eyJhbGci..." \
  -F "file=@mes_taches.csv"
```

**Taille maximum du fichier : 5 MB.**

***

## Réponse

```json theme={null}
{
  "created": 5,
  "tasks": [
    {
      "taskId": "cmpkb4ghw00016qduu44p7n2a",
      "type": "SENTIMENT_ANALYSIS",
      "status": "PENDING"
    }
  ],
  "errors": [],
  "totalCostCents": 110
}
```

Si certaines lignes sont invalides, elles sont listées dans `errors` mais les lignes valides sont quand même créées :

```json theme={null}
{
  "created": 4,
  "errors": [
    {
      "row": 3,
      "error": "Type inconnu : INVALID_TYPE"
    }
  ]
}
```

***

## Générer un CSV depuis Python

```python theme={null}
import pandas as pd

tasks = [
    {
        "type": "SENTIMENT_ANALYSIS",
        "content": row["review"],
        "options": "Positif|Négatif|Neutre",
        "locale": "fr",
        "maxCents": 20
    }
    for _, row in df.iterrows()
]

pd.DataFrame(tasks).to_csv("taches.csv", index=False)
```

***

## Générer un CSV depuis Excel

1. Créez un tableau avec les colonnes : `type`, `content`, `options`, `locale`, `maxCents`
2. Remplissez les options avec `|` comme séparateur (ex: `Positif|Négatif|Neutre`)
3. Fichier → Enregistrer sous → CSV UTF-8

<Note>
  Excel utilise parfois `;` comme délimiteur CSV selon les paramètres régionaux. Dans ce cas, utilisez **Enregistrer sous → CSV UTF-8 (délimité par des virgules)**.
</Note>

***

## Règles de parsing

* Encodage attendu : **UTF-8**
* Délimiteur : **virgule** `,`
* Les champs avec des virgules doivent être entourés de **guillemets** `"`
* Les guillemets dans le contenu s'échappent en doublant : `""c'est ""super"""`
* Les lignes vides sont ignorées
* Les fins de ligne Windows `\r\n` sont supportées
