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.