Skip to main content

Endpoint

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

Corps de la requête

{
  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

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

{
  "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.
{
  "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.
{
  "error": "Solde insuffisant. Requis : 200¢, disponible : 150¢",
  "code": "INSUFFICIENT_CREDITS"
}

Bonnes pratiques

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.
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 qui est plus pratique à générer depuis Excel ou pandas.