Votre première optimisation de tournée

En cinq minutes environ, vous allez envoyer trois arrêts de livraison à l'API d'optimisation de tournées Otiggo et lire l'ordre de visite optimal, la distance, la durée et l'heure d'arrivée à chaque arrêt. Tout se passe avec une clé sandbox gratuite : rien n'est débité.

1. Créer une clé sandbox gratuite

Ouvrez la console et créez une clé de test. Elle commence par otg_test_ et n'est affichée qu'une fois : copiez-la tout de suite.

2. Stocker la clé dans une variable d'environnement

export OTIGGO_API_KEY="otg_test_..."

Ne mettez jamais une clé dans votre code source ni dans une application mobile : appelez l'API depuis votre backend.

3. Écrire et lancer le script

La requête demande un point de départ start et au moins deux stops, chacun avec un id unique. L'arrêt A a une deadline à 10:30 et 2 minutes de temps de service : l'API planifie en tenant compte des deux.

// optimize.mjs — Node 18+ (built-in fetch), no dependency
const API_KEY = process.env.OTIGGO_API_KEY; // otg_test_...

const res = await fetch("https://app.otiggo.com/api/v1/optimize", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    start: { latitude: 48.8566, longitude: 2.3522 },
    stops: [
      { id: "A", latitude: 48.8738, longitude: 2.295, deadline: "10:30", serviceSeconds: 120 },
      { id: "B", latitude: 48.8606, longitude: 2.3376 },
      { id: "C", latitude: 48.853, longitude: 2.3499 },
    ],
  }),
});

const data = await res.json();
if (!res.ok) {
  console.error(res.status, data.error, data.message);
  process.exit(1);
}

console.log("Order:", data.order.join(" -> "));
console.log(data.totalDistanceKm + " km, " + data.estimatedTimeMin + " min");
for (const { colisId, arrivee } of data.schedule ?? []) {
  console.log(colisId, "arrives at", arrivee);
}
if (data.lateStops) console.warn("Late stops:", data.lateStops);
node optimize.mjs
# ou
python optimize.py

4. Lire le résultat

La sortie ressemble à ceci (les distances et horaires varient) :

Exemple de sortie
Order: A -> B -> C
6.1 km, 32 min
A arrives at 2026-10-20T05:40:00Z
B arrives at 2026-10-20T05:52:00Z
C arrives at 2026-10-20T05:58:00Z
  • order — vos identifiants d'arrêts dans l'ordre de visite optimal.
  • schedule — l'heure d'arrivée estimée à chaque arrêt.
  • lateStops — les arrêts qui arriveraient après leur deadline (sinon null).
  • stopsCharged — 0 en sandbox ; le nombre d'arrêts débités avec une clé live.

5. En cas de problème

  • 401 unauthorized — clé absente, invalide ou révoquée.
  • 400 invalid_request — le message désigne le champ fautif (par exemple stops[1].id).
  • 400 sandbox_addresses_unsupported — utilisez des coordonnées avec une clé de test.
  • 429 sandbox_rate_limited — attendez le délai indiqué par Retry-After.

Tous les codes d'erreur sont listés sur la page Erreurs.

6. Passer en production

  1. Achetez un pack de stops : la clé live (otg_live_…) vous est envoyée par email après paiement. Prépayé, sans abonnement, et un appel en échec n'est jamais débité.
  2. Remplacez la clé. Vous pouvez désormais envoyer jusqu'à 200 arrêts par appel et fournir des adresses complètes (street, postalCode, city) au lieu de coordonnées ; elles sont géocodées pour vous.
  3. Consultez votre solde à tout moment avec GET /balance.