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

> POST /api/v1/tasks/batch — Créer jusqu'à 1 000 tâches en une seule requête.

## Endpoint

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

***

## Corps de la requête

```typescript theme={null}
{
  tasks: Array<{
    type: TaskType
    content: string
    options: string[]
    locale?: string
    maxCents?: number
    projectId?: string
    validationsNeeded?: number
  }>
}
```

**Limite : 1 000 tâches par requête.**

***

## Exemple

```bash theme={null}
curl -X POST https://dloopiq.onrender.com/api/v1/tasks/batch \
  -H "Authorization: Bearer eyJhbGci..." \
  -H "Content-Type: application/json" \
  -d '{
    "tasks": [
      {
        "type": "SENTIMENT_ANALYSIS",
        "content": "Le produit est excellent !",
        "options": ["Positif", "Négatif", "Neutre"],
        "locale": "fr"
      },
      {
        "type": "BINARY_CHOICE",
        "content": "Cette image est-elle appropriée ?",
        "options": ["Oui", "Non"],
        "locale": "fr"
      },
      {
        "type": "RELEVANCE_RATING",
        "content": "Résultat de recherche : recette de quiche lorraine",
        "options": ["1", "2", "3", "4", "5"],
        "locale": "fr"
      }
    ]
  }'
```

***

## Réponse

```json theme={null}
{
  "created": 3,
  "tasks": [
    {
      "taskId": "cmpkb4ghw00016qduu44p7n2a",
      "type": "SENTIMENT_ANALYSIS",
      "status": "PENDING",
      "costCents": 20
    },
    {
      "taskId": "cmpkb4ghw00016qduu44p7n2b",
      "type": "BINARY_CHOICE",
      "status": "PENDING",
      "costCents": 20
    },
    {
      "taskId": "cmpkb4ghw00016qduu44p7n2c",
      "type": "RELEVANCE_RATING",
      "status": "PENDING",
      "costCents": 20
    }
  ],
  "totalCostCents": 60
}
```

***

## Comportement en cas d'erreur partielle

Si certaines tâches du batch sont invalides, la requête **échoue entièrement** — aucune tâche n'est créée. Vérifiez votre payload avant d'envoyer.

```json theme={null}
{
  "error": "Tâche #2 invalide : options doit contenir au moins 2 éléments",
  "code": "INVALID_TASK",
  "taskIndex": 1
}
```

***

## Vérification du solde

Avant la création, l'API vérifie que votre solde est suffisant pour couvrir `sum(maxCents)` de toutes les tâches.

```json theme={null}
{
  "error": "Solde insuffisant. Requis : 200¢, disponible : 150¢",
  "code": "INSUFFICIENT_CREDITS"
}
```

***

## Bonnes pratiques

<Tip>
  Pour des volumes très importants (10 000+ tâches), découpez en batches de 1 000 et attendez la réponse de chaque batch avant d'envoyer le suivant.
</Tip>

```typescript theme={null}
async function importLargeDataset(tasks: Task[]) {
  const BATCH_SIZE = 1000
  const results = []

  for (let i = 0; i < tasks.length; i += BATCH_SIZE) {
    const batch = tasks.slice(i, i + BATCH_SIZE)
    const response = await fetch('https://dloopiq.onrender.com/api/v1/tasks/batch', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${JWT}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ tasks: batch })
    })
    const data = await response.json()
    results.push(...data.tasks)
    console.log(`Batch ${Math.floor(i / BATCH_SIZE) + 1} : ${data.created} tâches créées`)
  }

  return results
}
```

***

## Préférer CSV pour les gros volumes

Pour les datasets volumineux, utilisez l'[import CSV](/api-reference/tasks-batch-csv) qui est plus pratique à générer depuis Excel ou pandas.
