API Loader4D
Appelez l'optimisation de chargement depuis votre propre ERP, WMS ou système de gestion du transport. Le même moteur de placement que dans le navigateur, derrière une seule requête HTTP.
Ce que vous pouvez faire
Envoyez vos espaces et votre liste de charges en JSON et recevez le plan de placement avec les coordonnées de chaque pièce. Les charges à l'essieu et les articles non placés figurent aussi dans la réponse.
Une optimisation prend quelques secondes. Dans une conception synchrone, une connexion coupée détruit le résultat ; ici vous revenez avec l'identifiant de tâche et vous le récupérez, sans jamais payer deux fois le même calcul.
Les crédits sont calculés par paliers, pas à la pièce. Le moteur dépense le même budget de recherche pour un petit envoi que pour un grand ; une tarification à la pièce pénaliserait les petits appels et rendrait votre facture imprévisible.
Les clés de test renvoient de vrais résultats sans consommer de crédits ; elles sont plafonnées à 25 appels par mois. Testez jusqu’à la fin de votre intégration : passer en production revient à changer de clé.
Points d'accès
L'authentification se fait par un en-tête bearer portant votre clé. Les clés ne sont jamais acceptées dans la chaîne de requête.
Authorization: Bearer l4d_live_...
| Appel | Ce qu’il fait |
|---|---|
| POST /api/v1/pack | Ouvre une tâche de placement ; renvoie 202 et un identifiant de tâche. |
| GET /api/v1/jobs/{id} | Renvoie l'état de la tâche et, une fois terminée, son résultat. |
| GET /api/v1/usage | Renvoie votre quota de la période et les crédits restants. |
Exemple de requête
Les longueurs sont en centimètres et les poids en kilogrammes. Il n'existe pas de réglage d'unité par requête ; convertissez de votre côté. Une requête envoyée en pouces charge un camion dix fois trop long.
POST /api/v1/pack
Authorization: Bearer l4d_test_...
Content-Type: application/json
Idempotency-Key: 7f3c1a9e4b6d4c2f
{
"reference": "SO-2026-4417",
"spaces": [
{ "id": "sp1", "name": "40HC", "type": "container",
"length": 1200, "width": 235, "height": 269,
"max_weight": 26000, "available": 2 }
],
"items": [
{ "id": "A1", "name": "Karton", "length": 120, "width": 100, "height": 40,
"weight": 8, "quantity": 24, "group": "Siparis-1",
"constraints": { "no_tilt": true } },
{ "id": "B1", "name": "Varil", "shape": "cylinder",
"diameter": 58, "length": 88, "weight": 190, "quantity": 12,
"constraints": { "floor_only": true } }
],
"strategy": { "group_items": true, "balance_load": true }
}
La réponse revient immédiatement ; pour le résultat, vous interrogez l'identifiant de tâche.
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/ba7189d3b1824da3806ca3ee973b2294
{ "id": "ba7189d3...", "status": "queued", "progress": 0,
"reference": "SO-2026-4417", "credits": 1 }
Quand la tâche se termine, chaque pièce arrive avec ses coordonnées. L'origine est le coin avant gauche inférieur de l'espace, et la valeur donnée est ce coin de la pièce, non son centre.
{ "id": "ba7189d3...", "status": "succeeded", "credits": 1,
"result": {
"summary": { "spaces_used": 1, "pieces_requested": 36,
"pieces_packed": 36, "weight": 2472,
"volume_utilization": 0.7431 },
"spaces": [
{ "space_id": "sp1", "name": "40HC",
"placements": [
{ "item_id": "A1", "sequence": 1,
"x": 0, "y": 0, "z": 0,
"length": 120, "width": 100, "height": 40, "weight": 8 }
],
"axle_loads": [] }
],
"unpacked": []
} }
Crédits et limites
Les crédits sont décomptés à l'acceptation de la tâche, pas à sa fin. Sinon, cent appels arrivant en même temps passeraient tous le contrôle de quota avant qu'un seul ait été compté.
| Total de pièces dans la requête | Crédits |
|---|---|
| 1 – 100 | 1 |
| 101 – 1 000 | 5 |
| 1 001 – 10 000 | 25 |
| 10 001 et plus | 100 |
- Au plus 50 espaces par requête.
- Au plus 2 000 lignes de charge par requête.
- Au plus 20 000 pièces au total par requête.
- Au plus 10 clés actives par équipe.
Ces limites existent pour qu'un seul appel ne puisse pas occuper le service pendant des minutes. Si votre charge de travail en demande plus, découpez-la ou écrivez-nous.
Questions fréquentes
Avec quel langage puis-je intégrer ?
Avec tout langage capable d'émettre une requête HTTP. Vous pouvez aussi télécharger notre document OpenAPI 3.0 et générer un client typé dans la plupart des langages ; c'est la différence entre une intégration de quelques heures et une de plusieurs jours.
Comment fonctionne la tarification ?
L’API fait partie des formules payantes ; les appels en production nécessitent un pack de crédits, renouvelé à chaque période. Les crédits non utilisés ne sont pas reportés. L’essayer ne coûte aucun crédit : une clé de test autorise 25 appels par mois.
Comment mes clés sont-elles protégées ?
Une clé n'est affichée qu'une fois, à sa création ; seule une empreinte chiffrée est conservée en base. Les clés appartiennent à l'équipe et non à une personne : votre intégration continue de fonctionner même si celui qui l'a mise en place quitte l'équipe. Donnez à chaque intégration sa propre clé ; en cas de soupçon de fuite, vous ne révoquez que celle-là et les autres continuent.
Et si j’envoie deux fois la même requête par erreur ?
Envoyez un en-tête Idempotency-Key avec une valeur que vous générez par requête logique. Une nouvelle tentative avec la même clé et le même corps renvoie la tâche d'origine au lieu d'en ouvrir une seconde. La même clé avec un corps différent est refusée : renvoyer silencieusement la réponse précédente vous laisserait attendre un travail qui n'a jamais été mis en file.
Une tâche interrompue reprend-elle où elle s’est arrêtée ?
Non, et il est juste de le dire clairement. La recherche est un calcul d'un seul tenant et aucun état intermédiaire n'est conservé ; une tâche échouée repart du début. Ce que l'identifiant de tâche vous apporte n'est pas la continuité, mais le fait que le résultat ne soit pas perdu.
Puis-je aussi voir les résultats dans l'interface ?
Les tâches ouvertes via l'API sont indépendantes et ne sont pas ajoutées à votre liste de projets ; le résultat revient directement dans la réponse. Les appels API consomment des crédits et non des sièges : ils n'affectent donc pas les sièges des membres qui utilisent l'interface.